diff --git a/lecture_material/02-repro2/img/clone.png b/lecture_material/02-repro2/img/clone.png new file mode 100644 index 0000000000000000000000000000000000000000..91bae6fc5a6afcf7410881e1f2ded36b7676d06b Binary files /dev/null and b/lecture_material/02-repro2/img/clone.png differ diff --git a/lecture_material/02-repro2/reading.md b/lecture_material/02-repro2/reading.md new file mode 100644 index 0000000000000000000000000000000000000000..c747c2a4b3d27dcbf01c0a24420002df65bbac0e --- /dev/null +++ b/lecture_material/02-repro2/reading.md @@ -0,0 +1,250 @@ +# Reading: Reproducibility 2 + +As data scientists, we want our work to be reproducible. If somebody +else runs our analysis code, they ought to get the same result we got. + +Using different version of the same package can break reproducibility. +If I am using version 1.1.0 of pandas, and you are using version +1.2.0, we might get different results, even if we're running the same +code. Versions of a package are called *releases*. + +**Note:** if you want to try the examples here for yourself, you'll + need to wait until you setup your Linux virtual machine in lab next + week, then use that. + +## Package Releases + +`pip install somepackage` (some systems use `pip3`) will install the +latest version of `somepackage` (unless another version has already +been installed. If you want a specific version, you can run something +like `pip install somepackage==1.2.3`. + +If reproducibility is very important, it's common to require other +people running your code to install specific versions of the relevant +packages. `venv` (not covered in 320) is a popular tool for making it +easier to impose such requirements: +https://docs.python.org/3/library/venv.html#creating-virtual-environments + +Running `pip install` downloads and installs packages from PyPI +(https://pypi.org/), a package index where anybody can publish their +packages. The developers that publish to PyPI will typically store +their code (including versions not yet released to PyPI) using a +version-control tool, described next. + +## Version Control Systems (VCS) + +Version control systems allow developers to store not only the code +for a project, but a history of changes to that code. Generally, +developers take snapshots of the code at specific points in time, +typically with a brief message describing what has changed. This +allows teams to look back at who has contributed what and also +rollback buggy versions. + +Generally, only a small subset of snapshots will get published as a +release on an index like PyPI. A new feature might have many +milestones along the way, but you wouldn't want to officially release +it someplace like PyPI until the feature is complete. + +There are many examples of VCS tools, such as svn, TeamFoundation, +Mercurial, and git. We'll learn git, an open-source tool developed by +Linus Torvalds (also creator of Linux) in this course. You can run +git directly yourself, but there are also a number of companies that +provide git hosting as a service (often with a free tier); some of the +services include GitLab, BitBucket, and GitHub. We'll learn GitHub. + +## Git + +In git, a snapshot of the files in a project is called a *commit*. In +the simplest case, git records history as a sequence of commits. Git +can record this history in a *repository* ("repo" for short), a +special *directory* (informally called a "folder") on your computer. +This is convenient, because whenever you're in that directory, you're +looking at one version of the files (often the latest). The other +commits are stored as hidden files, and there are special git commands +to see those. Repositories can also be hosted on GitHub. + +### Repos + +There are two ways to create a repo on your computer: (1) copy it down from +a host, like GitHub, or (2) make an empty one. + +Copying from a site like GitHub can be done with the `clone` command. +Take a look at this repo: https://github.com/tylerharter/cs320-p1. +Now, click on the "Code" button, then click "HTTPS", and copy the URL: + +<img src="img/clone.png" width=300> + +Now, open a terminal, `cd` to a directory where you can do some scratch work, and run the following: + +`git clone https://github.com/tylerharter/cs320-p1.git` + +This will create a directory called `cs320-p1`. `cd` into it, then +run `ls -a` ("ls" means list files, and the "-a" flags means show them +all, including hidden files). You'll see this: + +``` +. .. .git wc.py +``` + +`wc.py` is an example of a file in this repo (in its latest form), and +`.git` contains prior commits with other versions of that file. + +Run `git log`. You'll see something like this: + +``` +commit 4e4128313b8d5b5e5d04f2e8e585f64f7c5831a4 (HEAD -> main, origin/main, origin/HEAD) +Author: Steve <steve@example.com> +Date: Mon Jan 20 15:00:00 2020 -0600 + + only make one pass over list to count all + +commit f637df3f45bc389e1035cc3aadcf5d81a55f0dc4 +Author: Steve <steve@example.com> +Date: Sat Jan 18 18:00:00 2020 -0600 + + only make one pass over list to count all + +commit c10b5a6cb4f06c96f6f221df2d5ec33af767d5c5 +Author: Ada <ada@example.com> +Date: Thu Jan 16 13:00:00 2020 -0600 + + optimize: only compute count once per unique word +... +``` + +Each commit represents a version of the code. You can also see the +author, date, and commit message. Let's take a look at this version +of the code, switch to another commit, then look at that version of the code. + +``` +cat wc.py +git checkout 6d7beafb8e79b7a92fed8e67673a33bb7f607dbe +cat wc.py +``` + +The `checkout` command is for changing versions, and +"b0df6dbe111f9e28fc3a9c9b841cde5c20c365f9" is an example of a commit +number. It contains letters, because it is *hexadecimal*, meaning it +contains 16 digits ("decimal" digits that we're familiar with include +0-9, "binary" digits include 0 and 1, and hexadecimal digits include +0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). + +If you run `git log` again, you'll notice the command only shows the +history prior to the commit you're currently on. You can run `git +checkout main` to jump back to the latest commit. + +You can also create a repo from scratch, not associated with anything +on GitHub. Let's try that now: + +``` +cd .. +mkdir fresh +cd fresh +git init +``` + +Here, we named the new repo "fresh", but you could have called it anything. + +### Creating Commits + +Before we can create commits in our new repo, we need to create some +files. You could do this with any tool you like (e.g., you could run +Jupyter in this directory). `nano` is a simple terminal-editor you +may want to learn (https://itsfoss.com/nano-editor-guide/). + +Create a file in the directory called "x.txt" that contains the +word "apple". Now, run `git status`. You'll see something like this: + +``` +On branch main + +No commits yet + +Untracked files: + (use "git add <file>..." to include in what will be committed) + x.txt +``` + +We'll follow the hint and run `git add x.txt`. If you run the status +command again, you'll see the new file is ready to be committed: + +``` +On branch main + +No commits yet + +Changes to be committed: + (use "git rm --cached <file>..." to unstage) + new file: x.txt +``` + +Now we can create a commit using the `commit` command, as well as specify a string message using the `-m` flag: + +``` +git commit -m 'say whatever you want here about your work' +``` + +If this is your first time using git on this computer, it might +complain it doesn't know who you are (remember that git remembers who +made what changes). You can tell it with commands like these: + +``` +git config -- global user.email "PUT YOUR EMAIL HERE" +git config -- global user.name "PUT YOUR NAME HERE" +``` + +Run `git status` and `git log` to get a sense of your current workspace (you'll run those a lot). + +Now do two things: +1. change "x.txt" so that it contains "banana" +2. create a "y.txt" file that contains "cabbage" + +Run `git status`, and you'll see something like this: + +``` +On branch main +Changes not staged for commit: + (use "git add <file>..." to update what will be committed) + (use "git restore <file>..." to discard changes in working directory) + modified: x.txt + +Untracked files: + (use "git add <file>..." to include in what will be committed) + y.txt + +no changes added to commit (use "git add" and/or "git commit -a") +``` + +Note how git is suggesting `git add` for both our files. Files can +either be "untracked" (new files), "not staged" (prior files that have +been modified), or "staged" (files that have been added since the last +change). Only staged files get committed, and (somewhat annoyingly) +you'll need to re-add the same file each time you want to snapshot it +as part of a new commit. So run `git add x.txt y.txt` to stage both +files, check the `git status` again, then create another commit, with +a message of your choosing. If you run `git log` again, you'll see +both your commits: + +``` +commit 083dc3e19511f8c0b4ec24661fbb40df6e963335 (HEAD -> main) +Author: tylerharter <tylerharter@gmail.com> +Date: Tue Jan 12 18:09:55 2021 -0600 + + more fruits + +commit f8e8858108860cd02a78776d1abcdd7a796d9480 +Author: tylerharter <tylerharter@gmail.com> +Date: Tue Jan 12 18:02:02 2021 -0600 + + create the apple file +``` + +If you switch to the first commit (using a `git checkout`), then run +"ls", you'll only see the x.txt file. If you switch back to the +latest commit, you'll see both. + +## Summary of Concepts and Commands + +**Concepts:** version control, snapshot, release, staged, tracked. + +**Git Commands:** clone, init, add, commit, checkout, log, status. diff --git a/lecture_material/04-performance2/reading.md b/lecture_material/04-performance2/reading.md new file mode 100644 index 0000000000000000000000000000000000000000..fee8893948f1a22cc4eda554cc3e2c4a8d0ddb7d --- /dev/null +++ b/lecture_material/04-performance2/reading.md @@ -0,0 +1,131 @@ +# Iterators and Generators + +In the following, pay close attention to how these four definitions, +which often get confused +1. iterator +2. iterable +3. generator function +4. generator object + +For these examples, first create a file with numbers 100 to 1: + +```python +with open("nums.txt", "w") as f: + for i in range(100, 0, -1): + f.write(str(i) + "\n") +``` + +## Iterators and Iterables + +When you call `open(...)` to read a file, you get back a file object. +File objects are *iterators*, meaning you can call `next` on them: + +```python +with open("nums.txt") as f: + print(next(f)) + print(next(f)) + print(next(f)) +``` + +A `list` object IS NOT an iterator, as Python will quickly complain +if you try running the following (`TypeError: 'list' object is not an +iterator`): + +```python +nums = [100, 99, 98, 97] +print(next(nums)) +print(next(nums)) +print(next(nums)) +``` + +However, a `list` object IS an *iterable*, meaning we can call `iter` +to get a different object that is an iterator. + +```python +nums = [100, 99, 98, 97] +it = iter(nums) +print(next(it)) +print(next(it)) +print(next(it)) +``` + +When we see a `for` loop `for x in SOME_OBJECT:`, it does two things automatically: +1. call `iter(SOME_OBJECT)` to get an iterator object from `SOME_OBJECT` (this implies `SOME_OBJECT` must be an iterable) +2. repeatedly call `next` on the iterator object, placing each value in `x`, until there are no more values + +## Generator Functions and Generator Objects + +You'll sometimes read about "generators" -- we avoid that simple +phrasing in this course because it is often used ambiguously to refer +to either generator functions or generator objects. + +You've probably written functions like this many times (replacing `XXXX`, `YYYY`, and `ZZZZ` with something else): + +```python +def f(): + some_list = [] + for XXXX in YYYY: + ... + some_list.append(ZZZZ) + return some_list +``` + +You might elsewhere call such a function to get values over which to +loop (`for x in f():`). + +Generator functions are a useful alternative in such use cases; `g` is +very similar to `f` above: + +```python +def g(): + for XXXX in YYYY: + ... + yield ZZZZ +``` + +`g` is a *generator function* because it has a yield statement +(instead of the append we saw earlier). Even though there is no +`return` statement anymore, `g` will return a *generator object* when +called, which is a good alternative to a list in some scenarios: + +* `for x in g():` **still works** because generator objects are both iterators and iterables +* `g()[3]` **won't work** anymore because you can't index into generator objects + +As long as we don't need indexing, generators have several advantages: + +* the code is often a little shorter (and maybe more intuitive, once you get used to the idea) +* if `some_list` in `f` is too big to fit in memory (RAM!), the generator alternative will save us because that approach never has all the `ZZZZ` values in memory at once +* even more extreme, if you want to produce an infinite number of results, generators will still work + +The cool thing about the following generator function is that it will +work even the entire `nums.txt` (which is in **storage**) is too big +to fit in **memory** all at once. It's not unusual for storage space +to be hundreds of times bigger than memory space, so this is an +important technique when working with big datasets. + +```python +def rolling_sum(): + total = 0 + with open("nums.txt") as f: + for line in f: + total += int(line) + yield total + +for x in rolling_sum(): + print(x) +``` + +Here's an example of a generator that produces an infinite number of +results. If you run this one, you'll need to click "Interrupt" under +the "Kernel" menu in Jupyter if you don't want it to run forever. + +```python +def even_nums(): + x = 0 + while True: + yield x + x += 2 + +for x in even_nums(): + print(x) +``` diff --git a/lecture_material/05-oop1/reading.ipynb b/lecture_material/05-oop1/reading.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1d94f3b9e5da890f92524c6a488f4cba7a26ef9e --- /dev/null +++ b/lecture_material/05-oop1/reading.ipynb @@ -0,0 +1,507 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Object Oriented Programming\n", + "\n", + "You already know a variety of types, including dicts, lists, and pandas DataFrames. You already know how to create objects (or instances) of these types.\n", + "\n", + "Now, we will learn about Object Oriented Programming, or OOP. We will not only create new objects; we will now create our own types, and then create instances of those new types. The new types we'll be creating are called *classes*. There are other ways to create new types in Python (for example, maybe you have encountered `namedtuple` -- no worries if not), but classes are by far the most common way.\n", + "\n", + "## Analogy to Dictionaries\n", + "\n", + "The Python dict is the most flexible type we know so far. By using different keys/values, we can represent a variety of different real world entities, including people, vehicles, sales, movies, games, etc.\n", + "\n", + "Let's see how we could create a couple dictionaries to represent people, then look at the PythonTutor visualization of those dict objects..." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#person-dict.png\n", + "p1 = {\"first\":\"Alice\", \"last\":\"Anderson\", \"age\":24}\n", + "p2 = {\"first\":\"Bob\", \"last\":\"Bryson\", \"age\":23}" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import Image\n", + "Image(\"person-dict.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we create a new type (as a Python class), then create instances from that new type, the resulting objects are remarkably similar to dictionary objects. Without worrying about the code (which has a number of thing yet unexplained), let's see how some objects used to represent people are similar to the above dictionaries." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "#person-class.png\n", + "class Person:\n", + " def __init__(self, first, last, age):\n", + " self.first = first\n", + " self.last = last\n", + " self.age = age\n", + " \n", + "p1 = Person(\"Alice\", \"Anderson\", 24)\n", + "p2 = Person(\"Bob\", \"Bryson\", 23)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAGJCAYAAACEvEeTAAB6nElEQVR4nO3dd1gU19vG8S9L70WaiCh2wa4Re+wldo3GrrFrYomNGE1siRFjN9bYYo+9YlfU2I1d7IKKDVCQsix13z943YQfIChlKc/nurwCc2bm3LtL9OHMmTM6arVajRBCCCFEPqfQdgAhhBBCiJxAiiIhhBBCCKQoEkIIIYQApCgSQgghhACkKBJCCCGEAKQoEkIIIYQApCgSQgghhACkKBICgLi4uBS3BwcHc+XKlWxOI4QQQhv0tB0gt4mLi6Nr164pto0fP54qVapkcyLxqfz9/Vm4cCGXLl1CqVRSokQJWrVqRZcuXdDTS/xf48qVK/zwww9cunQJHR2dFM9z9+5dhg0bxm+//UalSpUylOnChQsEBwfTsmXLDJ1HCCHEx5Oi6BP4+fnRvHlzKlSokGS7g4ODlhKJj3X79m169+5NmTJlmDBhAlZWVly+fJl58+Zx48YNZs6cme5z2djY0LVrV+zs7DKc68yZM/j6+kpRJIQQWiBF0SeqXr06bdq0Sbb92bNnXL16lVatWnHz5k2ePn1KjRo1UKlUnD17lsDAQNRqNSVKlKBhw4YYGRkBcO3aNZRKJXZ2dpw8eRK1Wk2TJk1wcXHhxIkT3L59mwoVKlCnTh3NKAbA/fv3OXPmDO/evaN06dI0adJE0x4ZGcmRI0d49uwZZmZmuLm5UbVq1STH51dz5szBxcWFFStWaD4DDw8PXFxcmDJlCufPn6dGjRqa/QMDAzl+/DivX7+matWq1K1bF4BLly7x/PlzbGxsMDU11ewfExPD4cOHefjwIRYWFjRs2JCiRYtq2kNCQvDx8eH58+fY29tTq1YtYmNjuX//PkFBQezatQuAGjVq4OjoyM2bN7l06RKRkZE4OztTp06dTCnChBBC/Ev+dcxkd+7cYerUqXh7e3P58mUA5s+fz4MHD9iyZYtmdGnt2rXs37+fRYsWAXDw4EG2bdsGQKVKlXjy5Anr1q2jZMmSPHjwADc3N9auXUuLFi2YNm0aAPv372fSpEm4ublhb2/P+vXruXbtGuPHjycqKoqePXuiUqmoXr06t27dYtGiRfz1118UL15cC+9MzhEcHMz169f58ccfNQXRey1atGDBggWcPn06SVHUqVMnXFxceP36NevXr8fT05NOnTpx+/Ztjh8/jq+vL2XKlMHKygqlUknfvn158eIF9erV49SpUyxevJhdu3bh7OzMgwcP6NevH0qlks8//5wjR47wxx9/MGnSJB49ekR0dDRHjhwBoGTJkly6dIkpU6ZQq1YtLCws2LNnDxcuXGDGjBnZ+r4JIUSepxYfJTY2Vl21atVkf2bOnKlWq9XqQ4cOqatWrar+448/1KGhoeqEhAR1XFycWqlUJjmPj4+PumrVquqgoCC1Wq1W//rrr+o2bdqoX7x4oVar1erAwEB11apV1ZMmTVJHRUWp1Wq1eufOneq6deuqY2Nj1e/evVPXrVtXvWrVKs05T58+ra5bt646OjpafenSJXXVqlXVN27c0LT7+fmp3717l6XvT25w7dq1ZO/Nf33zzTfqb775Rq1W//t53rx5U61Wq9VRUVHqUaNGqevWrauOj49Xq9Vq9dOnT9VVq1ZV37lzR61Wq9V//PGHum7duurw8HDNObt3765et26dWq1Wq/v27av+8ssv1SEhIWq1Wq2Oi4tTnzhxQq1Wq9WzZ89W9+vXL0mefv36afKo1Wp1TEyM2tfXN4PvghBCiP8lI0WfqHPnzklGEhwdHZO09+vXTzMxV1dXF4VCwfr16zl//jwvXrwgODgYgPDwcGxtbQFwdnamYMGCANjZ2WFiYkK5cuU0oxmurq4olUqCgoJ4+fIlSqWSR48eMXv2bACioqJQKpVcvXqVUqVKAeDl5UW7du1wd3enbNmyWfiO5B7v7zRTKFK++VKhUBAdHZ1km7u7OwBGRkbUq1ePkydPEhISQoECBZIdf+nSJaytrVm2bJlmW3R0NCdOnODLL7/k+vXrDBw4ECsrKyDx56N+/fqp5nV3d2fDhg3MmjWLatWqUaVKFfkshRAiC0hR9InKlClDvXr10r3/6NGjuXHjBn379qVUqVKEhYUxceLEj+pTV1cXALVaTWhoKAAuLi4YGxtr9hkxYgQODg5YW1uzZs0aVq5cyYIFC1AqlVSsWJGFCxdiYmLyUf3mNYUKFQIgICBAU+z815MnT5IUvP/LwsICgNjY2BTbg4KCsLa2xt7eXrOtTZs2WFhYEBERAUDhwoXTnXfIkCGYm5vj7e3N5s2bAZg2bRotWrRI9zmEEEKkTYqibBAWFsb58+eZNGkSrVu3BuDRo0cZOqeTkxOAZuQgJeXKlWPu3LkkJCRw7tw5RowYwdmzZ2ncuHGG+s7t7O3tKVSoEJs2baJp06ZJbrU/f/48z58/p2rVqqke/37dovcjfP+rWLFihIeH07Nnz2RtarUaSLz1PqWiRk9PL9maSUZGRvTv35/+/fvz9u1bpk2bxtKlS6UoEkKITCaLN2YDU1NT7O3tOXPmDA8fPuTy5cvMmTMnQ+csWbIk5cqVY8qUKVy8eJGgoCCuXbvG5MmTefjwIT4+PsyYMYP79+8TERFBVFQUAObm5pnxknI1hULB2LFjuXXrFmPHjsXX15eAgAD279/PuHHjcHNzS1Y4/vPPPwQFBbFz5052795N586dU72Lr3379vzzzz8sXLiQgIAA/P392bNnD3PmzEFHR4cuXbqwb98+1q1bx4sXL7hw4QJjxowBEifZ37p1i5s3b+Lv709oaCijR4/m8OHDBAcHay6RplaQCSGE+HQyUpTJUpqnoqury6hRo/Dy8uLo0aMAmn90U1sQMCXv99XR0UFXV5eZM2cyc+ZMhg4dqtnHzc0NMzMz7O3tOXfunOaONhcXF7799ls8PDw++bXlJXXq1OH333/n119/pVevXprtbdu25bvvvtN8ju//O378eEJCQgCoX79+kvf8/ejPe7Vr12bSpEksWLCAP//8EwATExP69+8PwNChQ4mOjmb+/PnMnz8fgFatWgGJI39169bl66+/BmDRokXY2dnxww8/aM5ft25dRowYkXlvhhBCCAB01P/7N7rIMnFxcQQEBODo6JjsVvCMiImJITg4GGtr6yTziyDx0p1KpUoyv0UkFRYWxrt37yhYsGCqoz9xcXG8fPkSMzMzrK2tk7Rdu3aN/v37c/DgwWQjOG/fviU+Pp4CBQokK5hjY2MJCQnB0tISQ0PDJG0REREkJCRo5i/FxcURFBSEjY1Nsn2FEEJkDimKhPhEa9euRalUcvjwYezs7JLcbSaEECL3kctnQnwifX197t27R5s2beSxHEIIkQfISJEQQgghBHL3mRBCCCEEIEWREEIIIQQgRZEQQgghBCBFkRBCCCEEIEWREEIIIQQgRZEQQgghBCBFkRBCCCEEIEWREEIIIQQgRZEQQgghBCBFkRBCCCEEIEWREEIIIQQgRZEQQgghBCBFkRBCCCEEIEWREEIIIQQAehk9waZ9B6hTo34mRBHZpbCtsbYjCCGEEDmOjBQJIYQQQiBFkRBCCCEEIEWREEIIIQQgRZEQQgghBCBFkRBCCCEEIEWREEIIIQQgRZEQQgghBJAJ6xSlx7t3oVw4+zf+fo+ws3egXv1GFLC1A8Dv8UMe3r8HQBm3chR2KfJR575x7QoWFpYULVb8k7JltP/3YmJiOHPqBAHPnlKxSlUqVKzySecRIrMEBgaiUCiwtbXVdhQhhMgVsnykyP/xI1o2rs1sr2ncu+vL/Fm/Mujrbpr2B/fusnPbZjxHfcOJo4c++vwrli7koPeeT86X0f7fmzHtR6ZMHMe9u7e5evnSJ59H5Dzx8fH06dOHPn360LdvXyZPnoy/v7+2Y6Vpy5YteHt7azuGEELkGlk+UjRz+mRKlS7L8jWb0dNL7E6lUmnam7ZoRdMWrejfq/MHzxMTEwOAgYFBqvtERkRgamaWanuUUomxiUmSbentPy1nTvsw/qefafZF6w/ul1KG9LSpVCqMjIyIjY1FV1cXhSJpPRsbG0t8XBxGxrJadWZTq9UolUomTJiApaUle/bsYcKECaxbt07zOahUKgwNDdHR0fnguRISEoiJicHIyCjZ9ujoaIxT+Pzi4+OJj4//4M/++3PExcWlul9cXBwqlQqzFP4fUalUGBgYJPm5Si2rEELkVVk6UqSMjGTf7u30HzxMUxABH/WXbGhoCEP69aBEIStKFLJiSL8ehIaGJNnnyuUL1K9RkbKu9tSvUZFHD+9r2p49fcKEcSPwqFiS0kVsGdy3G8FBgRl/cf/v50njcXN14M7tmwzo/RVurg4s/X1ukn08KpZk66Z11PnMndJFbJn0w5h05btx/Qr1a1Skd5f2lCpsw18b/6RiKWc6t22mOT46Opqfxo+iuJMlpVwKMGrYwCRFp8g8Dg4OFC1alN69exMbG0tgYCChoaGMGzeOPn368PXXX7Njxw4Azp49y8iRI5k7dy7du3fn+PHjLFu2jC5dumhGnV69egXAjh076NKlC71792bkyJG8ffsWgOHDhzN58mS6du1Kr1692Lp1a4q5EhIS+P333+nSpQs9evRg6NChyX4Gpk6dSrdu3ejfvz+9evXi9u3bAPj5+dG/f3/69OlDly5dWLVqFUCqWYUQIi/L0qLo9euXABQvUeqTz/HLpB946u/HviN/s/fwaR4/esD0yROS7HP54nl+/+NPTl+6ja2dPX8sXqBpMzc3p2GT5py8cJO/L/ty1/c2hw7s/eQ8/2u054+cvnQLMzNzVm/czulLt+j19cAk+7x88ZxJP4zhp6leHD55kV59/23/UL6E+AQeP3rAl126U7tufbx+nsSGbfu4eP4ML188B2D1H4s5fvQQ3sfPcvLCDa5cupChy4Diw9RqNceOHdPM1dm/fz9OTk6sXbuWWbNmsWXLFsLDw4mJieHVq1e4uroybdo0HB0dOXbsGIsXL2bTpk1899136OvrExkZyebNm5kyZQqrVq3CxsZGc8lLqVRib2/PqlWrmDx5Mtu3byc+Pj5ZJl9fXy5fvoyXlxcbN26kbdu2yfbp1asXGzZsYPPmzTRt2pRNmzYBsGnTJsqVK8fmzZtZuXIl5cqVIyAgIMWsQgiR12Xp5bPwsDAAzSWhzRvW8PbNG3R0dBg4dAS6urofPD4uLo6/Nv7J/CWrqFApceLyoG9GMnJoP36dvVBzfP/BwyhXvpLm6x/GDmfGnN8BsLK2oVGTFv//tTWfN2jMub9P0b1Xv0x5jcYmJhibmGBkbIy1dQHNBPL/NX/JKpo0b5lse1r5zMzMad3uS65cvoh7+YpUrvoZZmbmvH71koJOhdi5bTPlK1TmRUAAAGXc3DmwbxctWiX/h1FkzOjRo4mNjcXMzIzx48ejp6fHyZMnMTMzY8aMGZr9rly5AkDhwoVp164dkDiip6+vj5eXFx4eHtSrV48CBQpw4sQJChYsSNmyZQFo2rQpa9asoUePHgDUrVsXMzMzypQpQ0JCAkFBQTg6OibJdfz4cWrXro2rqysAzZo143+FhISwfPlyXrx4gUqlwt7eHoDSpUuzdetWFi9eTKVKlahRowaxsbEpZhVCiLwuS4siO3sHAELevMHCwpLwsDAePbzP1k3r+HrA0DSLordvggEoV6GSZlv5ipUTz/n2DbZ2iX+x/3ceRMnSZQgOCiQ0NAQrK2tUUVH8Ou1Htm5ah7mFBbGxsVSvUSszX2a6FHIunOL29OZLaR4RwLMn/pibW3D0UOLogoWFFdY2NpkbXgAwceJEXFxcMDU11WwLCwuja9euuLi4aLbZ2dlpCqP3DA0NWbRoEcePH+fatWts2bKFWbNmER8fn+T/A4VCQVxc3EflCg4O1hREKQkNDeXXX39l0KBBVK9eHV9fXzZs2ABAx44dKVGiBBcuXGD58uWcOnWK77//PsWs/32NQgiRF2Xp5TM7ewfMzMy5cO5vAAYMGc6gb0am+3ibAom3Et+5fVOz7f3XVtb//sMfFxf7n/ZbFCteEisrawCWLZ7HyeNHOHzqEheuP2DIsFGf/HqyQkbzFS5SFPdyFZg5b7Hmz/iffs6itPmbtbV1koIIoGTJkly6dIkiRYpQvHhxYmJiiIiISHbsq1ev8Pf3p0OHDkyZMgUzMzMePnyIh4cHAQEB+Pv7Ex0dzdGjR6ldu/ZH5XJ3d+fMmTOaeT8XLlwgOjpa0x72/yO21apVw9jYmBs3bmjaTp8+TfHixRk4cCC9evXi/v37qWYVQoi8LktHivT09BgwZDgzfv4Jt/IVKFO2HI8fPkh1/9jYGKKjozE0NNQc36Z9J1YtX4RbuQqo1Wr+WLKAdh2/SjJxe/H82dRv1BQLCytW/bGIhk2aa9pUUSocHAtiYWnJqRNHmTvzFzxq1klX/9nhY/KlpHPXnsyeMY1adevTqGkLolUqYmKisbaRyx2Z5UN3lI0YMYKNGzfSv39/VCoVurq6TJ06Ndl+MTEx/Pbbb0DiqF/JkiWpV68eenp6tG7dmnHjxqFQKLCwsKB///7p6vu9du3acf/+fYYPH46+vj6GhoYsXrxY0+7i4kKVKlUYMGAACoVCc+kM4Pr16yxcuBATExMMDAwYOHBgqlmFECKv01Gr1eqMnGDTvgPUqVE/1fbo6Gh+mTyeNSuWarb16NOfaTPmJrls0L9XZw4f2AfAIZ8LlHUvD0Dg61cM7d+Ti+fPAFCzdj1+X/6n5tLc8MFfo1JFcfnieYKDAnEp6sqm7d6aRRif+D2me+fWPPX3w6WoKx07d+PoQW/2HzuTJGdq/adXFbeirFi7hSrVqidrc3N1YPu+oyme80P5rl25TLeOLfH1e82vUycCMP6nn3FzdWDTDm8qVq5KbGwss36dwpKFczAzMyciIpwJk6d/cESusK3ctp/Z4uPjCQ8Px8rK6oP7hYSEYGZmlmziskqlQqlUYpOBS58qlQqVSpVqhtDQUPT19ZONdkVHRxMVFZXsuNSyCiFEXpXlRdF7sbGxvHzxHAfHgp80EvP2TTAKhSLJZbP/SkhI4NXLFxR0KpTst+uEhASCgwKxd3BM8Vhty4x80dHRBL5+RUGnQklG0VIiRZEQQgiRXLYVRSLnkKJICCGESE4eCCuEEEIIgRRFQqQpPl7NvcdvPvq4wDeRvAmJyoJEHy8iMoanL8K0HUMIIXI0KYqESENYRDQDJqT8YNVj5/wZNf1oim0b99zm8Bm/TMnw6GkI2w/d1Xyvio5j/p+XiE9I/er3f7Nd8X3Fgj8/7kHF6elDCCHyEimKhPgI0THxJPxnGl71Ck6M7FM92T4xsckfxwEQFZ32wowJajURytgk/bwOjuTkxaea72PjEth+8C4fmhKYUjZILHbS40N9pPY6VNFxSXILIURukqXrFAmRl0z9/W+OnvGjoL0ZngNrUsXdEd+Hwew+cp/pY+oTH69m3pqL7D6a+EBiYyM9+nSsCMB9v7dMXnCKN6FRFHexpn/nSlRxT3634e6j95m98gLGRon/aw7r9RmtGpRgysLTRKniaPb1JiqUtsfYKPE2+Zb9/wJgz7LOfPfLEaqVL8j5q8+JjYtncLeqmmwAz16F8bXnXh49DaVBjSJ806Ma9gVM+NpzLxO/qUtxFyvUamjedxNbFnRg9soLyfp48vxdiq/DP+AdP847SeCbSKJUcfT9siJ9OlbIug9DCCGygBRFQqRT3WqF+X5QLXYfvcfOw/eo4u5IbFw8SlXiiupHzvhx8cYLVnu1pqizJb8u+XctrD/+ukrfLyvSqJYrF64/Z/nmqyyd1iJZHx6VCuG94ivMTA24dT+IoZMO8kX94vz0bV3+8vZl3sQm6KBDeGQMPheesHf5V+jp6aDQSdx23+8tw3t/hrmpAc9ehWmyAcTFJTB+SG3sbUyYufw8h08/pke7coRFxBCfkKDZL0oVh1qtZkz/Gsn6SO11bNp3m2rlCzKi92dERMZw9xPmYAkhhLZJUSREOjWokbggaLlS9mze55us/fKtlzSqVZTiLlYAmJkYABDyTsWF6y8wNzPk7NXnxMcn4PswmNAwFVYWRsnOs3DdZXwfBhP4JhKAmJh43i+9pfj/LzTfK/7dBtCjbTnKlUp8KPGzV0knVrs6W1GqaOI6X03quLL90F16tCuX6uv93z4+9DpKFyvAsk1XMNDXpVJZBzwqOaV6XiGEyKmkKBLiI+nqpvzoDX1dBWbGBsm2v32XeAda9zblNIVG7w4VMDVJvu/4347jUakQ8yY0wdhIj+Z9N2sWI01IYcLzp07fiY2NR6X6d16Q+gOTqd/38aHX0aFpaUoWsebctefMW3ORym4OfD8o+x+8LIQQGSETrYXIJNXKF+TUpaeEvFMRGqbivv9bAAoXtMDKwoh7j99QrLAVRZwsef4qHIUiaXGlVsObUBVV3B2xsTLmxr1ATZuDrSkvAyOIj1eToFZjYqSPsZEegW8i0z2xWalKnLwdHhnDkTN+VC2XOKepZFEbHj4NQa2GSzdfaPb/3z4+9Dr+/ucZroWtGfhVZYZ0q8KNu4GpxRBCiBxLRopykfMn9lGjQSttx8h30vFMVgCqV3Ri/e6btB28FWMjPewLJD5jzEBfF69xDdl64A5/7rzBy8AIirtYUauKc7J+BnxViTG/HsPYSI/Sxf59qG+xwtaUKGLNF/03U7a4LfMmNqF7m3L0/T7xeX17lnX+/3OkHvbW/SDaDd5GaJiKcqXs6N428Vl87ZqUYvqSs3gtO4dHRSfNeXR1dZL1kdrruH4nkB9m+VDQ3gwTIz1GpHDXmxBC5HTymI9cJLOKInnMR9ZJHO2JwtrCKMXLbFHRcagT1JgYp/6Q1ShVHNExcSnON4qIjMHISA893cRB3ve31xsZpu/3G2VULEpVHLbWSX8G4uITiFTGYmme/LmEKfWR0uuIiY0nShWX4jmEECI3kJEiIdJQr+s6bUfIlVbNaEWJItbajiGEEOkmRZEQaTi1qae2IwghhMgGUhSJbBETF8/LkAgC30USHK4kLCqGd0oVEapYlNExqNWgRg3oYKCnwMLYEHNjQ2zMjHGwNKWonSW2FibafhlCCCHyMCmKRKYIj4rh0esQHr8OwS8wlMevQ1DGxHH50QtehkQQroqmoJU5n7sXIehdJBYmhliaGFLAzARdhQ46Ojro6ICuAt4po3kWHEa4KgZjA32uPH6Jf1AoUTFxtKxSAgM9XSoVdaRSUQc8SjpjZpT6/JzM4OXllaXnF0KI/MrT01PbEZLIc0VRXFwczep7aL43Nzeneo3a9B34DY4FZUG5jLr74g33ngdz/+Vb7r14w/0Xb7j/8i1lChXgnTKaYvbWuNpb4V7YjlJOBRjdqgYFrc0oYJ7xyd2RqlieBL/jyuOXXPN/zYGrD3nw8i0FzI353K0IDcoVpXF5V0wMP1wkxcYlsO28L13rpL5w4f8a1c8j7Z3ymTkrL+DpWU/bMYQQuZSX1yltR0gmzxVFarWaB/fu0KlrTz7zqMmrly9Yu2o53vt2se/I31hZycTP9Lj1NAjfgCBuBwThGxCMb0AQdwKCqe9eBAtjQ0o5FaBmKWd6f16BUgUL4GBlmuWZTI30cXO2xc3Zlh71ymu2X/V7xUnfJ2w9d4eu83bwWQknvqhcgi8ql6Sci12y8+jrKTh2049By70JWDoCCxO5W0oIIUQeLIre86hRm87degFQv2FT2jSrx8VzZ2jaIvGWdt9bNzhx9BAhIW9xL1+R1u2+RE9PD2VkJHt2baVJs5aEhLzlxrUrlCxdhvIVKnPl8kXO/u1DeHg4RYq60qhJCxwcCwIQHh7G7u1bePzoAS5FXGndriMFbBP/QfZ//IiL58/QuNkX7N21ndevXtKqbQfcymXOAzPfKVVM3e7D4WsPeRcVTaea7vzUsT6WJslv6f5f91684dbTQG49C+L2syBuPQsiPj4BA31d3JxtcS9sx1e13HBztsPN2TZT8ma2yq6OVHZNXIhw3bC2nPR9gveVh/Rfuo+gsEg6eJShg0cZapb6d12gFUNas/msL7Z9Z3NoYjcalCuqpfRCCCFyijxbFP1XIefCALwLDQFg+5aNfPdNfypWrkpBp0IsXzyfSxfOMv23BYSFvWPcyKFU86jJ5QvnABgyfDR3b99i9PBBNGjUDEsrK7ZuWsffJ0+weMU6Qt6+oXWzejz196NRkxasWLqQBXNmsPvgSQq7FOHmjauMGTEYMzNzChcpioGBAb/Pm8mSlRto2aZ9hl/f6LUHOXzjkeb7reduo1bDnF7NNdtehIRz93kQd18Eo1SpOHnnCbefBVHc0YZyhe0oV9ieTjXdmNLZjrI5tPhJr8/divC5W+Jzyh6/DmHHhbuMXnsE/8B3DGxchSYVXKldpjC7x3Xmy9nb6DBrK6Na1eDHL+tqObkQQghtyvNFUZRSydzffgGgymcehIaG8KPnd3hOmMI3I8cCcOzIAYYN7MOkn3/THOfgUJDTF29RxLUYcXFxdGnfgs8bNuHPzTsBiImJ4e6dWwAsWzyfp/5+XLr5CAfHgoSGhlCrchkWzJ7Bb/OXaM65asM2atRK/Ie3b48vOXJof6YURf8tiN7b9889jPX1uPsimHvPgzAzNqSMky2lC9nSwN2Fvg0r4V7YTrMIYF5VzMGaMW1qMqZNTV6GRHDw2kM8NxzDP+gdXWq5U7VYQc7eD2DW3nOcufeMgxO6aTuyEEIILcmzRdHkCWOZ7TWNly+eAzB7wTKKlyjFhXN/ExERzr27vkyZOA5ILJwiIsK5eP4MJUuVAaDfoG8p4loMAD09PSpWrsofSxYw6Ycx1K5bn+o1a1OhYhUALp4/Q936jTSX0qysrGn6RWvOnU06icyjZh3N1+UrVGb3ji2Z/8L/f4Hy+IQEyhSypd1nZSldyBYL43/nzeTXFa0LWpvxdYNKfN2gEs/fhvPH0avcf/k2cSXmmDhO+T7FccBcHiz4BvMUHuwqhBAib8uzRVGrth2p83kDHBwLUqp0WaxtEp8j9fbNGwBci5fAxOTfycETJk/HqZBziucCGPP9T1hYWrJz62ZW/7EYgPlLVtH+yy68DQ6mVt3Pk+zv4lKUw957Uz2fnn7mvfVNKxT/d7To/5991fazsvSsVynT+sgrwpTRrD99k1UnruP7LJB4tZr4/y8ko2LjiHoXh3Wf3/D+oStNKxbTclohhBDZKc8WRdWq16BN+07JthcukjjXpFadz5OM3Lz36uWLZNsAjE1MGDF6PCNGjyc4KJBx3w1lttc02n/ZhWIlSnLK51iS/c/+fZLiJUtlwitJ2+xezRm99iDnHwQQFhXNlzXcmfRl/WzpO7cpMex3gsKjPrhPfIKalr9uInbzhGxKJYQQIifIs0VRasq6ladKteqMHj6IGbN/p2SpMjz192Pzxj8ZMHgYVtY2KR7Xv1dn2nboTPWatYlWRRMZEYG9Q+IdT19+1YPBfbsxb9Z02nX4iqOHvbl4/gzTf1uQLa/J0sSIFYPbZUtfuV3gytHajpCvBAeH8fJlKGXKOKGfiaOjQgiRFfLcLFsdneRPJv8vXV1dlq7aiJt7ebp1bMln5YvTsXVj7t/1xdzCMtXjHRwL8s2AXnxWrjh1qrlhambGzLmJl9FatGrLmPE/McfrZ+p5lGfqj54MHDqCLj36/H+mPPc2C5GmNWt8GDFiDatX+xASEplp53348BXbtp3XfP/qVShduswjIkKVaX0IIfInHbX6/ydUfKJN+w5Qp0b9TIqTvaKjowl8/YoCBWwxMU178cHY2Fhev3qJrZ09RkbJ1wBSqVS8fBGAo6MTxiaZ/5yu8yf2UaNBqwyfJ79OtP5UXl5esqJ1Cj60onVCQgI9e/7OjBndKFw4/Us8qFQxGBkln+T+3+1//32XbdvOM29eHwDi4uJ5/Pg1xYs7oKurq+k/OjoWY+OUF+ZMrR8hRPbx8jolj/nISQwNDSnsUiTd++vr6+Nc2CXVdiMjI1yLlciMaELkatOn7yQ2Np6xY9fj4mJL8+aVOHv2HhMndgRg69ZzhIREMnBgY5YvP8rjx4E8exZMbGw8FSq4MGFCB3R0dLh37wWzZ+8jNDQShUKH3r0/588/T5KQoKZLl3m4uNgycWIHfvppCxs3Dgdgx44LbN58FgAnJ2t++ulLbGzMPtiPEEJAHrx8JoTQvtGjE0c0V6wYhJdXd2Ji4lCpYjXtKlWs5nuVKpa4uHhmz+7FypWDuXPnOY8evf7/449Tu3Zp1q79hjlzemFtbca33zbHycmajRuH4+XVnYQENQkJiQPekZEqNm8+y5QpnVi1ajA2NmZ4e19Nsx8hhAApioQQWeD96ItCoUjXSEylSkVxdLTC3NyYwoVtefz4NW/ehPPkSRAdO1bHyMgAJycbatQoqTkmpXNfvPiQggWtKVvWGTMzY5o2rcjff9/9YD9CCPGeFEVCiGwRH5+Qrv0UisRC5/3kbD093WT7pDYTMj5eje5/VmlXKHSIi4v/YD9CCPGeFEVCiCxXtKgdL1+GolLFEBoaia9vQJrHODvboFDosHfvP8THx/PuXSTXr/vj6GhFSEgkcXHxJCQkLbQ8PEoQEPAGf/9AoqNjOXr0JrVrl86qlyWEyGPy9UTr3Oj8iX1p7pMZd6gJ7SpXoxdfdWzEj2N7p2v/b8fO5cGjZxzaMYeoqGjmL9vKV+0b4VqkYBYn/bD3V7dKl3bC0dGKXr0WoVDoYGtrQcFUor0fwTEyMmD06FbMm+fN9u0XSEhQ0717Hdq0qYaTkzU9eizEycmGn37qqDnW3NyY1q2rMm7cBhQKHSwsTOjfv+EH+xFCiPfy9S35+ZXckv9xtHFL/rwlWyjvVpxGn1dN1/47950iJDScvj1aEhQcSqGy7Tmyay6f166UZRk/dEt+akJCIjA3N07xklhq1Go1oaGRmJkZJVkAMjw8CmNjgxTPpVLFoFTGYGNj9lH5hBDZR27JF0Kki7OTPQVsLACIjIxiy64TNG34GafOXOem7yM+r12ZRp9X1RQEDnbWGBomrruzY+9JAPYfOstj/xcUsLGkTYva2nkh/8Pa+uOLFB0dnRSPMzdPvbg3MjKQdYiEEB9N5hTlIum5dCbyhsm/ruLA0QsAhIZFMGjkb7hW6MzYnxbzz7V7tO7iyZgfF2n237LrBPOXbAHg0LGLAJw8c52tu05w/NQ/2f8ChBAiF5KRIiFyiakT+jF2WFd0dXWZt2QLsxZuZs4v36JQJP3dZtm8sRQq256ZU4dk6eUzIYTIa2SkSIhc4vNalTSPsajgXoLAoBACg0K1G0oIIfIQKYqEyIUMDBIHedWkfp9EBu+hEEKIfEeKIiHymPeTr2Nj47ScJHNERkaxevU+4uI+7fVk9PjM8s8/d4mMjMq08z148Iw9e06zZ89p/P1fprpfTEwsBw6cY8mSHfzzz91U9/tUaZ0/p7z/Hyu9729+FRkZlSU/T9omRZEQeYy1lTnl3YuzbbcPTwNec/P2I21HypCHDwPo23c6gYEhmX78vXtPaNNmXEYjpunevSe0a/c9b9+GZdo5fX392LDhMAMGzMDb+1yq+33//RJGjpzPrVuPOX/+dqb1n97zZ/Tz+5Cs/PzS+/5mRHb9/GWFN2/e0a7d99y790TbUTKVTLTOZtOnTEBHR4fxP/2s7Sgih3u/8OGHnh2mQ8pt34/sjuekJaze4I1HNTdOH1iU4n65QcWKJYmLO62ZT5USpVKFiYnRRx+vVEbj43Ml07KmJDDwLV98MYalS8dSuLBDivuEhUViYWGaYltsbBxxcfEYGxsm2d62bT3atq1Hu3YfXufl2LHLeHkNpV27j1tTKr3SOn96Pj/48GeY2vuTlZ9fet/fxBypZwft5E/aT+r5VKpojIwMk339Xmo/fy4ujixdOpYvvhjD+fPLsbOzzprw2UxGirLJpvWrGdinC0t/n0twcJC244gc7tb5tXw/sgcATo62xASdoGb1cpr2OjUqEBN0AkcHGwDm/TqcQzvmaNo7tWvAw6ubeXprOyf2Lsje8JnEz+8FFhaNsbBojLV1s2SP9Bg0yItRoxbQqNEwTE0bUr16Px48eJbu4+fM2cTnnw8lPFyp2e/69QeZ/jrmzNlMgwZVaNky6VpRSqWKgQNn4ODQEkvLJlhYNCYgIFDTHh0dw7BhczAwqIeJSQP69PkZlSo63f2OGbMQC4vG3LjxkPbtv8fCojG//bYh015XWudP6/0HKFy4HWvW7Kd48U6YmjZkxIi5mra03p/s+vxS4+//kqFDf6Nw4XaYmjbkyy9/IDDwbY7Jn1a+8PBIevWair19SxwcWlK4cDuMjRsQHR0DpO/nr2XL2tSvX5m5c//KtNzaJiNFmeDS+bNERkZga2/P8SMHiY2JpVnL1pQrX0mzj6GhERUqVcH39s1M7/+dUsXU7T4cvvaQd1HRdKrpzk8d62P5gd9cROYLfvOO0tW6fXCfCu7FuZHG5azH1//C0iLjKzErFAocHWxyXK70Klq0II8ebeXBgwBq1x6UrD0iIopNm46wbdsvbN8+nTZtxrFt2wnGj++VruMHD25PhQol6NBhPI8ebQXA2to801/H8eP/8O23XybbvmTJTk6evMbNm+uws7Pm+fMgnJ3tNe0LFmzF2/scV66swczMmFatxuLtfY4OHeqnq9+pUwfg6dmD4sU7sWnTFKpXd/vgaMbHSuv8ab3/AAEBgQwfPpd1636iWLFCmhsIIO33J7s+v9RYWJjSsmUt5swZzsuXb2jefBS7dp1m4MC2OSJ/WvnWrj2Iv/9LXr3ax5o13kyZspLIyOOaRWDT+/NXp04FlizZyfTpgzMtuzZJUZQJdu34i3Wr/wCgmkdNLl84x/zZv3Lk1CVKl3UHoEOnrgBcOHcm0/sfvfYgh2/8+w/a1nO3UathTq/mmd6XSJ1tAUve+O3XdoxkcmqutOjo6GBnZ827d5Gp7jNxYh+aNk18BEvz5jW4evV+uo83MTGiQAFLgCwb+n/3LoJLl+5QvnzxZG0FCljw8mUw+/efpU2bukn+wQRYv/4QVauW5unTVwCUL1+M7dt90l0UmZgYYWJihLGxIQUKWGb6a0zr/On5/ADWr59EmzZ1k21P6/3Jjs/vQ2xsLDSjfzY2FjRr5sGJE/9oig5t508r3/37TylbtigmJka4uRUFSLIKfHp//ipUKMGlS3cID4/E3DzlS8C5iRRFmaRY8ZL8tesgDo4FCQp8TbP6Hhw/ekhTFGWl/xZE7+/QPnL9YZb3K4S2/Xe+lbm5SYqXaLTpzZt3AFhYmCRr69WrBZGRKubN20LfvtPp0aMZixeP0fzD4uf3AktLU/buTfxFysrKXPOPaF5SpIhjitvTen+0LSoqmu+/X8zq1fuxtDQjJiaWunUratq1nT+tfN27N6Nx4+HExydw4sQVxo3rkWQh2PT+/FlaJo4ev3kTlmM+m4yQOUWZpFBhFxwcEx/7bWfvQL36jTh14qgWkqhBR01MXLwW+hZC/FexYoWwt7fG19c/WZtCoeCbbzpy/fpaLl1aydmzt1i0aIem3dXViUqVSrFixXjNHy+vodmYXrvSen+0bdasjRw8eIGbN9fz7NkuPD17JGnXdv608hka6uPq6kTZskU5eHAOo0d3TdKe3p+/O3f8sbe3pmjRgln6erKLFEVZxNLSimfPsudWxaYV/jM0r6MD6KAGus3fyuvQiGzJIERuZG9vTXi4knv3nqBUqnj27HWm99GsmQfXriWfQBsaGk5QUOJt6iVLFsbIyCDJSNfXX7dkzZr97Np1iri4OCIilJqRp/8VExOrmSD7sXbvPsXevX9/0rFZKa33B9L3+WXG60vp/Y2KisbJyRYrKzMOH77A5MkrUan+3Ufb+dPKN2/eFszNTTAw0GP37tP8/vs2fH39NO3p/fm7fv0hLVrU/Oh8OZUURVnk5ImjlCxZJlv6mt2rOU0rFMfi/2+Z/LKGO8d/6oOdhQkNpq5i85nMn9wtRHb5wIoESYb7dXR0kj0HLq3jCxWyo3PnRpQp0xVHx1YsWrQ9I1FT1KtXC37/fVuSO38Ajhy5lOTOnypVSjFy5Fea9m++6ciQIR1o3/57bGyaY27emNWrU54b9t138zEyqs+NGx9/2XzJkp307//rRx+XXh96/83NTVJdciKt9wfS9/llxutL6f3t168VT5++xsqqKUOGzGL06K68fPkmx+RPK1+/fq04c+YGBw6c59KlO2zYcBh39+6EhyfOAUvPz9/r129ZuHArPXo0++h8OZWOOoPPAti07wB1atTPpDi504RxIzh54ijzFq3EyNiILRvXsmbFUlZv3E6jJi0AeP36JTHRMYwY2hd7ewcmTP4Vc3NzrKxt0t3P+RP7qNGg1Udl87ntx6i1BynpWIAFX3+Bg5UZhW2NP+oc+Z2Xlxej+nloO0aOM2flBTw9s2btm+wWFBSClZU5+vpZM81y4cKt7N17Bm/vWejp/dtHdHQMz54FUrSoY5Lt/xUdHcPLl29wdrZLdZ+M+OWXNQQEBLFkydhMP3dGpef9gQ9/fln5+hISEggMDMHRsUCK7drO/6F8deoMpn//1vTp0xJIvAzm5tYNf/8dSeZ5pfbzFxcXR7Nm39GuXT2GDev00dkAvLxO4emZ9jpQ2UkmWmeSt8HB9PqqLRER4QBM/uU3TUEEMHJIP86c9tF87713Fz369Gf6b1m7hkx9d1d8JvVl4l9HaThtNVM6NeK7VlWztE+Rv6nV6g+uXqxWq1Gr1SmO6rxnZ2f1wfbM9t+7f7Ii/7BhnXj2LBB//1eUKOGs2W5oaJDk+5QYGhpk6XyNcuWKJZtvklOk5/2BD9+9lZWvT6FQpFoQgfbzfyhfxYol2Lz5KBYWpvj5vWT58t307v1Fsonvqf38PXr0nKpVy3xyQZRTSVGUSSpXq86fm3byJjiIArbJf6PbtMNbS8nAwsSQBV+3xOe2H9/9eYAjN+6zemgbHKxy/50CIucJD1dSoULPVNsTEtTo6Hx4pe779//S3NWS3bIq/8yZ32RaxszUtm3eGO1LTW5/fVmVf8aMIezZ8zdHj16iRAlntm37hXLliqX7+NKli+TYn+mMkKIoE+np6WnuQMuJ6ru7cmJSX6bvPIHbqCUs6teCLrWzfskAkb9YWJjy+nXuWxfpvdyeX4j0MDc3pXv3ZnTvnnfmA2UGKYoyQfmKlSnoVEjbMdLFytSITSM7sOfyfb5evIdNZ26zYnAr7FJYR0UIIYTIT+Tus0zQpXsfvh2Zu5503KZaKe7OG0psXDxlRi5mz+X7aR8khBBC5GFSFOVjdhYmeP/QlQVfN6fPoj10X7CT0EiVtmMJIYQQWiFFkaB73XLcmTuEwHdKyoxcwtEbfmkfJIQQQuQxMqcolzl/Yl+a+3zsWkYADlamHPmxO38cvUr7WVv4qpY78/s0w9RI/1NiCiGEELmOLN6YD6W1eOOz4DC6zt9BwJtw1n7blnpuLtmULGfy8vLSdgQhhMiTctrijVIU5UPpWdFarYb53hf4YdMJBjepyozuDTHQ082GdEIIIYR2yJyiXCQ9l84yi44OjGzpwfXfBuJz259KY//gqt+rbOtfCCGEyG5SFIkPKlnQhou/9qNTzbLUmriaX3b8TXxChgYXhRBCiBxJiiKRJj1dBVM6f86pKb1ZdfwaNSes4vHr1J8NJYQQQuRGUhSJdPushBM3Zw+iarGCVBiznOVHr2g7khBCCJFppCgSH8XEUJ8lA75gy3cdmbjZh9Yz/iJCFaPtWEIIIUSGSVGUzeLi4rQdIVN8UaUEvnMGo6vQofr4VTx89VbbkYQQQogMkaIoGzx94k/fHl/i5upAsYIWdO3wBX+uXJbrCyRbCxN2jevM6NY1qD95HTsv3tV2JCGEEOKTyYrW2eDZU3+CAl8z+ZffsHdw5MTRQ/z4/XdER6sYOHSEtuNlWL+GlahX1oW2M7dw0vcps3o2Rk9X6m0hhBC5iyzemAkunT9LZGQEtvb2HD9ykNiYWJq1bE258pWAxEtmenr/1p9qtZoGNSvhWqwEqzduT3c/50/sS/ERHu+UKqZu9+HwtYe8i4qmU013fupYH0sToxTPk57FGz9FVEwc/Zfu5eGrEHaM6UQhG/Ms6UcIIYTICvLrfCbYteMvenVpxxcNa+Fz/AjzZ//KFw1rce/ObYAkBRFAfHw8ga9fYWlllSn9j157kK3nbvMuKhqAreduM2WbT6ac+2MYG+ixYXh7BjauQvXxK+XBskIIIXIVKYoySbHiJbl08xE79h3jn9t+2NrZc/zooRT33bp5HRER4bTr+FWm9H34xqNk245cf5gp5/4U/RpW4uCEbgxavp9fdvyttRxCCCHEx5CiKJMUKuyCg2NBAOzsHahXvxGnThxNtt+Jo4fw/O4bvu4/hPqNmmZZHm2vOV3exZ6rMwfgc/sJnedsRxWTuyeVCyGEyPukKMoilpZWPHv2JMm2UyeO0rtre7r17MtPP8/MtL6aVij+n+8Sy6GmFUtk2vk/lYWJIYcmdKOwrQW1Jq7mxdtwbUcSQgghUiVFURY5eeIoJUuW0Xy/Y+smenRuw9ARY/h19kJ0dTPvifOzezWnaYXiWBgbAjqYGOjTpmrpTDt/RigUOszu1YTRrWvy2fiVXHr4QtuRhBBCiBTJLfmZ5In/Yy5fPI+RsRFbNq7l8aMH/DhtBpBYEI0c2o8vWrejYeNmXLpwVnNc+QqVMTYxyVDfliZGrBjcTvP9iVt+TNl2grpli6Kr0MnQuTNL97rlcLW3ot1vW1jcvwVtP8sZRZsQQgjxnhRFmeRtcDC9vmpLRETiJaLJv/xGoyYtAHj6JPEuLO+9u/DeuyvJccfOXKFkqTJkpgblXFn/93VWHLvMoCafZeq5M6JWaWfOTOtDw6nreRMeRd+GlbQdSQghhNCQoiiTVK5WnT837eRNcBAFbO2S3IY/cswPjBzzQ7bmmda5Ec2m/0n76m7YW5pma98fUtTeivO/fE3zXzbiFxjKtC71tR1JCCGEAGROUabS09PDwbFgsnWJtMHJxpy+DaowbbuPtqMkY29pyumpfThz7xk9FuwiIUHb98oJIYQQUhRlivIVK1Ozdl1tx0jmm2YeXHr0nMuPnms7SjKmRvocmtCdqJg4ui3YKYWREEIIrZOiKBN06d6Hb0eO03aMZAz0dPm1axPGrj9EfA4sOvT1FGwd1RE9hYI+i/dIYSSEEEKrpCjK4xqUc6WonTWrT1zRdpQUKRQ6rP22LQkJavos3kPGnsQnhBBCfDopivKBX7o05veD53kbEaXtKCn6b2E0aPl+bccRQgiRT+mo1Rn73XzTvgPUqVE/k+KIDzl/Yl+69qvRoFWybbP3nuXZm1Dm9fmCwrbGmR0t0/T6fTeOVmbM7NFI21GEEELkM1IU5RMxcfHUm7SSZQPa0Kqaq7bjpCo+QU3zXzbSqWZZBjauou04Qggh8hG5fJZPGOjpMrlTA8bl0EnX7+kqdNg1tjOLD11m58W72o4DQHx8PH369KFPnz707duXyZMn4+/vr+1YGkePHmXMmDGfdKxKpWLevHkkJCRkciohhMh9pCjKR5pXKomNuTFLDl/WdpQPen+7vuf645y/r/3lBNRqNUqlku+++46ffvoJGxsbJkyYkKSQUKlUpGfQNSEhAZVKleL2qKiU53zFx8cTExOT6jmrV6/OsGHDkm1PqR8gST8xMTGcPXs2WVEUFxdHREREqn2mdu7Y2Fji4+OTbFOr1anuL4QQOYn2VxkU2cqre1PazNxAl1ru2Fpk7JlrWcnByhTvH7rQ/JdNnJrSCycbc21HwsHBAUdHR3r37s3ff/9NYGAgRkZGTJ8+nadPn2JkZESbNm3o0KEDZ8+eZcuWLRQpUoTLly/Tr18/Hjx4wLFjx1AoFBgZGTFjxgwcHR3ZsWMHmzdvBsDJyUlTeA0fPhwbGxt8fX1RKBR07NiRTp06Jcvl6+vLnj17mD59OmfPnmXt2rXo6ekRGBiIo6MjEydOxN7enhMnTrBs2TLNccOHD+fgwYMA9OjRA4A1a9Ywc+ZMbt26hUKhwMDAAE9PT9zd3T947tDQULy8vHj06BEANWrUYNSoURw6dIjVq1cDUKpUKQYPHoyTk1OWfk5CCPGpZKQon3GxtWJg4yqMW39M21HSVMLRhlVDWtN25haiY+PTPiAbqNVqTWFja2vL/v37cXJyYu3atcyaNYstW7YQHh5OTEwMr169wtXVlWnTpuHo6MixY8dYvHgxmzZt4rvvvkNfX5/IyEg2b97MlClTWLVqFTY2Nnh7ewOgVCqxt7dn1apVTJ48me3btycbhYHE0Zn3IzExMTEolUqGDBnCxo0bsbS05PTp0wCsWLGCwYMHs3nzZmbNmoWNjQ2jR48GYO3atWzcuBEjIyN69erFhg0b2Lx5M02bNmXTpk1pnnvfvn3o6uqydOlSVq1ahZubGyqVirVr1zJjxgw2btyIs7Mz+/al72YBIYTQBhkpyod+7FiXEsMWcenhCz4rkbN/a6/n5kIHjzL0XbKHDcPbazXL6NGjiY2NxczMjPHjx6Onp8fJkycxMzNjxowZmv2uXElcE6pw4cK0a9cOgOjoaPT19fHy8sLDw4N69epRoEABTpw4QcGCBSlbtiwATZs2Zc2aNZqRm7p162JmZkaZMmVISEggKCgIR0fHD+Z0cHDA3d0dAHd3dx4/fgyAq6sra9eu5enTp1SvXp0yZcoQFhYGgEKhQKFI/B0pJCSE5cuX8+LFC1QqFfb29mme28fHh4EDB2JjYwNA8+bNOX36NPHx8axduxaAt2/fEhERwcCBAz/l7RdCiCyX4aKoa6sWmZFDZLO5fZrSf+k+rv02EB0dbaf5sPHta9NqxmYWHbzMN82raS3HxIkTcXFxwdT03wfshoWF0bVrV1xcXDTb7OzsNIXRe4aGhixatIjjx49z7do1tmzZwqxZs4iPj0dXV1ezn0KhIC4uLtMy//fckydPxsfHh+vXrzN58mR69+5N7dq1ATTzoUJDQ/n1118ZNGgQ1atXx9fXlw0bNqR57oiIiGTP/AsKCsLZ2Znu3btrtuWE5wIKIURq5PJZPvVVLTfMjQ1YfjRnrnT9vzaP7MCCAxe1OvHa2to6SUEEULJkSS5dukSRIkUoXrw4MTExKU5QfvXqFf7+/nTo0IEpU6ZgZmbGw4cP8fDwICAgAH9/f6Kjozl69KimUMlsx44do0GDBowePRoPDw/u3r2LqakpCoWC169fk5CQoBk5qlatGsbGxty4cSNd53Z1dWX//v1EREQQGxvL2bNnKVeuHE+fPkWtVlO8eHGcnJwICAjIktcmhBCZQX5ty8dWDG5FnR//5KtabliZGmk7zgeZGRmwfXQnWs3YzNWZA7A2y768Oh8YShsxYgQbN26kf//+qFQqdHV1mTp1arL9YmJi+O2334DEEZaSJUtSr1499PT0aN26NePGjUOhUGBhYUH//v3T1ffHZt+5cycrV67ExMQEKysrxo0bh66uLi1atNDc0r9mzRqqVKnCgAEDUCgUSS6dfejcw4YN4+eff6Zv374oFAoqVKjADz/8wKBBg1i6dCmBgYGoVCpq1aqVZUWfEEJkVIYXbxS526g/jxAZHcOygS21HSVdFnhf5OhNP/Z4fqXtKEnEx8cTHh6OlZXVB/cLCQnBzMwMfX39JNtVKhVKpVIzJyervB/FMjMzS9Y/gJFRYrEZGhqKvr5+spGxtISHh6Orq4uJSdI7G8PCwjAyMsLAwOBTowshRJaToiifC4+Kofiw3zn6Yw8qFEl9VCAnaTJtAx09yjC4aVVtRxFCCJGHyJyifM7c2IBZPRvTf+lebUdJt00j2uO1+yz3XrzRdhQhhBB5iBRFgl6fVwBg1fFr2g2STrYWJvz5TVs6z9lOTFzOWL9ICCFE7idFkQBg+aBWjN94nPCo1B8nkZPUc3OheaXiTNzso+0oQggh8giZUyQ0hq44gIGeLvP6NNV2lHSJi0+g0tjlLBvYktplCmdpX7HBPll6/sygb1sfLy8vPD3raTtKPlVT2wGEEBkkI0VC45cuDdhw+ia+AcHajpIueroK1g9vT6/fd6OKybwFD4UQQuRPUhQJDWszI37u0oAhf3hrO0q6VSrqQJfa7oxae0TbUYQQQuRyUhSJJAY2rkJYVDTbzt/RdpR0m9SpHid9n3D8lr+2owghhMjFpCgSSejowNIBXzB81aEc82T6tBjo6bJheHv6LNpDmDJa23GEEELkUlIUiWQ8ShaiWaVi/LLjb21HSbdKRR3oVqccI9Yc0nYUIYQQuZQURSJFM3s0ZsnhyzwNfqftKOk2pfPnnPJ9is/tJ9qOIoQQIheSokikyM7ChPHtazN8Ve4ZeTHU12XF4Fb0W7KX2LgEbccRQgiRy0hRJFI14gsPbgcEceTGY21HSbcG5YpSrXhBvHaf0XaUHCk+Pp6EBCkYhRAiJVIUiVTpKnRY3L8FQ1ccyFUjL/O/bsZ874s8Cw7TdpQcY/78Lbi7d0dPry4FC7Zm2LA5XL16P8V91Wo1Q4b8RtWqX2dzSiGE0C4pisQHNalQDDdnO+Z5X9B2lHRztDJjYse6DM5F6y1ltQMHztGyZS327fuNGTOGcPjwRT7/fCgREcpk+06ZsoqlS3dy5co9LSQVQgjt0dN2AJHzLezbjApjltOnfkXsLEy0HSddvm3+GauOX2P3pXu0/ay01nJs2XmcB48DCA2NwMbGgrYtauNWxlXTrlar2bnvNOcv3cLM1JiK5UuiVKro+mVjzT43bj3kwNELvA0Jo1L5knRq1wA9Pd2PyrF372/o6//7v7uZmQmdO0/E19ef6tXdNNvXrTvIlCkr6devNStX7s3AKxdCiNxHRopEmlxsLfmmWTXGrjuq7SjppqvQYcXgVgxbdQhldKxWMqjVanoMnIbP6au8DQ1j177TVKrblzPnb2r26T3kF7r0ncTJM9e5cfsRnXr/yLdj52raN2w5TLUGA9jt/Td+T17Se8gvjBy/4KOz/LcgAggKCgXA0tJUs+3kyav06jUVb+/ZSQolIYTIL6QoEukyoUMdDl9/zIUHz7UdJd0+K+FE4/KuWltvSUdHh7d+3hzZNZeVC7/n3JElVK5Qiu17fAA4dvIfNm8/xooFnlw4toxta39mgdcIzfEhoeEM95zPtAn9OXt4CVvWTGXXxl/ZtO0o0dExn5wrNDSc+fO38NlnZSlduggA9+49oXXrsSxaNIYWLeTBpkKI/Ekun4l0MTHU57eejRn8hzdXZw7Qdpx0m9mjEaVHLqZfw0oUc7DO9v7vPnjCH3/u5abvY54GvCYwKITSJQsDcOEfXwC+bFs/xWNv3XlMeISS23f9GDNxEQCRShXhEUr+Pn+TRp9X/eg80dExdOz4Ay9fBrNnj5dm2xdfjKF//zYMHdrhE16lEELkDTJSJNKte91yGOrp8qfPDW1HSTdbCxMmd/qcgcv2Z3vfZ87fpFbTIbx5+44Rg79k65qpNKhbWdMeEx2Ls5MdJiZGKR4f/CZx4cySxQvjVNAWp4K2lCzuzIzJg3EuZPfReZRKFZ06TeTSpTv4+CzSjBIplSoeP37OihV7sLBojIVFYwYNSiyYLCwas3mzPGxXCJE/yEiR+ChLB7ak2c8b6FSzLCaG+tqOky5Dm1Vj8aHL7Lhwlw4eZbKt3/2Hz2JvZ83WP6eho6MDQAEbS017g3pVmD5nHS9eBePkaAtAbNy/z5tzLVIQgPp1KlG3ZsUMZQkODqVdu+958uQVFy+upEyZIpo2c3MTTp5cnGT/3btPMWfOZvbtm0Xp0i4Z6lsIIXILKYrER6lU1IHW1UoxddtpZnRvqO046fJ+0nW3BTtpWaUkhvofd+fWp3Iv40pgUAj7D5+juGshjvpcZttuH7p0bARAzc/cAajTbCgDv25DwPMglq/Zg7lZ4h1+5d2K4VHNjQHDZ7J49mjKlHLBz/8lqzd6M3JwJ8q5FUtXjri4ODw8BvD48XM2bZpCUFAIQUEhABQoYImbmyv16lVKcszdu4mPSvnf7UIIkZfJ5TPx0X7t1pA/jl3hSVDueS5a7TKFqVvGhek7s2/SdftW9fiiSQ069JhAxdp92LTtKGVLF9W0Gxjoc/rAItzKFGXTtmNEKlUM7NMGS4vEO8J0dXXZvGoyFdyL07zjaIqW70SD1sPxveuPhYVpKr0ml5Cg5vHjxAnyXbtOol69oZo/v/zyZ4rH/P/AlhBC5Cs6arVare0QIveZvfc8p+88Zde4ztqOkm4vQyJwH7WUa78NwMXWMu0D/iM22OfT+339hvj4BJyd0p4H9PU3v/LmzTv2bJ6RZHt0dAwvX7/FroAlpqbGKR6rb1sfLy8vPD3rfXJWkRFy154QuZ1cPhOfZHiL6iw98g8nfZ/wuVuRtA/IAQpam/FD+9qMWH2YnWM7ZV+/DgVSbWvWYRSFnR0o7GTPTd9H7Dlwhv1bZibbz9DQgKIujlkZUwgh8j25fCY+ib6egnl9mjJ0xQHiE3LPYOOILzy49Swwxzzktl3LeiiVKq7euI9zIXtOH1hEkwafaTuWEELkSzJSJD5ZyyolWeB9icWHLjOsRe74h1xfT6F5yO3deUPRVWh38syQfu0Y0q+dVjMIIYRIJCNFIkMW9W/OT3/5EBKh0naUdGtSoRjuznYsPHBR21GEEELkIFIUiQwp4WjD1w0qMX7jcW1H+SgL+jbjlx1/ExSW/CnxQggh8icpikSGTe5Uj50X73LraZC2o6Sbi60lg5pUzXXFnBBCiKwjRZHIMAsTQyZ2rMvY9Ue1HeWj/NC+NgeuPuSa/2vNtmv+rwmNzD2XAoUQQmQeKYpEphjarBp3nwdz4pa/tqOkm+Yht8v/fS5an8V7mLdf5hoJIUR+JHefiUyhq9Dht56NGb76EDdnD9J2nHTrVqccC7wvsu7UTXrWK8+9F284e+9Zsv3mrLyghXQfx9OzPgBeXqe0GySf8vSUxRuFyO1kRWuRqap6rmBkSw961iuv7Sjpds3/Nc1+3oDfomGY9vSiqJ0lfouGaTuWEEKIbCYjRSJTLezbnM5zt9OpRlmMDHLuj9eGUzcZsuIAPeqWZ1zbmrT9rDT9l+7D0sQQ/xSe6ZaRx3xkF3nMh7bJSJEQuZ3MKRKZqlZpZ6qXcGK+d86el9O9XnlaVS3JkiP/4Prt71x6+IIdF+6iVquxNDHE5/YTbUcUQgiRzaQoEpluTq8meO0+y9uIKG1H+aCNI9qzemhr9PV0ufbkNWogTBmDKiaOa/6vtB1PCCFENpOiSGS6ovZWdK3tztRtp7UdJU196ldky8gOWJoYERMXBzoQHRfH33eTT7YWQgiRt0lRJLLEtC71+dPnOv6BodqOkqZ21UvjM7knxgYGgBrUOlx/8jrN44QQQuQtUhSJLGFjZszIlh78sOmEtqOkS6WiDvjOGUSpggXQ0YGHr0K0HUkIIUQ2k6JIZJkxrWty+Ppj7j4P1naUdClqb8WF6X0p62wLIJfQhBAin5GiSGQZUyN9vm9Xi+835J7ni1mZGnF7zmBGt65BucJ22o4jhBAiG0lRJLLUt80/48LD51x8+ELbUT7KrJ6NsTI1ytA5lEoVR05c4u/zNzIpVcacPXuTgIBAnj59xfnzt1Lc58yZG5w+fS3Z9gcPnrFnz2n27DmNv//LVPuIjIxi9ep9xMXFZVZsjfTkF0KIjJCiSGQpIwM9fuxYlwm5ZG5RZtm66wSF3TvSsvM4uvSdzIYth3F268DbkLBPOl9UVDQz5q3H70nqBUlaJk9eiY/PFU6dusbkySuTtUdHx9CixSjq1RuKUpn0obi+vn5s2HCYAQNm4O19LtU+Hj4MoG/f6QQGZv6crLTyCyFERklRJLLcoCZVuffiDad8n2o7SrZZtGIHPbs0Q/nyKE9ubqVs6SIMG9gRI0ODTzpfRGQUP/2ykqcBn35XnIGBHvr6iX8MDPSTtZ88eRUAc3MTjh27nKStbdt6/PXXNGrWLPfBPipWLElc3GmcnFK/9BgWFklqTxeKjY0jKir6k/ILIURGSVEkspyuQodpX9Vn7Pqj2o6SLTZuPcLZC7dISEhg3V+HuH3HD0sLMxzsrTE2NgQSR5Ju3n7Eq9dv2b7nJN5HzgPw5Nkr5i/dyg9TlzF/6VZu3n4EwI69JwHYf+gsqzd4s+fAmY/O5erqRJEijhQp4kjRogWTtW/f7kP37s3o3fsLduw4+VHn9vN7gYVFYywsGmNt3YyEhIRk+yxfvhsHh5ZYWjbB0rIJCxdu1bRFR8cwbNgcDAzqYWLSgD59fkalSlocpZVfCCEyKuc+nErkKT3rlWfGrjN4X3nIF1VKaDtOltp36CwAZy7c4uHj55ibmaCjo8PAEb/Ro3Mz9PR0+fGXFVhamHH1xn0AqlUuQxFnByrX60vlCqUo716MQ8cvMdVrDW/89nPoWOJjU06euc6tO36UKlGYNi1qf1SuCRN6Y21tDpCsqIiNjWPTpiP89dc09PX16NBhPEuXjsUwnSNbRYsW5NGjrTx4EEDt2oOStW/depxBg7xYvtyTr75qTESEEl1dXU37ggVb8fY+x5UrazAzM6ZVq7F4e5+jQ4f66covhBCZQYoikS0UCh2mdanPD5uO5/miaPm8cWzb7cMvEwfQvLEHANv3JB95UUXHcHL/QqpXLYtaDTPmrQfglPdCTTFy7mLihOJl88ZSqGx7Zk4dwue1K31SLkfHAil+DXD69DXCw5XExMQSH59AeLiSEyeu0Lx5jXSdW0dHBzs7a969i0yxffHiHfTu/QUDBrQFwMLCNEn7+vWHqFq1NE+fJj5epXz5Ymzf7pOkKPpQfiGEyAxy+Uxkmy9rlAVg58W7Wk6SM3Tv1ISa1cuhq6uLnp4uFcslFos9B/3Mxq1H8HvykprVPzyHJ7Ps3HkKe3trZs/exMyZ63F2tmfHDp9MO7+vrx8NG1ZNtd3P7wWvXr1h794z7N17Bisrc5yd7TOtfyGESA8ZKRLZaupX9Zmy9RTtq5fRdpQcp1WzWqxbNpElq3bRZ+h0AIYP+pJZP3+j2Se1CcoZERcXx59/erNmzUTNyMzevX/TvftkFi0ag75+xv+aKFmyMCdOXKFXrxYptru6OlGpUikWLPguw30JIcSnkpEika3aVCtFdGwc3lceajtKjqOjo8NXHRrhs28hoU8O8JNnHxYs28aLV8Ho6SXOv4mNzfz1f86du0V4uJImTT7TbGvUqBrh4UpOnbqWbP+YmFiio2M+qo++fVuxZs1+1q49gEoVjVKpIjg4VNP+9dctWbNmP7t2nSIuLo6ICCVv3rz71JckhBCfRIoike0md/6cH//y0XaMHGfKjNXMXbyFh4+fEx6hRKlUYW5mgoG+PtZW5pR3L8623T48DXituSstM+zefZr27T/H3PzfeT4mJkZ06tSQ3btPJ9v/u+/mY2RUnxs3khe2Ojop99Gnzxf88ssgeveehrFxA0xNG7J48Q5N+zffdGTIkA60b/89NjbNMTdvzOrV+zP+4oQQ4iPI5TOR7Tp6lOWHjSc4esOPxhVctR0n06VWGKSlqIsjoyb8juekJQDU8ijHn0snYFvAEoDvR3bHc9ISVm/wxqOaG6cPLMqUvLNmDUtx+5YtPyfbtmuX1wfPVby4M2r12WTbFQoFP/zQm3HjuvPq1Vvs7KyS3Nmmr6+Hl9dQpk7tz8uXb3B2tkNPT/56EkJkLx11VkxSECING/++xaKDlznzcx9tR0mX2GCfbOknISGB10EhGBkaYG1lnmJ7YFAotgUsNZfU3tO3rY+XlxeenvWyJav4XzW1HUAIkUFy+UxoRZda7gSFKfPVKtfpoVAoKOhQIMWC6H27o4NNsoJICCFExklRJLRCodDhhw61mbY9+ZwVIYQQQhukKBJa06NueR68fMuVx6+0HUUIIYSQokhoj56ugh861GbqtlPajiKEEEJIUSS0q2+DSlx4+JzHr0O0HUUIIUQ+J0WR0Co9XQVDm1Zj5u5z2o4ihBAin5OiSGjdN82rsenMLd5GRGk7ihBCiHxMiiKhdTZmxnxVy52FBy5pO4oQQoh8TJaMFTnCdy09qPPTGr5vVxtD/Zy3Bs+clRe0HSFNnp71AfDykonr2uDpKYs3CpHbyYrWIsdoMX0T7auXZmDjKtqOIoQQIh+SokjkGIevP2bIH948XPjtJz8/LKtk12M+MkIe86FtMlIkRG4nc4pEjtG0YjGMDfTY9899bUcRQgiRD0lRJHKU0a1rMs/7orZjCCGEyIekKBI5Src65bj86AUPX73VdhQhhBD5jBRFIkcx1NdlQKMqzNsvo0VCCCGylxRFIscZ/sVnrPG5jjI6VttRhBBC5CNSFIkcx8XWkrplXVjjc13bUYQQQuQjUhSJHGlo06osPnRZ2zGEEELkI1IUiRypZZWShKti+PvuM21HyZB7D59y7eYDbccA4OzZmwQEBPL06SvOn7+V4j5nztzg9OlrGe7rwYNn/PPP3QyfJzul5/0RQuRtUhSJHEmh0GFg4yqsOHZV21EyZMnKXXhOWpLh80RFRTNj3nr8nrz85HNMnrwSH58rnDp1jcmTVyZrj46OoUWLUdSrNxSlUpWRuOzadYo5czZn6BzZLa33RwiR90lRJHKsvg0qseWcL5EqmXAdERnFT7+s5GnA608+h4GBHvr6iX8MDPSTtZ88mViAmpubcOxY6pcuP1QwhYdHfjBDbGwcUVHRaWb9UB9hYan3ERMTS0zMh39eUjt3Wu+PECLvk6JI5FgFrc1oVM6VtaduaDtKptmy8zi/zF7L2B8X8+vc9fje9UvS/uTZK+Yv3coPU5cxf+lWbt5+BMCOvScB2H/oLKs3eLPnwJmP7tvV1YkiRRwpUsSRokULJmvfvt2H7t2b0bv3F+zYcTJJ26BBXowatYBGjYZhatqQ6tX78eDBv5c2nz59RcWKvbCwaELx4p04cybpZxYdHcOwYXMwMKiHiUkD+vT5GZUqaXFUuHA71qzZT/HinTA1bciIEXM1bUqlioEDZ+Dg0BJLyyZYWDQmICBQ0x4SEkbnzhMxNPwcQ8PP6dx5IiEhYenOn573RwiR90lRJHK0/o0q5fpLaO+p1Wp6DJyGz+mrvA0NY9e+01Sq25cz528CcPuOHyWrdGXj1qMEBoeydvMh6rcaDsChY4nrNp08c52tu05w/NQ/H93/hAm9qVy5FJUrl+KHH3olaYuNjWPTpiO0aVOHtm3rsn37CaKjYzTtERFRrFixB0/PHoSEHMLIyIBt205o2mfP3oSJiRF3725i164ZnDuXdE7OggVb8fY+x5Ura7h//y/OnbuFt/e5JPsEBAQyfPhc5swZxo0b6xg6tIOmbcmSnZw8eY2bN9eRkHAGX9+NODvba9rHjPmdR4+ec+nSSi5eXMm9e08ZO3ZRuvOn9f4IIfIHPW0HEOJDWlctRf+l+7j5NJDyLvZpH5CD6ejo8NbPGzMzYwASEhKo2WQI2/f4ULtGeXbuPwXAKe+FGBoaAHDuYmJxsWzeWAqVbc/MqUP4vHalT+rf0bFAil8DnD59jfBwJTExscTHJxAeruTEiSs0b15Ds8/EiX1o2tQDgObNa3D16r/PqNux4yRz5gyndOkiAIwe3ZXr1x9q2tevP0TVqqV5+vQVAOXLF2P7dh86dKifJMf69ZNo06ZusuwFCljw8mUw+/efpU2bukkKori4OFat2sf69ZOoVq0sAGPHdqNnz6ksWzYOXV3dNPOn9f4IIfIHKYpEjqZQ6DCgURWWHP6Hxf1baDtOht198IQ//tzLTd/HPA14TWBQCKVLFgagYrkSAPQc9DPtWtalZvVy1KxeLlty7dx5Cnt7a2bP3gSAs7M9O3b4JCmKdHR0NF+bm5uQkJAAwNu3YQQEBFKhQvEU9wXw83uBpaUpe/cmXvazsjKnQAHLZDmKFHFMMV+vXi2IjFQxb94W+vadTo8ezVi8eAzm5qYEB78DoEqV0pr9q1YtA8CbN++wt7f5YH4hhHhPLp+JHG9QkyqsPXmD6Nh4bUfJkDPnb1Kr6RDevH3HiMFfsnXNVBrUraxpb9WsFuuWTSQwOIQ+Q6dTulo3xkxclOQcarU603PFxcXx55/eLFkyllOnlnDq1BIWLx7D5s1HiY2NS/N4GxsLihUrxJ07TzTb/neys6urE5UqlWLFivGaP15eQ9OdUaFQ8M03Hbl+fS2XLq3k7NlbLFq0AwBb28Ti6vr1f5c+eP+1jY1FuvsQQggpikSOV8TOkmrFC7Lt/B1tR8mQ/YfPYm9nzdY/p/FVh0bUrF6OAjb/jpbo6OjwVYdG+OxbSOiTA/zk2YcFy7bx4lUwenqJl4DSU6R8rHPnbhEerqRJk8802xo1qkZ4uJJTp66l6xzNm3uwcOFWXrwI4urV+yxYsDVJ+9dft2TNmv3s2nWKuLg4IiKUvHnzLt0ZQ0PDCQoKAaBkycIYGRloRnr09PTo0qUx8+dv5e7dJ9y548+cOZvp1q0penoyGC6ESD8pikSu0KteBdaezN13obmXcSUwKIT9h89x5/4TFi7fzrbdPpr2KTNWM3fxFh4+fk54hBKlUoW5mQkG+vpYW5lT3r0423b78DTgteautMywe/dp2rf/HHNzU802ExMjOnVqyO7dpzXbFIp//7rQ0dFJ8v3IkV9x69ZjChVqS5s246hduwIKxb+Xq775piNDhnSgffvvsbFpjrl5Y1av3p8kh7m5SbLLbu8dOXIJe/uWODi0pHDhdlSpUoqRI7/StM+dOwJ9fV3Klu2Km1s3TE2NmTNneJJzfCi/EEIA6KizYjxeiEwWoYrBvv8c/BcNw97SNO0DMllssM8nHTdy/ALu3PPn0I45KJUquvWfgveR8wBUq1yGSKWKiuWKs3bpRP7ceIBRE34nPEIJQC2PcowZ1pVWzWoBsHXXCTwnLSHgRRAe1dw4fSDppTV92/p4eXnh6Vnv019oBsTHx/P69VsKFrRNtbiJjo7h5cs3ODvbffQoTnR0DM+eBVK0qGOqxwYHh6JQKLR02aymFvoUQmQmKYpErtFjwS4qFnVgbJvs/8fnU4uilLx8/Yb4+AScneyStSUkJPA6KAQjQwOsrcxTbA8MCsW2gKXmktp72i6KhBRFQuR2Mn4sco3e9Suwxue6tmNkWEGHAikWRJB4iaegQ4EUC6L37Y4ONskKIiGEEBknRZHINRqXL0aYMpqrfq+0HUUIIUQeJEWRyDV0dKBHvfKsO3VT21GEEELkQVIUiVylZ70KbDh9k/gEmQonhBAic0lRJHIVN2dbCttacOTGY21HEUIIkcdIUSRyna61y7H5zG1txxBCCJHHSFEkcp0edcuz8+JdYuPk2VVCCCEyjxRFItdxsDKlsqsj+67cT3tnIYQQIp3kwUAiV+pWpxyb/r5N++plsqW/OSsvZEs/GeHpWR8AL69T2g2ST3l6yuKNQuR2sqK1yJVCIlS4DJ1P4IrRGBtIbS+EECLj5PKZyJWszYyo71aUHRfuajuKEEKIPEKKIpFrda3jLnehCSGEyDRSFIlcq331Mvj4+hMeFaPtKEIIIfIAKYpErmVsoEeTCsXYfuGOtqMIIYTIA6QoErla55pubDnrq+0YQggh8gApikSu1vaz0py++5S3EVHajiKEECKXk6JI5GrGBno0q1icXRfvaTuKEEKIXE6KIpHrda7pxrbzMq9ICCFExkhRJHK91tVKcfruU7kLTQghRIZIUSRyvfeX0GQhRyGEEBkhRZHIE+QSmhBCiIySokjkCXIJTQghREZJUSTyBGMDPZpWKMbef+5rO4oQQohcSooikWd08CjD9vMyr0gIIcSnkaJI5BltPyvNsVt+xMTFazuKEEKIXEiKIpFnGBvoUauUMweuPtR2FCGEELmQFEUiT2lfvQw7ZXVrIYQQn0CKIpGntK9eml2X7hGfoNZ2FCGEELmMFEUiT7G1MMHd2Y5Tvk+0HUUIIUQuI0WRyHPa/f9okRBCCPExpCgSec6XNcqy9Zysbi2EEOLjSFEk8hxXeyuszYy48viVtqMIIYTIRaQoEnlSu89Ks/uyXEITQgiRflIUiTyp7Wel2S3zioQQQnwEKYpEnlS9hBNBYUpevA3XdhQhhBC5hBRFIs9qXbUU2y9k/Flo8fHx9OnThz59+tC3b18mT56Mv79/xgNmkqNHjzJmzJhPOlalUjFv3jwSEhIyOZUQQuQ+UhSJPKvtZ6Uy5RKaWq1GqVTy3Xff8dNPP2FjY8OECROSFBIqlQq1Ou0FIxMSElCpVCluj4qKSvGY+Ph4YmJiUj1n9erVGTZsWLLtKfUDJOknJiaGs2fPJiuK4uLiiIiISLXP1M4dGxtLfHzSZ8+p1epU9xdCiJxET9sBhMgqjcq78tXcHbxTRmNpYpjh8zk4OODo6Ejv3r35+++/CQwMxMjIiOnTp/P06VOMjIxo06YNHTp04OzZs2zZsoUiRYpw+fJl+vXrx4MHDzh27BgKhQIjIyNmzJiBo6MjO3bsYPPmzQA4OTlpCq/hw4djY2ODr68vCoWCjh070qlTp2S5fH192bNnD9OnT+fs2bOsXbsWPT09AgMDcXR0ZOLEidjb23PixAmWLVumOW748OEcPHgQgB49egCwZs0aZs6cya1bt1AoFBgYGODp6Ym7u/sHzx0aGoqXlxePHj0CoEaNGowaNYpDhw6xevVqAEqVKsXgwYNxcnLK8GchhBBZQUaKRJ5loKdLs0rF8b6SeQ+IVavVmsLG1taW/fv34+TkxNq1a5k1axZbtmwhPDycmJgYXr16haurK9OmTcPR0ZFjx46xePFiNm3axHfffYe+vj6RkZFs3ryZKVOmsGrVKmxsbPD29gZAqVRib2/PqlWrmDx5Mtu3b082CgOJozPvR2JiYmJQKpUMGTKEjRs3YmlpyenTpwFYsWIFgwcPZvPmzcyaNQsbGxtGjx4NwNq1a9m4cSNGRkb06tWLDRs2sHnzZpo2bcqmTZvSPPe+ffvQ1dVl6dKlrFq1Cjc3N1QqFWvXrmXGjBls3LgRZ2dn9u3bl2mfhRBCZDYZKRJ5Wttqpdh9+R5d67hn+FyjR48mNjYWMzMzxo8fj56eHidPnsTMzIwZM2Zo9rty5QoAhQsXpl27dgBER0ejr6+Pl5cXHh4e1KtXjwIFCnDixAkKFixI2bJlAWjatClr1qzRjNzUrVsXMzMzypQpQ0JCAkFBQTg6On4wp4ODA+7uia/X3d2dx48fA+Dq6sratWt5+vQp1atXp0yZMoSFhQGgUChQKBJ/RwoJCWH58uW8ePEClUqFvb19muf28fFh4MCB2NjYANC8eXNOnz5NfHw8a9euBeDt27dEREQwcODAT3n7hRAiy0lRJPK01tVKMWLNIeIT1OgqdDJ0rokTJ+Li4oKpqalmW1hYGF27dsXFxUWzzc7OTlMYvWdoaMiiRYs4fvw4165dY8uWLcyaNYv4+Hh0dXU1+ykUCuLi4jKU87/+e+7Jkyfj4+PD9evXmTx5Mr1796Z27doAmvlQoaGh/PrrrwwaNIjq1avj6+vLhg0b0jx3REQEenpJ/zoJCgrC2dmZ7t27a7b97z5CCJGTyOUzkadZmhhSwcWB47f8Mnwua2vrJAURQMmSJbl06RJFihShePHixMTEpDhB+dWrV/j7+9OhQwemTJmCmZkZDx8+xMPDg4CAAPz9/YmOjubo0aOaQiWzHTt2jAYNGjB69Gg8PDy4e/cupqamKBQKXr9+TUJCgmbkqFq1ahgbG3Pjxo10ndvV1ZX9+/cTERFBbGwsZ8+epVy5cjx9+hS1Wk3x4sVxcnIiICAgS16bEEJkBvm1TeR5baqVYs/l+zSpUOyTjtfRSX2EacSIEWzcuJH+/fujUqnQ1dVl6tSpyfaLiYnht99+AxJHWEqWLEm9evXQ09OjdevWjBs3DoVCgYWFBf37909X3x+bfefOnaxcuRITExOsrKwYN24curq6tGjRQnNL/5o1a6hSpQoDBgxAoVAkuXT2oXMPGzaMn3/+mb59+6JQKKhQoQI//PADgwYNYunSpQQGBqJSqahVq1aWFX1CCJFROur03EcsRC7mFxhKnR/X8HzZyCzrIz4+nvDwcKysrD64X0hICGZmZujr6yfZrlKpUCqVmjk5WeX9KJaZmVmy/gGMjIyAxMto+vr6yUbG0hIeHo6uri4mJiZJtoeFhWFkZISBgcGnRhdCiCwnRZHIF9xHLWXD8PZUKuqg7ShCCCFyKJlTJPKFttXkWWhCCCE+TIoikS+8n1ckhBBCpEaKIpEveJQsxNPgd/KAWCGEEKmSu89EvqCj8+9o0eCmVT/6+Nhgn8wPlcn0bevj5eWFp2c9bUfJpWpqO4AQQstkpEjkG62rlmLvPw+0HUMIIUQOJUWRyDeaVizGqTtPUEbHajuKEEKIHEiKIpFvmBjqU69sEQ5ff6ztKEIIIXIgKYpEvtKmWin2/iN3oQkhhEhOiiKRr7SuWpI9l+8jS5YKIYT4X1IUiXzFycacInaWXHjwXNtRhBBC5DBSFIl8J/EuNLmEJoQQIikpikS+06pqyXxbFMXHx5OQkPDBfaKjY5BHIgoh8iMpikS+U7VYQd6ER+Wr1a3nz9+Cu3t39PTqUrBga4YNm8PVq/8Whq9fv6Vz54k4OLTEyKg+CkVtevWaSmho/nmPhBBCiiKRL7WqWpIdF+9qO0a2OXDgHC1b1mLfvt+YMWMIhw9f5PPPhxIRoQTg1as33Lv3lKlTB3DixO8sX+7JunUHGTPmdy0nF0KI7COP+RD5Uuuqpfj94CW+bf5ZlvazZedxHjwOIDQ0AhsbC9q2qI1bGVdNu1qtZue+05y/dAszU2Mqli+JUqmi65eNNfvcuPWQA0cv8DYkjErlS9KpXQP09HQ/Ksfevb+hr//v/+5mZiZ07jwRX19/qld3w93dlWvX/kRHRweA+vWrsH27D48eyYR0IUT+ISNFIl9qWrEYZ+49y9LVrdVqNT0GTsPn9FXehoaxa99pKtXty5nzNzX79B7yC136TuLkmevcuP2ITr1/5NuxczXtG7YcplqDAez2/hu/Jy/pPeQXRo5f8NFZ/lsQAQQFhQJgaWkKgJ6enqYgUipV7N37N4cOXaB37xYf3ZcQQuRWMlIk8iUDPV3quxXl4LVHdPAokyV96Ojo8NbPGzMzYwASEhKo2WQI2/f4ULtGeY6d/IfN24+xYoEnvbo2B2Dpql1MmPYHACGh4Qz3nM+0Cf3xHNkdAO8j5+k5cBqzf/4GQ0ODT8oVGhrO/Plb+OyzspQuXSRJ24ULt6lRYwAAw4Z1onfvLz6pDyGEyI2kKBL5VutqiXehZVVRBHD3wRP++HMvN30f8zTgNYFBIZQuWRiAC//4AvBl2/opHnvrzmPCI5TcvuvHmImLAIhUqgiPUPL3+Zs0+rzqR+eJjo6hY8cfePkymD17vJK1ly7twpEj87l924+RI+dhZWXG1KkDProfIYTIjaQoEvlWqyolmbDpBGo1/P+Vo0x15vxNGrQeTpsWtRkx+EtcnB2YPGOVpj0mOhZnJztMTIxSPD74zTsAShYvjOl/9pkxeTDOhew+Oo9SqaJLl5+4dOkOPj6Lko0SAVhZmdO48Wc0bvwZb9+GMXXqKiZP7odCIVfahRB5nxRFIt9ysjHHxdaS8w8CqFnKOdPPv//wWeztrNn65zTNfJ0CNpaa9gb1qjB9zjpevArGydEWgNi4eE27a5GCANSvU4m6NStmKEtwcCjt2n3PkyevuHhxJWXKJC+I/lfc/2eRNYuEEPmFFEUiX2tdtRT7/nmQJUWRexlXAoNC2H/4HMVdC3HU5zLbdvvQpWMjAGp+5g5AnWZDGfh1GwKeB7F8zR7MzUwAKO9WDI9qbgwYPpPFs0dTppQLfv4vWb3Rm5GDO1HOrVi6csTFxeHhMYDHj5+zadMUgoJCCAoKAaBAAUvc3FxZtmwXDx4848svG+DkZMu5c7eYPv1PevZsjq7ux93pJoQQuZUURSJfa12tJF8v3sMvXRtk+rnbt6rH1l0n6NBjAgDVKpehbOmimnYDA31OH1jEtN/WsGnbMapULMXAPm3wPnwOAF1dXTavmsx34xfSvONozXHVKpfBwsI03TkSEtQ8fpx4a33XrpOStHXr1pQNGyZTqJAdP/30B7Nnb0rSNn/+yI992UIIkWvpqGVsXORzdv1mc/23gTjZmKe6T2ywzyef/+XrN8THJ+DslPY8oK+/+ZU3b96xZ/OMJNujo2N4+fotdgUsMTU1TvFYfdv6eHl54elZ75NyqtVqgoNDefMmDGdnO8z+f8Qq/6ip7QBCCC2TkSKR73XwKMOOi3ezbCHHgg4FUm1r1mEUhZ0dKOxkz03fR+w5cIb9W2Ym28/Q0ICiLo5Zku89HR0d7OyssbOzztJ+hBAip5JbSkS+16pKSfb980ArfbdrWQ+lUsXVG/dxLmTP6QOLaNIga1fZFkIIkTIZKRL5XrNKxem2YCfK6FhMDPWzte8h/doxpF+7bO1TCCFEymSkSOR7/13dWgghRP4lRZEQ/Lu6tRBCiPxLiiIh+HdekdyLKYQQ+ZcURUKQuLp14QIWXHiQuJ6Pz+0nzNt/QcuphBBCZCcpioT4f62qltJcQvv94CXWnLyh5URCCCGyk9x9JvK1IX8cQAdYPKAFLauUYOCy/YxtU5P9Vx5QupCtZr85K3P+qJGnZ30AvLxOaTdILuXpKYs3CpHfSVEk8rWvarnRYMo6jt/2Z9OIDrwMjWCNz3Vi45NOLvL09NRSwo+TW3IKIUROJI/5EPne9xuO47X7LFYmRpQsaI1fYCjBYUo61ijLttFfAhl7zEd2yehjPoSMFAmR38mcIpHvzejekKrFChIaqeLG00DeRqgAHcoVttd2NCGEENlIiiIhgG2jOmJkqEd0bDwJCTJ4KoQQ+ZEURUIARe2t2DS8PaaG+oAURUIIkR9JUSTE/2tXvTRtqpVCV1f+txBCiPxI/vYX4j8W92+BtYkx6ICVqaG24wghhMhGUhQJ8R9WpkYc+ak7AA6WZlpOI4QQIjvJOkVC/I9KRR04Obkn9dyKaDuKEEKIbCRFkRApyIyCSKlUcebCTYyNDalTo0ImpMqYs2dv4uLiQEJCAi9eBFOjRjlN2/nztwgMDAGgWDEn3N2LoaOjk+5zX758Bysrc0qUcP6k/oUQIieQy2dCZIGtu05Q2L0jLTuPo0vfyWzYchhntw68DQn7pPNFRUUzY956/J68/ORMkyevxMfnCqdOXWPy5JVJ2mbMWMd33y3g99+3U6vWIBwdW3Hv3pN0n3vu3L/YufPkJ/cvhBA5gRRFQmSBRSt20LNLM5Qvj/Lk5lbKli7CsIEdMTI0+KTzRURG8dMvK3ka8PqTMxkY6KGvn/jHwEA/WfuAAW04fHgeoaGH8fBwZ968Lcn2iYmJJSYm9sNZI5Sf1L8QQmibXD4TIpNt3HqEsxduUcG9OOv+OkTViqWwtDDDwd4aY+PEO9q27jpBmZIu2Nlaay6xfdGkBk+evWLX/tO8DnyLg70NDetWobx7cXbsTRyF2X/oLI/9X1DAxpI2LWp/VC5XVyeKFHEEoGjRgqnup1AoUCh0SEhI0GwLCQlj0KCZbN16HIBOnRqybNk4rK0tNPucO3eL0qW7cP/+U0qVcmHPHi9Kl/73MmR6+xdCCG2RokiITLbv0FkAzly4xcPHzzE3M0FHR4eBI36jR+dm6Onp8uMvK7C0MOPqjfsAVKtchiLODlSu15fKFUpR3r0Yh45fYqrXGt747efQsYsAnDxznVt3/ChVovBHF0UTJvTG2tocSLkoWbfuIJcv3+H06eu4ubny+++jNW1jxvzOo0fPuXRpJWo19O//K2PHLmLFivGafc6cucHBg3OxtDSlT5+fmT17E8uXf5/u/oUQQtukKBIiky2fN45tu334ZeIAmjf2AGD7nuTzbVTRMZzcv5DqVcuiVsOMeesBOOW9EMP/v8x27uItAJbNG0uhsu2ZOXUIn9eu9Em5HB0LpPj1e+7urjRu/BmGhgacOnWNCxdu4+xsT1xcHKtW7WP9+klUq1YWgLFju9Gz51SWLRuHrq4uAKNGdaFy5VIAfPddFwYPnpmkKEqrfyGE0DaZUySElnTv1ISa1cuhq6uLnp4uFcuVAKDnoJ/ZuPUIfk9eUrN69t2hVaVKaQYObMuGDZMZPborQ4fOIj4+nuDgd5r296pWLQPAmzfvNNsUin//OnFzK0pgYAghnzixXAghtEGKIiFyiFbNarFu2UQCg0PoM3Q6pat1Y8zERUn2Uauz57lsxYo5ERgYwps377C1tQTg+vUHmvb3X9vY/DunKDY2TvP1jRuPKFXKJcmcIyGEyOmkKBIih9DR0eGrDo3w2beQ0CcH+MmzDwuWbePFq2D09BIvUf238MhsSqWKFy+C2LHDh/Hjl9K79xfY29ugp6dHly6NmT9/K3fvPuHOHX/mzNlMt25N0dP79wr8jBnruHr1Pn5+L5g/fwstW9bKsqxCCJEVpCgSIoeYMmM1cxdv4eHj54RHKFEqVZibmWCgr4+1lTnl3YuzbbcPTwNec/P2o0zvf9q01RQq1JYff/yDnj2bM3v2ME3b3Lkj0NfXpWzZrri5dcPU1Jg5c4YnOb5x489o3vw7ihX7kpcv3zB8eKdMzyiEEFlJJloLkck+YiHoJIq6ODJqwu94TloCQC2Pcvy5dAK2BRIvX30/sjuek5aweoM3HtXcOH1g0YdO91F27fL6YLujYwFOnVpCcHAoCoUiyWUzgA0bJgOQkJDA8+dBODvbf9SK2EIIkRPoqLNrkoIQuVhssE+29JOQkMDroBCMDA2wtjJPsT0wKBTbApaaS2rv6dvWx8vLC0/PetmSNe+pqe0AQggtk5EiIXIQhUJBQYfUb1dXKBQ4OthkYyIhhMg/ZE6REEIIIQRSFAkhhBBCAFIUCSGEEEIAUhQJIYQQQgBSFAkhhBBCAFIUCSGEEEIAUhQJIYQQQgCyTpEQ6TJn5QVtR0iTp2d9ALy8Tmk3SC7l6SmLNwqR38mK1kIIIYQQyEiREOmSXY/5yAh5zEdGyUiREPmdzCkSQgghhECKIiGEEEIIQIoiIYQQQghAiiIhhBBCCECKIiGEEEIIQIoiIYQQQghAiiIhhBBCCEDWKRIiS917+JSoqGgqlS+p7SicPXsTFxcHEhISePEimBo1ymnazp+/RWBgCADFijnh7l4MHR0dbUX9JB96fUIIkR4yUiREFlqycheek5Zk+DxRUdHMmLcevycvP/kckyevxMfnCqdOXWPy5JVJ2mbMWMd33y3g99+3U6vWIBwdW3Hv3pOMxs5WH3p9QgiRHlIUCZELRERG8dMvK3ka8PqTz2FgoIe+fuIfAwP9ZO0DBrTh8OF5hIYexsPDnXnztqR6LqVS9ck5wsIiU22LiYklJib2g8en1ndar08IIdIiRZEQ2WjLzuP8MnstY39czK9z1+N71y9J+5Nnr5i/dCs/TF3G/KVbuXn7EQA79p4EYP+hs6ze4M2eA2c+um9XVyeKFHGkSBFHihYtmOp+CoUChUKHhISEJNsLF27HmjX7KV68E6amDRkxYi4Ab9+GYWHRmKtX72v2Xb/+IFWrfq35XqlUMXDgDBwcWmJp2QQLi8YEBARq2kNCwujceSKGhp9jaPg5nTtPJCQkTNM+aJAXo0YtoFGjYZiaNqR69X48ePDsk16fEEKkRooiIbKJWq2mx8Bp+Jy+ytvQMHbtO02lun05c/4mALfv+FGySlc2bj1KYHAoazcfon6r4QAcOnYRgJNnrrN11wmOn/rno/ufMKE3lSuXonLlUvzwQ69k7evWHeTLL3/AwaEl795F8uOPXydpDwgIZPjwucyZM4wbN9YxdGgHAGxsLGjYsCp//XVUs+/q1ftp3/5zzfdLluzk5Mlr3Ly5joSEM/j6bsTZ2V7TPmbM7zx69JxLl1Zy8eJK7t17ytixizTtERFRrFixB0/PHoSEHMLIyIBt20581OsTQoi0yERrIbKJjo4Ob/28MTMzBiAhIYGaTYawfY8PtWuUZ+f+UwCc8l6IoaEBAOcu3gJg2byxFCrbnplTh/B57Uqf1L+jY4EUv37P3d2Vxo0/w9DQgFOnrnHhwu0khQvA+vWTaNOmbrJjv/66JQMHevHLL4N49eotx4//w4oV4zXtBQpY8PJlMPv3n6VNm7pJzhsXF8eqVftYv34S1aqVBWDs2G707DmVZcvGoaurC8DEiX1o2tQDgObNayQZmUrP6xNCiLTISJEQ2ejugycMGvkbtZoOwaXcl1y9cZ/gt+8AqFiuBAA9B/3Mxq1H8HvykprVs+8OqipVSjNwYFs2bJjM6NFdGTp0FvHx8Un2KVLEMcVjmzevQVRUNKdOXWPbthM0bFgVV1cnTXuvXi349dchzJu3BVvbFvTsOYXw8MS5RcHB7zT9v1e1ahkA3rx5p9n237vhzM1Nkl3eE0KIjJKiSIhscub8TWo1HcKbt+8YMfhLtq6ZSoO6lTXtrZrVYt2yiQQGh9Bn6HRKV+vGmImLkpxDrVZnS9ZixZwIDAxJUpR8iKGhAQMGtGHTpiOsXXuA/v3bJGlXKBR8801Hrl9fy6VLKzl79haLFu0AwNbWEoDr1x9o9n//tY2NRWa8HCGESBe5fCZENtl/+Cz2dtZs/XOaZtSjgI2lpl1HR4evOjTiqw6NUCpVzFn8F1O91jDq268wNjIEIDY2LsvyKZUqXrwI4vz52/z44x/07v0F9vY26T6+R4/mVKnSB4A2beokaQsNDSc2Ng47O2tKliyMkZGBZqRHT0+PLl0aM3/+VipVKoVarWbOnM1069YUPT35K0oIkX1kpEiIbOJexpXAoBD2Hz7HnftPWLh8O9t2+2jap8xYzdzFW3j4+DnhEUqUShXmZiYY6OtjbWVOeffibNvtw9OA15q70jLTtGmrKVSoLT/++Ac9ezZn9uxhSdrNzU0+uKBj5cqlcHNzZfDg9piaGidpO3LkEvb2LXFwaEnhwu2oUqUUI0d+pWmfO3cE+vq6lC3bFTe3bpiaGjNnzvAk51Ao/v3rSkdHJ8n3QgiRGXTU2TUeL0QuFhvs80nHjRy/gDv3/Dm0Yw5KpYpu/afgfeQ8ANUqlyFSqaJiueKsXTqRPzceYNSE3wmPUAJQy6McY4Z1pVWzWgBs3XUCz0lLCHgRhEc1N04fSHppTd+2Pl5eXnh61vv0F5oB4eGRFCrUFh+fRUnmB70XHR3Ds2eBFC3qmOoIUHBwKAqFQkuXzWpqoU8hRE4iRZEQ6fCpRVFKXr5+Q3x8As5OdsnaEhISeB0UgpGhAdZW5im2BwaFYlvAEj093SRt2iqKXr9+y44dPuzefRojIwN27fLK1v4zjxRFQuR3csFeiGxW0CH128UVCkWa7Y4O6Z/nkx2ioqK5e/cJzZp5MGBAm7QPEEKIHEqKIiFEhhQtWpD587/TdgwhhMgwmakohBBCCIEURUIIIYQQgBRFQgghhBCAFEVCCCGEEIAURUIIIYQQgBRFQgghhBCA3JIvRLrMWXlB2xHS5OlZHwAvr1PaDZJLeXrK4o1C5HeyorUQQgghBHL5TAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACkKJICCGEEAKQokgIIYQQApCiSAghhBACgP8Dzh6GaC6WzRwAAAAASUVORK5CYII=\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"person-class.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Spend a few moments to see how many differences you can see between the above two diagrams.\n", + "\n", + "With dictionaries, we have **keys** and **values** (for example, \"age\" and 24, respectively). With objects created from a class, the analogous features are called **attribute names** and **attribute values**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Classes and Attributes\n", + "\n", + "At a minimum, we can create class with two lines, as in the following example (remember that `pass` is a placeholder that does nothing -- we'll eventually write a lot of code inside classes):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# create a new type\n", + "class Person:\n", + " pass\n", + "\n", + "# create an instance of that new type\n", + "p = Person()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With dictionaries, we use brackets (\"[\" and \"]\") to update values. With objects from classes, we use the \".\" operator." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#update.png\n", + "d = {}\n", + "d[\"first\"] = \"Alice\"\n", + "\n", + "class Person:\n", + " pass\n", + "\n", + "p = Person()\n", + "p.first = \"Alice\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"update.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Attribute names are a little more restrictive than dictionary keys. Only things that would be valid variable names work as attribute names. In contrast, keys can contain spaces and special characters (or, a dictionary key might be an int, or some other non-string type!).\n", + "\n", + "The restrictions on attribute names provide an advantage: we don't put quotes around attribute names (and indeed, Python wouldn't let us if we tried)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Functions and Methods\n", + "\n", + "It often makes sense to have a few functions related to the same type of data. Let's see an example with dictionaries." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alice Anderson is 24 years old\n", + "Bob Bryson is 25 years old\n" + ] + } + ], + "source": [ + "#dict-functions.png\n", + "p1 = {\"first\":\"Alice\", \"last\":\"Anderson\", \"age\":24}\n", + "p2 = {\"first\":\"Bob\", \"last\":\"Bryson\", \"age\":23}\n", + "\n", + "def birthday(d):\n", + " d[\"age\"] += 1\n", + "\n", + "def full(d):\n", + " return d[\"first\"] + \" \" + d[\"last\"]\n", + "\n", + "birthday(p2)\n", + "birthday(p2)\n", + "\n", + "print(full(p1) + \" is \" + str(p1[\"age\"]) + \" years old\")\n", + "print(full(p2) + \" is \" + str(p2[\"age\"]) + \" years old\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAHmCAYAAABUL3hqAACRhklEQVR4nOzddXhUxxrA4V82rsQTIETR4O5SNLi7FW2hRQqUlkKR0l6gFC1WKO5aihcoBHd3CRICIQJR4snePygLSzzZJCT53ufy3O6ZOTPfnt3sd3RGS6lUKhFCCCEySZHTAQghhMgbJKEIIYTQCEkoQgghNEISihBCCI2QhJJFvLy8CAsLS7Q8Pj6ehw8fZmnfPj4+REREZGkfWSE7to1IGx8fHwICAnI6DJHLZDqhxMfHM3LkSEaOHMmoUaP47bff8PHxSbKuv78/Q4YM4c2bNym2+fjxY/bs2ZPZ0LKkzTNnznDp0qUU65w4cYKlS5eira2dqCwkJISZM2dmOo6UzJ8/nydPnmRpH+m1bNkyNm3alGKdsLCwZLdNVnwnskNOxp2WbZ4cPz8/pk6dmit3TETO0cgRSmRkJIMHD2bUqFFYWFgwbdo0krob2dLSkm+//RYDAwO15dHR0Wr1AwICuHDhQpr6Tetdzym1GR0dnaY2AO7du5fiXnR4eDibNm3iq6++wsjIKFFZWiiVSt68eZPke4uOjk5XvAAJCQlERUWla50PZWbdd9q1a0eTJk3UlkVERBAXF5dk/Yx+J5RKJbGxsYmWp+eHMT4+Psk2lEplurd9cnFn5jNJLr64uDi17ZnUNk9KUu+rcuXKVKpUKcMJSeRPOppqyMbGBhsbG7p06cL58+cJDAzkn3/+ISwsjKCgIJ4/f863337LzJkzWbhwISEhIXz//fcUL16cu3fvYmhoSP/+/SlXrhwrV64kISGBIUOGULhwYSZMmKDW16tXr5gzZ47qkLxTp040adKEV69eMXHiRBYuXAjAgwcPWL16NT///HOiNocNG8b333+Ps7Mzjx49wtLSkj59+lCqVClOnjzJpUuXGDFiBAB79uwhODiYmjVrcubMGQA8PT1p1KgRnTp1Uovt5MmTuLi44OjoqFp27949Fi5cSHR0NArF+xx+8eJFdu/eTeHChbl27Rrdu3cnPDycv/76S1WvQ4cONGnShPj4eJYsWcL169cB0NfXp1mzZrRs2TLFz2Xfvn38/fffANjb2/PNN99gbGzMyJEjmTx5MjY2NsyZMwdXV1fatm3LmTNnOHnyJN9++y0PHz5k0aJFREZGYmVlRZcuXShXrlyScdepU0fV57vPtlmzZhw/fpzSpUtjaGiIkZER7dq14/Xr18yZMwd/f38UCgUKhYJvvvkGa2trAObMmZPu74RSqWTVqlWcPXsWeLvzMnnyZLy8vFiyZAnR0dHo6+vz1VdfUaJEiSTfw4EDBzA3N+fBgwcoFApatmxJq1atVJ/35s2bAXB1daV3797Y29uzbt06te/4u236TlJxJ/WZmJubJ/rsJkyYQOnSpbl+/Trx8fHMmDGDFStWcP78eXR0dKhQoQL9+vUjNjaW2bNn4+PjQ0JCAgULFmTy5MkcOnQIIyMj2rZty9ChQ9XarlSpEoMGDUr2fQG0bduW77//nl69eqGnp5fi90wI0GBCgbd/1CdOnEChUGBhYUF0dDQPHjygW7du2NnZYWJiQkJCgqpuQkICVatW5euvv2b//v0cOHCAcuXK0a9fP/bu3cvkyZOT7OfQoUPY2toyfvx4nj59ypw5c6hXr16iPbS4uDjVXuDHbYaEhJCQkMBnn33GiBEj2LlzJ5s2bWLKlClq68HbPfTo6Gjc3NyoUaMGhoaGdO3aNcnYvL29qV69uup1fHw8CxcupFatWrRv3x4/Pz9++eUXAGJjY/H396dmzZp4eHhQoEABoqOjqVOnDiYmJty5c4e5c+fSuHFjDh8+jJeXFxMnTqRgwYLMmzePmJiYFD+PiIgI/v77b8aMGUPhwoX5448/+Pfff+nYsSM2Njbcu3cPY2Nj7t69i6+vL23btuX27du4ubkBsGnTJtq2bUu9evW4dOkSmzZtoly5cknG/fH3ICEhgdDQUL7++muMjY3Zu3cvurq6AKxevRozMzO+/fZb9PX1+fbbb4mPj1etn5HvxL1797h27Rrjx4+ncOHCnDhxAoCNGzfi4eFBkyZN2LdvH1u2bOHHH39M8j3s3LkTGxsbhgwZgq+vL7NmzaJ58+bExcWxdetWxo8fT6FChdiwYQOHDx+mV69eib7jHyeGj+NO6TP5WFRUFI8fP6ZPnz6YmJhw//59vLy8mDlzJvr6+vzvf//jxo0bBAUFERISwoIFC1AqlaojoqioKHR1ddHS0mLx4sUAPHr0iJkzZ9K0aVOio6OTfV8AFhYW2Nra4uPjg6ura4rfNSFAgwll8uTJxMXFYWxszLBhw9DRedt07dq1qVatGgChoaGJ1nu3Z1uqVCkOHz6sVqalpZVkX+fPn6dfv34YGhpSsmRJLC0tuX79utpRQXI+bvNdbE2aNOHo0aOpntLQ0tJS/UuKt7c3n332mer1y5cviY6OpnXr1ujr62NiYqJWv1ChQnh4eKhe+/v7s2LFCry9vVXXmmJiYrh9+zZVq1alcOHCABgbG6f6Xq9evYqtrS3FihUDoF69emzZsoWOHTtSpkwZ7ty5g5aWFtWqVePGjRu8ePGC+/fvM2DAAIKDg3n27BmXL1/m8uXLxMfH8+rVK0JCQpKMOyl9+vRJcvn9+/cZMmQIZmZmAKrvyjsZ+U6cOnWKqlWrqr4DDRo04PXr1/j7+9OoUSN0dXVp1KgR+/btU30Pk3oP1atXx9jYmKJFi5KQkMDr16959OgRCQkJbN26FYDg4GDevHmj+uH98DuenHdxp/SZJKVDhw6ULFkSgBUrVhATE8Py5cuBt9ecLl++TP369QkJCWHx4sW4u7tTq1atJNsKDQ1l7ty59OzZEycnJ86dO5fi+wKws7Pj2bNnklBEmmgsoYwcOZLChQsnum6QVh+eCgJURzJJSUhIULvgraWllWL9tLT5bm//3RHOh3vMH0vpus3HsbyLU19fP9X4AH777TdKly7NDz/8gIGBAd988w3wNoF8vI1SEx8fr7adtLW1Ve+rbNmyLFu2jLCwMJo1a4aRkRGenp6Ehobi5uaGt7c38PYH7UNpSWSpMTQ0TDYxfCg934nXr18n2qH4+DN8115avisfevXqFQULFlTbFkndcJGcD/tL6TNJSxwVKlSgbt26qmXGxsZYW1vz448/cu7cOY4cOcLOnTuZO3eu2rrx8fHMmzePypUrqxJ2Wt9Xer93Iv/S2DfF3Nw8w8nkYzY2NoSEhBAfH5/kj3eVKlU4duwYsbGxPH78mFevXlG+fHmsrKxQKBQ8f/6cuLg4rl69mmqbERERREdHc+DAASwtLTE2NsbBwQF/f3+io6MJDQ3l/v37au34+/sDSScWR0dHXr58qXptb2+PoaEhJ0+eJCEhgVu3biX7vt9djC9XrhwWFhbcuXNHVVahQgXOnTvH1atXuXr1Knfv3k11O1asWBFfX1+ePXtGTEwMx48fp2rVqgC4ubkRFhaGl5cXJUuWpEaNGhw7dgxnZ2e0tbUpXLgwOjo6PHjwACcnJxwcHHjx4oVGflzKlSvH7t27efDgAZ6enqne9QepfydKlCjBhQsXVNfVrly5QoECBbC0tOTkyZMolUqOHz+Ovb19ktcrUlKyZEmeP39OQkICTk5O2NnZ4evrm6Z1P447pc8kNe7u7ty4cQMLCwucnJwwNjYmMDCQu3fvoqOjQ8eOHRk1ahTR0dEEBQWprbthwwbi4+PVjj7S8r5evnyZpiN/IUDD11DS4+M91A9fOzs7Y2dnx9dff42dnV2i8+ZNmjRhxowZDB8+nISEBFq0aKG6c6xhw4b89NNPAKrTQ0m1OXLkSAC+/fZb1am6d8vc3NywsbFh+PDhqutBdnZ2wNtTZP/++y9fffUVdevWpVu3bmqxubi4cObMGerXr69a1rJlSzZu3MjGjRvVLtgmtU3atGnDkiVLUCgU2NraqsoqVapEYGAg69atw9zcHGNj40Snzz5mYmJCkyZN+Pnnn1EoFJiamtKjRw/g7WkmFxcXrKys0NbWxsXFBUNDQ8qUKQOAnp4eI0eOZM+ePezZs4fIyEgKFCiQ6qmdd+8jJe3atWPXrl0sXrwYV1dXdHR0MDY2ztR3wsPDAy8vLyZMmICOjg76+vpMmzaNLl26sHTpUrZt2waQ6OJ0Wry7WL127VoCAwOJjo6mSpUqaUoEScWd3GeSmmbNmhEZGckvv/xCeHg4cXFxdO/eHR0dHebMmYOhoaGqnpWVlWq9iIgITp48CcDXX38NvP2ejh07NsX3FRAQQEBAgNrfkRApUn7CwsLClLGxscmWv379WhkVFZVo+Zs3b5Jc/mGbQUFBysGDByvj4uKUoaGhSdYNDg5WxsXFJVkWEhKiTEhISLQ8MjJSOWzYMOX9+/fVlkdERCTbz8ciIiKUwcHBastiY2OVkZGRSqVSqYyOjlaOHTtW6e/vn6b2oqKilEFBQWmqm5TIyEjlmzdvMrz+x968eaParn5+fspvvvkmzeum9p2IiopShoSEqC2Li4tTBgYGJvtZpkdoaKgyJiYm3et9HHdmP5OgoCBlfHy86nV8fLzy9evXSX4n0yKp97Vo0SLlhg0bMhyjyH9y7AglLVLbA7ewsEhyeUqn3j5uU1tbG1NT0yTrfnz30ofeXVD+mIGBAb169WLx4sVMmjRJ1ca7vce0MDQ0TFQ/KCiICRMmqK5hlC9fPsWjnQ/p6+un+RpOUj5+biizLly4wIYNGzA1NUWhUNC2bds0r5vadyKp96qtra22x54ZyX1XUvNx3Jn9TD4+bffuSDqjPn5fJ06c4N69e8yYMSPDbYr8R0upzJ/zoSQkJBAQEKA6laVp/v7+mJmZafTHOCwsjJCQEAoWLJiui8KfolevXhETE0PBggVzOhSRhNevX6Orq5vhBCryp3ybUIQQQmiW3A8ohBBCIzJ9DWXp0qWaiEMIIYSGDB48OEf61chF+ZwKXgghhLqc3MmXU15CCCE0QhKKEEIIjZCEIoQQQiMkoQghhNCIHEkowcHB7N27l71796oNpPixrVu3qiaUyq2USiUHDx5UTfyUl2Tl5+Pt7c3SpUs5ePBgiqPxnjt3jhs3bmRJDLlVWv++IG9/P0X2y5KEMnfuXLp06cJnn32mmkzqQ3FxcYSGhnL48GFOnz6dbDtnzpzJkbnRU4s/PZRKJUFBQaoBK/OSrPp8rly5wsCBA7G2tubBgwe0bNkyyaTy+PFjRo8enWio9vwurX9fkLe/nyIHZHYwsD/++CPJ5SEhIcq2bdsqW7ZsqQwPD0+yzo4dO5Tbt2/PbAhZIi3xp0f79u01EFX+MGXKFKW3t7fq9YIFC5R79uxJVK9bt27Kc+fOKfv375+d4eUa6fn7ku9n3pHcb3J2yLJTXjt37qRbt2507dqVXbt2pWvdBw8e0KFDBzw8PDh69Gii8ri4OKZNm0b58uVp1aoVkydPZvTo0apyf39/+vXrR7Vq1ahcuTLjx49Xm9I3M/H7+vrSqlUrZs2ahYeHB/Xq1WPgwIFqMz2Ghoaq+q9Tpw779+9Xazu1+FauXEmrVq3YvXs3W7dupWnTpnTp0oUXL14A8ObNG4YNG0bTpk1p06YNQ4YMUesjIiKCMWPGUL58ecqXL8+YMWOIiIhIc/ypSe3zSS2+1EycOJEiRYqoXsfFxREbG6tWx9PTk8KFC1OqVKk0twtvt02LFi1o1aoVjx8/BmDVqlXUq1ePWbNmAal/PmfPnqVdu3Z06NCBNm3asHLlSrU+Mvv5peU9JPf5pkVq308hMiyzGSm5bPhuzz40NFTZunXrJOuktge1a9cu5ZYtWxItnzFjhnLixImq4eCvXr2qdHBwUCqVb4fxrl27tvLQoUPKhIQEZWxsrHL27NnK7777Ll3vK6X4165dq6xatapqiPkZM2aoxdmsWTPl/v37lQkJCUo/Pz9l+/btlU2aNElXfEePHlW6uroqf/jhB2VMTIzy6dOnysDAQKVSqVSuXr1aOWPGDFXdP/74Q7l8+XLV6wEDBigXLVqkjIqKUkZFRSkXLlyoHDBgQJrjT6vkPp/U4kuPo0ePKtu3b6829HxsbKyyQYMGytevXytDQ0PTfYTy77//KidNmqR6HRMTo2zQoIEyJiYmTZ9PWFiYMiIiQvW6V69eSl9f30RxZ/TzS01qn+87yf19pfT9FLlfTh6hZMnw9Y8fP+bNmzeqi6VhYWE8efIEZ2dnjbS/bds2PD09VcPUly9fXrWX5eXlRUBAAC9fvmT9+vXA22HuZ8+ezfTp0zUW/08//aQamr5x48Z4enoC8OLFCwwMDFRzldva2jJu3DjGjx+f7vh69erFlClTANRmzWvQoAE9evTA19eX8uXLU69ePUqUKAFAZGQkZ86cYdmyZaoJqoYMGUKZMmWIjIxUDYufXPyakFJ86XH48GHmzp3Lli1b1EZXXrFiBT169MDCwoKwsLB0t9uwYUN+++03Xr9+jaWlJZs2baJ3797o6ury4MGDVD8fbW1tTp06xb///kt0dDQvXrzA398fe3t7tX4y8vmlJq2fb3JS+34KkRlZcspr48aN1KpVi0uXLnHp0iXq1Kmj+uPUlI/nkng306CWlhYmJiZYW1ur/tnb27N8+fIU54LXVPwRERGJ5t6wsbFRXVROT3zJTb3q6OjI8ePHGTlyJGZmZnz//fds2bIFgOjoaOzt7dVmO9TS0sLKyoqYmJg0vYfMSim+tNq5cyfz589ny5Ytiea3CQ0NZf/+/XTp0oWePXty8OBBjhw5kq72R48eze+//05cXBwrVqxQTY2b2uejVCrp3Lkzd+/epXfv3owZM4aSJUsmux2SW57R7ZPZzze176cQmaHxIxSlUsm///7LoUOHVPOPK5VKGjduzLhx4zQyJ3np0qXZu3cvbdq0Ad7ObbJ+/XoaNWqEq6sr2traODg4qJIMvL1zKDvid3Nz4+zZs7x8+RJ7e3uUSiWLFy9WXQPIbHwAPXv25Pfff8fJyQknJyeKFy/OtGnT6Nq1K+bm5iQkJHDx4kWqVKkCvJ3QClKeMEyTUoovLdauXcu+ffvYsmULBgYGREZGEhISojoCGDNmjKpuWFgYI0eOpGHDhumKsVGjRsyaNYslS5bQrVs39PT0gNQ/n6CgIHR0dFRT6YaEhODl5ZWuvjOzfTL7+ab2/RQiMzI9H8rSpUvVBofs06cP//zzDx06dGDx4sUADBs2jC1bttCwYUM2btzI+PHjefDgAV5eXmhra+Ps7IybmxvTpk0D3l6UvXv3Ls+ePSM+Ph5nZ2dcXFxUs8cFBgaq/viqVq2Kn58fpUuX5ptvvkFbW5tHjx7Rp08fzM3NKVu2LJcuXaJUqVLMmTMn1YSQWvxjx47l888/x9TUlFWrVuHi4kLr1q15+vQpO3bsoESJEty7d482bdpQq1Ytrl+/TqtWrVi3bh09evRg6tSpqcY3bNgwrl27xps3b3BzcwNg/vz5qh/Unj17oqenh62tLaGhoTx//pxp06ZRunRp4O0zHF27dlXN6BgQEMDmzZtxdHTkypUrqcafmtQ+n9TiS42WlhZt27ZV/ci/fPmSDh06MHLkSLV6x48f57fffuPKlSusXr063Unl8OHD9OzZk6dPn6pNhJba5/Pdd9/x6tUrDA0NuXnzJoaGhkRHR7NkyRKKFSuW6c8vNSl9vkCqf1+pfT9F7vbxb3J20nhCyU4vXrxAqVRSuHDhZMsjIiJwdnZGRyf7Zzv28vLC3t5eNW3vxzIb36tXr4iLi0ty1kmlUsmzZ88AKFKkiNopkuySUnyfgm3btuHn58dXX32VZHlKn8/r168JCwvD0dExw9s2M9tHE59vat9PkTvl5G/yJz2nfGoKFSqUqfKs9m7vNDmZjS+ledK1tLSSPYefXTQ1j7um3b17l/j4eKZNm5bolt8PpfT5WFpaYmlpmak4MrN9NPH5pvb9FCK9cnVCESK9YmNj2blzJwkJCXTs2JHjx49Trly5nA5LiDxBEorIV3R1dfn+++9zOgwh8iQZbVgIIYRGSEIRQgihEZ/cKa+LFy/i5+dHixYtcuTOpNxk69atlChRIkuuAXh7e3PgwAGcnZ1p1KiR2pPqkZGRiR4k/OyzzxI9gJhfBQcHc+rUKQAqV66c6An6DymVSg4dOoSZmRk1atTIrhCFyBIaP0LZv38/rVq1ol27dnTp0oWuXbuybt26ND+lHR4ezpQpUzL85G5m+89Ncmr4+MDAQBYuXEhoaCihoaGEhYWRkJCg8ThyKxk+XuRXGj9Cad68OX5+fhQpUoRGjRoRGRnJokWLWLt2LQMGDEh1/QYNGmTqdsbM9p+bzJ49O0va3b17N8uXL1cb8ffAgQO0bNlS9bpcuXJ07949S/rP7aytrenevTsGBgapDvejUCjo2rUrmzdvzqbohMg6WX4NxdDQkF69enHw4EHVsrQMv+3p6UmdOnWoXLkyHTp0UD3EpYn+UxpePC3Dm8vw8W8f+luzZg1r1qwhPDw8zW3L8PEyfLzIwzI7XHFSQyWvXLlS+d133yk3bNignDNnjrJGjRrKixcvqspTG367S5cuyiZNmih9fHyUSuXbocArVaqkjImJSVNMqfX/rs3khhdPaXhzpVKGj3/16pWyd+/eypUrVyq3bNmibNCggfLhw4dpblOGj5fh40XWyXPD1wMYGxtjZmaGlpYWtWrVYvny5VSuXDlNw28rFArGjBmjGlKlQYMGuLu7c/PmTSpWrJip/j+U3PDiKQ1v/i6e/Dx8vKWlJWvWrFG9dnZ2ZuPGjUyYMCFN7crw8TJ8vMibsuyUV61atWjZsiXdunVj1qxZWFlZcfny5TQPv/1u4LsPX6fntFBy/X8opaErkhve/N16+Xn4+I8VLlxYdfoqrWT4+Pdk+HiRV2TLcyhKpZKHDx9iamqqNvz2Ox8Pvx0fH8+CBQtUdw69fv2avXv3Zvj22A/7T6tGjRpx7ty5RMObw9vRYoODg3FycqJDhw78/PPPqmmC0/L+slpK8aXF2rVr2bx5syqZREZG8vLlS1X51q1bCQoKUr3esGFDui/QJ7d9Pxw+3sPDQ/Xv3Q7Gh8PHu7u7Y2xsnKHh4zO6fTL7+X44fDwgw8eLPEXjow3v37+fCRMmYGhoqBpcLzQ0lE6dOjFw4EAg5eG3p0+fzpw5cxgxYgTr16+nZs2aHD16lLVr11KrVq1U40lL/6kNL/5OcsOb5/fh40+dOsXEiRNxd3fn2rVrWFtbs2XLlnSPmCzDx8vw8ULz8uXw9co0DL8dERHBs2fPcHNzy5Hh51Mb3jy/Dx/v6+uLQqHIcPsyfLwMHy80L18OX5+W4beNjIwydDE5s9I6vHl+Hz6+YMGCGVpPho9/S4aPF3nNJzf0Sk6T4c2zlmxfIfIuSSgfkeHNs5ZsXyHyLhltWAghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohI4mGlm6dKkmmhFCCJGLaSmVSmVOByGEECL3k1NeQgghNEISihBCCI2QhCKEEEIjJKEIIUQe4+/vj5ubW7b3KwlFCCHyEH9/f2rWrMmZM2eyvW9JKEIIkUd8mExq1qyZ7f1LQhFCiDzg42QiRyhCCCHSLalkIkcoQggh0iW5ZOLl5ZXtsciT8kIIkYu5ubl9EskEJKEIIYTQEDnlJYQQQiMkoQghhNAISShCCCE0QhKKEEIIjZCEIoQQQiMkoQghhNAISShCCCE0QhKKEEIIjZCEIoQQQiMkoQghhNAISShCCCE0QhKKEEIIjZCEIgQQFxeX5PLAwEAuX76czdEIkTvp5HQAuU1cXBzdu3dPsmzcuHFUqlQpmyMSGfXkyRN+//13Lly4QEREBEWLFqVVq1Z069YNHZ23fxqXL1/mhx9+4MKFC2hpaSXZzt27dxk2bBgzZ86kQoUKmYrp3LlzBAYG0rJly0y1I0ROkISSAY8fP8bDw4Ny5cqpLbezs8uhiER63bp1i759+1KyZEnGjx+Pubk5Fy9eZO7cuVy/fp1ff/01zW1ZWlrSvXt3bGxsMh3XqVOnuH37tiQUkStJQsmgatWq0aZNm0TLnz17xpUrV2jVqhU3btzA29ubGjVqEBUVxenTp/H390epVFK0aFEaNmyIgYEBAFevXiUiIgIbGxuOHTuGUqmkSZMmODo6cvToUW7dukW5cuWoU6eOau8Z4P79+5w6dYqQkBBKlChBkyZNVOVv3rzh0KFDPHv2DBMTE9zd3alcubLa+vnV7NmzcXR05M8//1R9BtWrV8fR0ZEpU6Zw9uxZatSooarv7+/PkSNH8PPzo3LlytStWxeACxcu8Pz5cywtLTE2NlbVj4mJ4eDBgzx8+BAzMzMaNmyIs7OzqjwoKAhPT0+eP3+Ora0ttWrVIjY2lvv37xMQEMDOnTsBqFGjBvb29ty4cYMLFy7w5s0bHBwcqFOnjkYSmBCaJL8sGnbnzh1++ukn9u3bx8WLFwGYN28eDx48YMuWLaqjmjVr1rB3714WLlwIwIEDB9i2bRsAFSpU4OnTp6xdu5ZixYrx4MED3N3dWbNmDc2bN2fq1KkA7N27l0mTJuHu7o6trS3r1q3j6tWrjBs3jsjISHr37k1UVBTVqlXj5s2bLFy4kM2bN+Pm5pYDW+bTERgYyLVr1/jxxx9VyeSd5s2bM3/+fE6cOKGWUDp37oyjoyN+fn6sW7eO7777js6dO3Pr1i2OHDnC7du3KVmyJObm5kRERNC/f39evHhBvXr1OH78OIsWLWLnzp04ODjw4MEDBgwYQEREBPXr1+fQoUMsW7aMSZMm4eXlRXR0NIcOHQKgWLFiXLhwgSlTplCrVi3MzMzYtWsX586dY/r06dm63YRIlVKkS2xsrLJy5cqJ/v36669KpVKp/Oeff5SVK1dWLlu2TBkcHKxMSEhQxsXFKSMiItTa8fT0VFauXFkZEBCgVCqVymnTpinbtGmjfPHihVKpVCr9/f2VlStXVk6aNEkZGRmpVCqVyr/++ktZt25dZWxsrDIkJERZt25d5YoVK1RtnjhxQlm3bl1ldHS08sKFC8rKlSsrr1+/rip//PixMiQkJEu3T25w9erVRNvmQ1999ZXyq6++UiqV7z/PGzduKJVKpTIyMlI5atQoZd26dZXx8fFKpVKp9Pb2VlauXFl5584dpVKpVC5btkxZt25dZVhYmKrNnj17KteuXatUKpXK/v37Kzt16qQMCgpSKpVKZVxcnPLo0aNKpVKpnDVrlnLAgAFq8QwYMEAVj1KpVMbExChv376dya0ghObJEUoGdenSRW0P1t7eXq18wIABqou42traKBQK1q1bx9mzZ3nx4gWBgYEAhIWFYW1tDYCDgwMFCxYEwMbGBiMjI8qUKaPai3ZxcSEiIoKAgAB8fX2JiIjAy8uLWbNmARAZGUlERARXrlyhePHiAMyYMYN27dpRunRpSpUqlYVbJPd4d0eXQpH0TY4KhYLo6Gi1ZaVLlwbAwMCAevXqcezYMYKCgrCyskq0/oULF7CwsOCPP/5QLYuOjubo0aN06tSJa9euMXjwYMzNzYG3348GDRokG2/p0qVZv349v/32G1WqVKFSpUryWYpPkiSUDCpZsiT16tVLc/3Ro0dz/fp1+vfvT/HixQkNDWXChAnp6lNbWxsApVJJcHAwAI6OjhgaGqrqjBgxAjs7OywsLFi1ahXLly9n/vz5REREUL58eX7//XeMjIzS1W9eU7hwYQB8fHxUieJDT58+VdtZ+JiZmRkAsbGxSZYHBARgYWGBra2talmbNm0wMzMjPDwcgCJFiqQ53iFDhmBqasq+ffvYtGkTAFOnTqV58+ZpbkOI7CAJJRuEhoZy9uxZJk2aROvWrQHw8vLKVJuFChUCUO2xJqVMmTLMmTOHhIQEzpw5w4gRIzh9+jSNGzfOVN+5na2tLYULF2bjxo00bdpU7Xbgs2fP8vz5cypXrpzs+u+eS3l3ZPkxV1dXwsLC6N27d6IypVIJvL09OKmEoKOjk+iZGAMDAwYOHMjAgQN5/fo1U6dOZcmSJZJQxCdHHmzMBsbGxtja2nLq1CkePnzIxYsXmT17dqbaLFasGGXKlGHKlCmcP3+egIAArl69yuTJk3n48CGenp5Mnz6d+/fvEx4eTmRkJACmpqaaeEu5mkKh4Ntvv+XmzZt8++233L59Gx8fH/bu3cvYsWNxd3dPlHQvXbpEQEAAf/31F3///TddunRJ9m659u3bc+nSJX7//Xd8fHx48uQJu3btYvbs2WhpadGtWzf27NnD2rVrefHiBefOnWPMmDHA2xsybt68yY0bN3jy5AnBwcGMHj2agwcPEhgYqDqtmVwyEyInyRGKhiV1Xl5bW5tRo0YxY8YMDh8+DKD6wUruYbmkvKurpaWFtrY2v/76K7/++itDhw5V1XF3d8fExARbW1vOnDmjunPM0dGRr7/+murVq2f4veUlderUYcGCBUybNo0+ffqolrdt25ZvvvlG9Tm++/9x48YRFBQEQIMGDdS2+bujjndq167NpEmTmD9/PqtXrwbAyMiIgQMHAjB06FCio6OZN28e8+bNA6BVq1bA2yPOunXr0q9fPwAWLlyIjY0NP/zwg6r9unXrMmLECM1tDCE0REv58V+DyDJxcXH4+Phgb2+f6HbVzIiJiSEwMBALCwu16ynw9nRbVFSU2vl8oS40NJSQkBAKFiyY7FFHXFwcvr6+mJiYYGFhoVZ29epVBg4cyIEDBxIdObx+/Zr4+HisrKwS7WzExsYSFBREgQIF0NfXVysLDw8nISFBdb0mLi6OgIAALC0tE9UV4lMhCUWIDFqzZg0REREcPHgQGxsbtbu6hMiP5JSXEBmkq6vLvXv3aNOmjQyVIgRyhCKEEEJD5C4vIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZIQhFCCKERklCEEEJohCQUIYQQGiEJRQghhEZkej6UjXv2U6dGAw2EIrJLEWvD1CsJIUQ6yRGKEEIIjZCEIoQQQiMkoQghhNAISShCCCE0QhKKEEIIjZCEIoQQQiMkoQghhNCITD+HkhYhIcGcO32SJ4+9sLG1o16DRlhZ2wDw+NFDHt6/B0BJ9zIUcXRKV9vXr17GzKwAzq5uGYots/2/ExMTw6njR/F55k35SpUpV75ShtoRn76wsDCCgoJwdHTM6VCE+KRk+RHKk0detGxcm1kzpnLv7m3m/TaNL/r1UJU/uHeXv7Zt4rtRX3H08D/pbv/PJb9zYN+uDMeX2f7fmT71R6ZMGMu9u7e4cvFChtsRn74LFy6wYMECAA4fPsyYMWOSrRsVFcXcuXNJSEjIrvCEyDFZfoTy6/8mU7xEKZau2oSOztvuoqKiVOVNm7eiafNWDOzTJcV2YmJiANDT00u2zpvwcIxNTJItj4yIwNDISG1ZWvtPzakTnoyb+DPNWrROsV5SMaSlLCoqCgMDA2JjY9HW1kahUN8XiI2NJT4uDgNDeQo+q8THxxMZGam2rFq1ahQrVkxtWWxsLAqFAm1tbWJiYjh9+jRff/11os9MiLwmS7/hEW/esOfv7Qz8cpgqmQAYGBikuY3g4CCGDOhF0cLmFC1szpABvQgODlKrc/niORrUKE8pF1sa1CiP18P7qrJn3k8ZP3YE1csXo4STNV/270FggH/m39x/fp40DncXO+7cusGgvl1xd7FjyYI5anWqly/G1o1rqVO1NCWcrJn0w/s92pTiu37tMg1qlKdvt/YUL2LJ5g2rKV/cgS5tm6nWj46OZuK4UbgVKkBxRytGDRuslrCFZuzZs4fu3bvTv39/li5dqlp++/Zt/vjjDwCCg4MZN24cPXv2pHv37syePZvffvsNgF69etGtWzf5bESelqUJxc/PFwC3osUz3MYvk37A+8lj9hw6ye6DJ3jk9YD/TR6vVufi+bMsWLaaExduYW1jy7JF81VlpqamNGziwbFzNzh58TZ3b9/in/27MxzPx0Z/9yMnLtzExMSUlRu2c+LCTfr0G6xWx/fFcyb9MIaJP83g4LHz9On/vjyl+BLiE3jk9YBO3XpSu24DZvw8ifXb9nD+7Cl8XzwHYOWyRRw5/A/7jpzm2LnrXL5wLlOn7kRi3t7erFmzhpEjR7Jp0ya6deumKouNjVUliT179qCtrc2SJUtYsWIF7u7ujB49GoA1a9awYcOGdO1MCZHbZGlCCQsNBVCdxtm0fhWL5s9i8e+ziY+PT3X9uLg4Nm9YzcAhwyhXoRLlK1bmi69Gsmn9KrX1B345jDJlK+Dk7MLAL4dx8MAeVZm5hSWNmjTHwMAAcwsL6n/WmDMnj2vsPRoaGWFlbYOBoSEWFlZYWdtgZGycqN68xSto2rwVJd3LqCXY1OIzMTGldbtOlHQvQ4fO3alYuSomJqb4vXybrP/atomy5SrywseHB/fuUtK9NPv37NTY+xNw/fp1rK2tqVWrFgqFAjMzsyTreXp60qZNGywtLTExMcHDwwMtLS0AFAqFnPISeV6WfsNtbO0ACHr1CnibYLwe3mfaTxOIjY1Ndf3XrwIBKFOugmpZ2fIV37b5+pVq2Yd/qMVKlCQwwF91WiwqMpJJP4zB3cWOJnWrsPvv7cTFpd63phV2KJLk8rTGl9R1E4BnT58Q4O/H4X/2cfiffZiZmVOwUGGNx5+f6ejoYJzETsLHwsPD1U7tfkipVGo6LCE+OVmeUExMTDl35iQAg4YM54uvRqZ5fUsrawDu3LqhWvbuv80tLFXLPvwBvnPrJq5uxTA3twDgj0VzOXbkEAePX+DctQcMGTYqw+8nK2Q2viJOzpQuU45f5y5S/Rs38ecsijZ/qlSpEk+fPsXLy4uYmBhu3ryZZD0XFxf27t1LeHg4sbGxnD59GmNjYxQKBX5+fnKnl8jzsjSh6OjoMGjIcKb/PJGbN64SFxfHo4cPkq0fGxtDdHS02vpt2ndmxdKFPHxwjwf377Js8Xzadeyqtie4aN4sbt64ivfTJ6xYtpCGTTxUZVGRUdjZF8SsQAGOHz3MnF9/IToqmqR83H92SE98SenSvTdbN63jn327iYuL4014uNrRm8g8W1tbKlSowLhx4+jVqxf3799Pst6wYcPw9fWlf//+9O7dG09PT7S1tWnevDljxoyhR48eclFe5GlZftvw0BFjCAp6RYuGtVTLen0+EF1d3UR1p0wYy5QJY/nH8xylSpcFYOLUGQwd2JuGtd6e6qpZux4//jRdbb069T+jT9d2BAb44+jsQr9BQ1Vl3Xr2Zfff2yjjVhBHZxcGDR3O4QP7kow1qf41wcTEVHUu/WNpjU9bW1vt9bv2+vT/An+/lwzq2xUTE1PCw8MYP/l/6ToSFKn74YcfCAoKwtDQUO3Cet26dalbty4AhQoVYtGiRYSFhaGtrY3Rf9cO+/btS9euXYH03eEoRG6jpczkyd20ztgYGxuL74vn2NkXRF9fP939vH4ViEKhUDvV9aGEhARe+r6gYKHCiX68ExISCAzwx9bOPt39ZgdNxBcdHY2/30sKFiqc7Hn8d2TGRiFEVsi2hCI+HZJQhBBZQe5jFEIIoRGSUIQQQmhEtow2LERuFxvomdMhfJJ0rRsAZ3I6jHyqZk4HkIgcoQghhNAISShCCCE0QhKKEEIIjZCEIoQQQiMkoQghhNAISShCCCE0QhJKLnL26J7UKwkhRA6RhCJEFjhz/iY+LwLw9vHj3MXbSdaJiYnlwOFz/LHyby5fu5eo/M2bSFZv2E9cXOqT0WlaWuJPzenTN/Dx8cfb+yVnzyY95P+pU9c5ceJqouUPHjxj164T7Np1gidPfJPt482bSFau3ENcXFyGYkxJWuIX6iShCJEFps5czfFTVzl55jpTZ65Kss74qcsYM2Eht+4+5tzFO4nKvR4/Z9CIX/EPDNJ4fPceetOh1/hky9MSf2omT16Op+dljh+/yuTJyxOVR0fH0Lz5KOrVG0pEhPqw/rdvP2b9+oMMGjSdffuSf3Dy4UMf+vf/H/7+mt9GqcUvEpMn5YXIAnq6Oujq6vz334mnagA4cuIyv0wcTNsWdZIsL1emKJEvDyeauuBjERFRGBklPSx+aNgbzEwTzzYZGRnNsVNXMxV/avT0PmhDL3Ebx45dAcDU1Ih//71I69bvt0PbtvVo27Ye7dp9l2If5csXIy7uRIrbKDT0DaamRklOIREbG0dcXDyGholHQE8tfpGYHKEIkQWcnQri6GCHo4MdTkXUpyX4btJirFxacuOWF537/oiVS0tmLdikKn/81Bcrl5ZYubTEtmibJGd6dC3fhTUbD1Cyak/MnZoz6offVWUREVEMGTULB/cOWLu2wsqlJT4vAlTlcxdvoVGbkYSFR6j6uX7zYZrjTysXl0I4Odnj5GSPs3PBROXbt3vSs2cz+vZtwY4dx9LV9uPHLzAza4yZWWMsLJoluY2WLv0bO7uWFCjQhAIFmvD771tVZdHRMQwbNhs9vXoYGX3G55//TNRHE9ulFr9ITIavz0XOHt1Djc9aZbodGb4+/dI7ltdLv9dYmJsAEBQcjr3d+3l8IiKieBMRRcmqPVm79EeqViyJkaE+xsZvPxelUkngqxAePvKhfsthRPn9i0Khvu+nZ/MZpiZGrFz0A65OBdHV06FEUUcA5izawvI1eziyex421uY89w3EoZCNWv9nLtyiy+cTuXthPQAW5qbo6Lzfy08p/g+lNJbXy5evsLAwfdtGUBj29laqstjYOKysPNi8eSq6ujp06DCOgIB96OvrqbXRrt13NG1anaFDO6gtVyqVBAYG8+CBD7Vrf0F8/Em1bbR16xG6dJnA0qXf0bVrY8LDI9DW1sbuv/cxc+Z6lizZybZtv2BiYkirVt8ybdqXdOjQIE3xfxo+vbG85JRXNvvflPFoaWnJvO953Ic/wB//GBsZGWBkZIChoT5WFmbYWJurlWtpaWFjbU5I6JsU+1i1+Adae9ROtNzKwgxfv1fsP3SWVh611JLJu/6tLM0AEvWdlvjT6sMf4I9/jE+cuEpYWAQxMbHExycQFhbB0aOX8fCokaa2tbS0sLGxICQk6W20aNEO+vZtwaBBbQEwM1M/7bdu3T9UrlwCb++XAJQt68r27Z5qCSWl+EXSJKFkk43rVnL08D8c2LuLzt1753Q4Ig9wcrBLcnmvrk15ExHF/KXbGTTiV3p0bsLvv47E1MQomyNM3l9/HcfW1oJZszYC4OBgy44dnmlOKKm5ffsx/fq1TLb88eMXFChgzO7dpwAwNzfFyqqARvrOzyShaMCFs6d58yYca1tbjhw6QGxMLM1atqZM2QqqOvr6BpSrUInbt25ovP+QiCh+2u7JwasPCYmMpnPN0kzs2IACyVyoFXmbQqFgyIB2DBnQjktX79Fz0E8sXr6TsSN65HRoAMTFxbF69T5WrZqgOiLYvfskPXtOZuHCMaoL4ZlRrFgRjh69TJ8+zZMsd3EpRIUKxZk//5tM9yXek4vyGrBzx2b6dGtHi4a18DxyiHmzptGiYS3u3bmlqtOhc3e+HjkWF9eiGu9/9JoDbD1zi5DItxcVt565xZRtnhrvR+QOwSHhBAQGA1DUtTD6+nokKNUvWttYmxMWHsG9h95ERETx7Ll/tsV35sxNwsIiaNKkqmpZo0ZVCAuL4Pjxq4nqx8TEEh0dk64++vdvxapVe1mzZj9RUdFEREQR+N82AejXryWrVu1l587jxMXFER4ewatXIRl9S+I/coSiIa5uxdi88wB29gUJ8PejWYPqHDn8DyVKlc7yvg9e93r/Qglowb7L92lY2oWY+ARi4+KJjosjNi6emLgEDPW0iE9QEh4VQ1Rs3Nt/MW//Pzo2nqjYOGLj44mKiSMmLp7Y+AS1/4+Ji/+vrXgiYt4/UGZqoIfJf/9MDd/+M9bXw8RA979l+pgZ6mNioIuZoT4FjAwwM9KjoLkplVwzdidRXpbEXa4qpiZJ3wYLcNjzIj0GTsHWxoLIyGhaN6/N8MGd1OoULmhDp7YNKFuzL6YmRnzZvy2//DhYk+En6++/T9C+fX1MP7id2cjIgM6dG/L33ydo1KiKWv1vvpnHN9/M49q1NZQrp75Dltw2+vzzFrx8+Yq+fafSt+9UAKZMGcjEif0B+Oqrjvj6vqJ9++8xNTUiLCyCmTO/ZsyYT+MoLreSu7w0YPzYETx5/Ij1W3erlo0cOgC/l75s3LFPrW7vrm2xtbNn1vw/0t1Pcnd5OQ6d9dESJToKbZqWL4qujhb62jro6Wijq6ONno421mYG6OtoY6Cng4Huf//0dNSW6eu+rauno42utjZ6Oor//v+/ZToK9HS0MTF4f1dOSEQ04VExhEVGEx4Vy5voGEIj3v53eFQMYVHRvImKJSQimpCIKEIiogmNjOb56zBuPgugkos9FZztqFPSkZaVimJbIPHzEzklt83YGB0dw7PnATg72qvdvfWxgMBgzAuYZPg006c+Y2NcXBwvX77GxsY80R1k8HY7+fq+wsHBBh2d3LZ/LXd55RsFCphz8cLZbOmraTk39aMUtGhXrRSz+3gkWT+rbhsuYKRPASN9wDTd60ZEx3Ll8UsuPfJlz6UHfLP6IA6WprSoVIzGZV1oWt5V8wHnYfr6ehR1LZxqveTu8sordHR0cHCwTbZcX19PnjHRIEkoWeTY0cMUK1YyW/qa1ceD0WsOcPaBD6GR0XSqUZpJnRpkS9+aYqSvS+2SRahdsgjDW1QjPkHJuQfP+eeaFxM3e9Lht63ULeVIs/KueFRwo2Rh65wOWQjxEUkoGvL0ySMunj+LgaEBWzas4ZHXA36cOl1V7ufnS0x0DG/ehPMmPIxn3k8xNTXF3CJj9/h/qICRAX9+2S7T7XxKtBVa1CrhQK0SDkzpUp+QiGgOXnvEP9e8mLX7LNZmRoxtU4sutdzRVqRwsUEIkW0koWjI68BA+nRtS3h4GACTf5lJoybvb1kcOWQAp054ql7v272TXp8P5H8z52dzpLlTASN9OtcsReeapQDYf+Uh//vrFN9v+JdRrWowqFFFjPRlvCUhcpIkFA2pWKUaqzf+xavAAKysE1/g+/jivMic5hWL0rxiUY7f9mbazlNM3OzJoEaV+LZNTezMP52L+ULkJ/Icigbp6OhgZ18wF94tknvVc3dk/w/d8ZzchycBwTh/NZ+hf+7HO1CeKRAiu0lC0YCy5StSs3bdnA4jX6voYs+20Z24OnMwkTGxOA39nSHL9hEYGpHToQmRb0hC0YBuPT/n65FjczoMAZQoZMXKoW14snAYoZHRFB2+kJm7kn5O4ol/MDvPJ54pUQiRMXJuRuRJTjYFWD+8PecePOeLpXtZdvgKs/o0pnWV4qo6TwJCaP/bVv4a05l21Uqk2N7bB/hE0j69B+xEzpCEIvK06sUKc+XXwaw+do0vlu5j1p6zLBzQnNJFbGhQ2gkrEyN6zPuL07/0o4Jz0qP3Qu57Uj67fOpPyudtn14il4SSy5w9uifVOpqYhCsv0dKCzxuUp3MNd6bvPEX1H1bQvXZpfun+GRM61uab1YeoNWEVL/4YgbmxjNAsREZJQslFJFFkjrGBLlO7NeCLJpX4fv0Rig1fyIgW1dDX1UGZoKTG+JWc/aWfJBUhMkguyot8x8HKjHXD27FuWDu2nb1DQkICUXGxPPYLYtAfqR8BCiGSJgklF0nL6S6RslWe13D9egFaXX6mx7yd+AaF82647Zj4BHZffMCQZftzNEYhcitJKCJfcbYxp0+9cjRwd0JfV4fImDiM9XXfziOjhOjYeJYfucLCAxdzOlQhch25hiLylQalnWhQ2kn1OvhNFFef+OF56ymn7z3j7otAnr0KY9jKA/SsW0aupwiRDpJQRL5mbmyQKMkAHL/tLclEiHSShCJEEuq5O2Zp+2fO36SIgx0JCQn4vnxF9SruqrIHj3y4e/8pAGXd3XB2zP7pkVOKL61On76Bo+PbNl68CKRGjTKJ6pw6dZ2EhATq1q2QqXgfPHhGaOgbKlfOnjmINCEt2ye3kWso2SwuLi71SiLPmzpzNcdPXeXkmetMnblKrezOvads3HaYIaNmceBw1sz6ee+hNx16jc9QfGk1efJyPD0vc/z4VSZPXp6oPDo6hubNR1Gv3lAiIqIy1Mc7O3ceZ/bsTZlqI7ultn1yI0ko2cD76RP69+qEu4sdrgXN6N6hBauX/yHJJR/T09VB979/errq87i0aV6bDX9OokYajgpS+yEODXuT5PLIyGiOnbqaofjSSk/vgzb0Erdx7NgVAExNjfj33+RvgkjpPYYl8/7eiY2NIzIyOtVYU+ojNDT5PmJiYomJic1Q26ltn9xIEko2eOb9hAB/Pyb/MpM1m3ZSvEQpfvz+G1YsXZjToYkc4uxUEEcHOxwd7HAqkr5TWk+8XzJs7Fxcy3fB3Kk53fpPwj8gSFUeERHFkFGzcHDvgLVrK6xcWuLzIkBVPnfxFhq1GUlYeARWLi2xcmnJ9ZsPNRbfOy4uhXByssfJyT7Jedu3b/ekZ89m9O3bgh07jqmVffHFDEaNmk+jRsMwNm5ItWoDePDgmarc2/sl5cv3wcysCW5unTl16rra+tHRMQwbNhs9vXoYGX3G55//TFSUemIpUqQdq1btxc2tM8bGDRkxYo6qLCIiisGDp2Nn15ICBZpgZtYYHx9/VXlQUChdukxAX78++vr16dJlAkFBoWmOPy3bJzeSaygacOHsad68Ccfa1pYjhw4QGxNLs5atKVO2AgDVa9Zh98ETqvr1Gzbh2NHDnDl5nMFDR2S6/5CIKH7a7snBqw8JiYymc83STOzYgAJGclH5U/X9yF5YmJsApPsH28zUiOZNajDzp6H4+r2iddfv2LX/JAP7tAbgj1W7OHH6GpePLcfG2pznvoE4FLJRrT+4bxvKurvR5fOJ3L2wHgALc1ONxffO+PF9sbB42+7HP5ixsXFs3HiIzZunoqurQ4cO41iy5Fv09fUACA+PZOPGQ2zb9gvbt/+PNm3Gsm3bUcaN6wPArFkbMTIy4O7djcTExNG48XAaN66qan/+/K3s23eGy5dXYWJiSKtW37Jv3xk6dGigquPj48/w4XNYu3Yirq6F0dN7/3O4ePFfHDt2lRs31mJjY8Hz5wE4ONiqyseMWYCX13MuXFiOUgkDB07j228X8uef49IUf2rbJ7eSIxQN2LljM326taNFw1p4HjnEvFnTaNGwFvfu3AJINOFWfHw8/n4vKWBurpH+R685wNYztwj579B+65lbTNnmqZG2Rdawt7NEX18PfX097O0s07WupYUZLZrUwMBAD0sLU5p8VhXPk1dV5VYWZvj6vWL/obO8DgpVSyYARkYGWFmaAWBjbY6NtTk6Otoai0/Vhr3V+zbsrdTKTpy4SlhYBDExsURFxRAWFsHRo5fV6kyY8DlNm1bH3NwUD48aXLlyX1W2Y8cxRo3qRokSTpQt68bo0d3V1l237h8qVy6Bt/dLbt9+TNmyrmzf7pkoxnXrJtG2bT3KlnWjRIn3d/pZWZnh6xvI3r2nef06VC2ZxMXFsWLFHkaN6kaVKqWoWrUU337bg+XLdxMfH5+m+FPbPrmVHKFoiKtbMTbvPICdfUEC/P1o1qA6Rw7/Q4lSpRPV3bppLeHhYbTr2FUjfR+87vXBKyUotTh07WGy9UXuFhkZzfipS1m98QAFzIyJiY2jTo2yqvJeXZvyJiKK+Uu3M2jEr/To3ITffx2JqYlRDkat7q+/jmNra8GsWRsBcHCwZccOTzw8aqjqaGlpqf7b1NSIhIQEAF6/DsXHx59y5dySrAvw+PELChQwZvfuUwCYm5tiZVUgURxOTkkfffXp05w3b6KYO3cL/fv/j169mrFo0RhMTY0J/G820EqV3k958O7uslevQrC1tUwx/rxMjlA0pHARR+zs3x622tjaUa9BI44fPZyo3tHD//DdN1/Rb+AQGjRqmgWRaAFKEpSpVhS51OxFmzl45AKXjy/n0bUtjBnWTa1coVAwZEA7Lnn+yZlDSzh74RaLl+/MmWCTEBcXx+rV+1i8+FuOH1/M8eOLWbRoDJs2HSY2NvUbVSwtzXB1LcydO09Vyz6+MO7iUogKFYrz55/jVP9mzBia5hgVCgVffdWRa9fWcOHCck6fvsnChTsAsLZ+m5iuXXugqv/uvy3/O/LLryShZJECBcx59uyp2rLjRw/Tt3t7evTuz8Sff9VYX00/2FN7SwslCfiHpHwHjPj0xcTGER0do7YsKjKGgvZWmBcw4dDRC0z9dTVRUe/rBIeEExAYDEBR18Lo6+uRoFTfO7axNicsPIJ7D72JiIji2XN/ssuZMzcJC4ugSZP31zwaNapCWFgEx49fTVMbHh7V+f33rbx4EcCVK/eZP3+rWnm/fi1ZtWovO3ceJy4ujvDwCF69CklzjMHBYQT8d6NDsWJFMDDQUx1h6Ojo0K1bY+bN28rdu0+5c+cJs2dvokePpolOb+c3klCyyLGjhylW7P1DVju2bqRXlzYMHTGGabN+R1tbO4W102dWHw+alnPDzFAfgE41SzO8eU3a/LqeJx/c/SNynzETFmLq0Iwbt96f1vy8Z3OePffHxq01w8bOZeTQLvj6vVaVH/a8SOFS7XFw74Br+a5ULFeM4YM7qbVbuKANndo2oGzNvhQp3ZElK3Zm11vi779P0L59fUxNjVXLjIwM6Ny5IX///f7mFYXi/c+TlpaW2uuRI7ty8+YjChduS5s2Y6lduxwKxftTTF991ZEhQzrQvv33WFp6YGramJUr96rFYWpqlOhU2TuHDl3A1rYldnYtKVKkHZUqFWfkyPenqOfMGYGurjalSnXH3b0HxsaGzJ49XK2NlOLPq7SUSmWmTo5s3LOfOjUaaCic3Gn82BEcO3qYuQuXY2BowJYNa1j15xJWbthOoybN2bF1IyOHDqBF63b0H/yV2rply1XE0Cht57bPHt2TrjlRtp29zS87PFk3rBOli7y/qFjE2jDNbYi3PrUZGxMSEvAPCE72gnl0dAzPngfg7Gif6IL7hwICgzEvYIKubsb2rHNyxsb4+Hj8/F5TsKB1sokhOjoGX99XODjYpPvoITo6hmfP/HF2tk923cDAYBQKRQ6d6pIZG/Os14GB9OnalvDwMAAm/zKTRk2aA+D99DEA+3bvZN/unWrr/XvqMsWKZ81wEZ1quGNhbED3+Vv484t2VCvqkCX9iOynUChSvPtKX1+Poq6FU23Hxtpcg1FlL21tbQp9dAfbx/T19TJ8S66+vh5FU/mbsc7F2y8rSELRkIpVqrF641+8CgzAylp9b2jkmB8YOeaHHImrUVlX/vyiHQP/2Mn8z1vSoLRLjsQhhMj78v5JvWyko6ODnX3BT+7CXLWiDqwf1plRaw6w8/zdnA5HCJFHfVq/fLlU2fIVKVgo9dMLOamsox3bR3ej69wt6OgkMKRp5ZwOSQiRx0hC0YBuPT/P6RDSxMXWgp1jutN9/lYCQt8wsVO9nA5JCJGHyCmvfKaQpRlnf+nH9rN3GfrnfjJ3j58QQrwnCSUfsi1gzImf+nLl8Ut6/76TBHmsXgihAXLKK5c5e3RPqnXS8qyKmZE+Ryb1pvX0TXT4bStbR3VCV0f2L4QQGScPNuZDHz7YGBuXQM/5f/E6PJK/x3bF2CBvTPQjhMh+coSSz+nqKNj8TUcGLtlN/cmrOfxjL8yNZR6Vj31qT8p/KnLySXnx6T0pL+c4cpG0nO7KCC0tWD6kNXVLOlL7x1UyqKQQIkMkoQiVOZ83pUedMtQYvxLvwLSPzCqEECAJRXxkfIc6fNumJrUmrOKB7+vUVxBCiP9IQhGJDGlamRk9G1H7x1Vcf5p982QIIXI3SSgiST3rlmHZFy35bMoaLj3yzelwhBC5QK5JKP5+Lzl35mSWtP3wwT3u3LqRrnV8Xzzn4vmzWRLPp6Jt1RKsG9aOpj+v58Qd75wORwjxics1CeXcmZN0btOU5B6b8Xp4n0ruznj+ezDFdjatX5UoMa1ctoifJ6dvePlDB/bSp2vbdK2TGzWvWJSd33ah3cwt7L38IPUVhBD5Vq5JKKkxN7eg/+ChFHFyTrHessW/c+bU8ewJKo+oW8qRAz/0oN+i3fwlw99nizPnb+LzIgBvHz/OXbyda/uPj49XzcUu8r5c92DjS98X7N+zkxfPfahRuy6Nm7YAwMjIGGsbW0xN307F+eSRF+fPnqJTt15cvniex14PMDQyJuj1K65fvcym9asA6Nilp6rt+/fucHD/brS1dejQuTt29u9nelMqlRzYu4uL589gamZGgL+fWlznz57i0oVzvAoMwMDAkOq16lCn3mdoaWlx9vQJ/P1e0qZ9Z7V1tm9eT/FS7pQtVzFT2yQkIoqftnty8OpDQiKj6VyzNBM7NqCAkeYeUKxatBBHJ/Wm0U/riI6Np1vt0hprWyQ2deZqenVpCsCGbYfYs/nXXNX/vHlbWLr0b27ffoytrQVdujSif/9WVKxYPFFdpVLJ0KG/cf78bS5dWqmR+EXOyHVHKI1qV2L75g3s2LqR/j07sWbFUgBCw0IYO3IoTx57AXDj+hXGjPiSnp1a0aFlQ0YP/wLPIwcJDPDn1o1r7N65nd07txMXGwvACc9/aVynMkcO/8P6NcupWtYNv5fvL0aPGfElX/TrjueRQ1y/epm1K5epxTVv1nT27NxOYIA/165eomenViyePwuA169e8fXgvty/d0dV/+L5s3zz9SDiYuMyvU1GrznA1jO3CImMBmDrmVtM2eaZ6XY/VrqIDcem9OGb1QdZc+y6xtsX7+np6qD73z893eSHw4mIiEq2LCoqJsn/fic2No7I/74zGe0/Ofv3n6Fly1rs2TOT6dOHcPDgeerXH0p4eESiulOmrGDJkr+4fPleuvsRn5Zcl1A2bN/L3n9PceribZo2b8X0qT+meEhdo3Zdrt/34an/G2bMXkixEqXo3rsf67fuZv3W3RgaGQHg6OzCiQu32LHnXw4du4CJiSmeR95ej7lw9jRbN67l5xlzOXziIivWbePnGXPV+lm6ciN7/z3F3EXLWbv5bwYNGc6WjWsBaOLREmsbWzaufb/3tW7VMspXrEzFylUzvU0OXvdKtOzQtYeZbjcpJQpZcWrq50zacowFBy5kSR8CnJ0K4uhgh6ODHU5F7NXKnni/ZNjYubiW74K5U3O69Z+Ef0CQqjwsPIJ+X02jcKn2OLh3wLV8F8yKNCM6+m1SiY6OYeS4+RgXakIBRw8GDJueKOGk1H9a7N49k19//YqWLWvTr18rfv55MGFhEdy+/USt3tq1B5gyZTkDBrROdx/i05PrEkr5im9nGjQ0MqKJR0vCw8N4FRiQbP3ho77H3MISLS0ttLW1k63n5OyKk7OLqu2Spctw+8bbvfAL59+OVdShS3e0tLSSXD88PIxpU3+kQ6tGVC9fjGWL5+Pv9xIAXV1dPh/4Jcv/WEB4eBj+fi/fHmEN/ir9GyBVynf/yzKudhacnPo5c/ac47ddMo5TVvh+ZC8qlC1KhbJF+W5kT7UyM1Mjmjepwe1z67h3cQM3bz9m1/73N5qs23yQp94veXZrOxPG9CEmNo7gp/vR19cDYMGyHRw4fI7zR5Zy69xazl24zf7DZ9Pcf1ro6qqfTQ8ICAagQAFj1bJjx67Qp89P7Ns3i2rV3NPdh/j05LqE8qECBSwAiIlJfDifWfp6+ij/+1kOCQnG0dkFExPTJOsGBwfxWc0KHP5nH5269mTuouUMGTZKrU7XHn0B2L1zG1s3rsXExJTmrdppJNam5dzev1BqgZaSRmXdkl9BAwpbmnJy6ucsOnhJkkoWsLezRF9fD319PeztLNXKLC3MaNGkBgYGelhamNLks6p4nryqKn/g9YySxR0xMjKgVAlnAAwM9FTlG7YdpmK54nj7+HPn3lPKuLvw1x71G1VS6j+9goPDmDdvC1WrlqJECScA7t17SuvW37Jw4RiaN//0BjkUGZPrLsp/6N3tv3b2BXn1KvmjlA8Z6Buk+7pFtRq1WDx/FsHBQZibWyQqv3ThLOHhYSxfswVn17c/5I8eqt9ia2dfkDbtO/PHgrmEhoYw+KsRGBho5qL5rD4ejF5zgLMPfAiNjMbF1hJTw6wfhr6ghQlHJ/Wmzo+rMNLXZWizKlnep4DIyGjGT13K6o0HKGBmTExsHHVqlFWVd+/UGI+OY4iPT+DYqauM/robCsX7fccnT30pYGrM3n9OA1DAzAQrS7MsiTU6OoaOHX/A1zeQXbtmqJa1aDGGgQPbMHRohyzpV+SMXJdQzpw6jlvR4vx7aD+b16/m84FfoqOT9rdRs049Dv2zl05dexIWHop76XKprlOtRm0Axo0exqAhw3nu483SxfNU5UWLlgBg186ttGzTgTu3brJ4wexE7fTt/wUdWzcGNDsPfQEjA/78sp3q9ZvoGOpNWk73WuUoXcRWY/0kxcmmAEcn96buxNXo6+owoGGFLO1PwOxFmzl45AKXjy/HqYg9cxdv4eyFW6pyfT1dnJ0KUrK4E2OGd6eYq4Pa+s5OBSlfpihzpg3L0jgjIqLo1m0iFy7cwdNzoeroJCIiikePnvPnn7v4889dAISFvb1Yb2bWmKVLv6NbtyZZGpvIGrkmoWhpvd3D+npwXwID3o4v5dGyDWPGTVKvh5Za/Y917NKDMyePU6/62z26u08Ckr0u8q4tU1MzJkyZxs+TxrF31w5MTEypXK0GrwMDAXByceXrkWP5bdpP/DbtJ6xtbCldtryq/J0q1WtiYmJK42YtsC9YKCObIU2M9fX4tWczRqzcy4HxfdHRztozm0XtLTk+pS91flyFno42veuVTX0lkWFRkTEUtLfCvIAJh45eYOqvq6lb8/2O0fyl2zE1MURPV4fd+09hoK9Hg7oVcf/v9Fff7h5Mmb6SBnUr0rJpTaKiYoiOicHKsoDGYgwMDKZdu+95+vQl588vp2RJJ1WZqakRx44tUqv/99/HmT17E3v2/EaJEo4ai0Nkr1w3Y2NcXBw+3k8xNTPDytomw+28fhWIoaGR6i6vtHgTHk5ggD8Ojk5JXuAPDw8j0P9teVJHTdeuXKJ107rs2HuEKtVqpDvms0f3pGl633eGrdiLi60Fo1rVUlv+4YyNmnTHJ5B6k1azYEBzutbKWxdZP6UJtrweP6dll7E8evICV+dC9OzSlD0HTnPu3z8AOHX2Bp+1Ho5Ho+qYmBjy7Lk/5y7e5tXjvZiaGBEbG8ekacv57fdNmJoYERYewfTJXzLqq67pjiWpCbbi4uIoUaI7jx49Z+PGKRQu/P7v1MqqAO7uLonaWbr0b774YgZK5el0x5B/fXrXnnJdQsnNhn/ZD68H99n776kMrZ/ehBL0JopGP61k08guFC9opVqeVQkF4PpTfz6bsoblX7amXbUSWdZPdvuUEgpAQkIC/gHBSV4wb9BqGP17tqRPdw8A7tx/Svnan/Pg8ka1W4Cjo2Pw9XuNQyEbdHSSvwMyJUkllJiYWPT16ydZv0ePpqxfPznR8mXL/mbwYEko6fPpJZRcc8ort4uMiEChrc2o7ydkW58WxgZM6vQZI1buZc/3vdFWJH1qT5PKOdlycEJPGv+0DhODTjQul3hvVGSeQqFI9u6rcqXd2LLzCKamRjzxfsnyNXvo3a1ZoudJ9PX1cHZM/zMmqdHT0013Yhg0qC2DBuX9sfHyulx923BuYmhkxNyFf9KoSfNs7bdt1ZLYm5uy/MilbOuzsmtB9v/Qg65zt3Py7rNs61e89cuPg+nZuSlHjl9GSws2rZjMn/O/y+mwRD4gRyj5wMxezWjy8ypaVCyGg5XmLrympEbxwmwd1Yk2MzZzfEpfyjhm/HqXSB9TEyO6d2pM906NczoUkc/IEUo+YG1mxLdt6vDN6gPZ2m/DMs78MbglTX5eJ3PUC5EPyBFKLnP26J5U6yR14b5HnXL8df4OG05e57t21bMitCR1rlkK/5A3NJyyjnP/64+VadbdECCEyFmSUHKR9NzhlZQ5fT1oPWM9nzcog525ceoraMhXHlV4EhBMk6nrOPHT5xgbZP1T/EKI7CenvPIRB6sCDGlajYFLUj/K0bSZvRtT1N6SNr9uJi5eJlwSIi+ShJKLpOV0V2oGNKzM89ehbD6d/bMAbhjRHoB+i3Zle99CiKwnCSWf0VZosXZYO0as/IdXYZHZ2reOtoK/x3bh8uOXzJQRioXIc+QaSj5UuogNgxpVZOSqf1g7rF229m1ioMeBH3pQ5fs/KedoS7MKWTvMvqa8fSJcJO3Te2Jb5Aw5QsmnfuxUl3MPXnDo+qNs77uItRl7vu9G93l/cdsnMPUVhBC5giSUfEpPR5u1w9rSf9FuwpOYbzyrVS1aiPn9muHxywYCQhPPMy6EyH0koWRCYIA/h//Zx/27qV/gjo6O5vTJY4SGvn3Az+vhfW7euJrFEaaserHCtK1agnEbjuRI/73qlaV77dK0n7mFhISsnLRYCJEdJKFk0NSJ31PJ3ZnhX/Zj/uwZqdYPDn5Nt/bNuXv7JgCrly/hl0k/ZHWYqZresyHbz97lzH2fHOq/Ebra2kzccixH+hdCaI4klAwIDw9j2eL5LFi6mtuP/Zi3eEVOh5RhJgZ6LB7UnH6LdufI8yFaWrBtdCdWe17j6M0n2d6/EEJzJKGk05vwcObO/B8AAf5+bFq/iqDXrzh1wpMTx9RPHR3Yu4trV7J+lN+QiChGrz1A2dELcBw6i9FrDxASEZXm9dtWLUFpBxt+2XEyC6NMnpWpITvHdqHH/L94/josR2IQQmSeJJR0ioh4w9F/DwJwcP8edu/cTlDQa7ZuXMv61X+q1f199gwO7M36h/hGrznA1jO3CImMBmDrmVtM2eaZrjYWDvRg7t5z3HvxKgsiTF1l14JM7lyf9jO3yJP0QuRSklDSycbWjklT314zWbZmM+u37qZY8ZI5GtPB616Jlm07eytdbdibmzCtR0P6LvibzM3hmXFfNKmEm50FP2w8mjMBCCEyRRJKXvJBIjAz1E/36l82rQzA4oMXNRVRuv35ZWu2nrnNKZmYS4hcRxJKHtC03H9Pm2vxNqkolTQtXzRDba0d1o4fN3vm2LUMYwNd1g1rR6/fdxIVE5cjMQghMkYSioYYGRsTEhycaLmWVtbP4z6rjwdNy7mpjkr0dHT4vH6FDLVVrKAlo1rVyNEBHGuXLEL7aiUZteZQjsUghEg/SSgaUq9BY06d8OT40cPcuH6Fn378jhvXr6DMhgsSBYwM+PPLdtyc9TXei0fzfbu6zNmb8cEXv2tbixevw9iSAyMSvzO9Z0MOXnvEEbmVWIhcQxJKJnx49FGn/md4tGxDry5taNmoNt5PH1OwUOFERyhaZP0Ry+f1K3LvRSBn7mXsOoSOtoK1w9rx1fL9hEREazi6tNHT0WbjiPb0XfA3oTkUgxAifbSUmdyF3rhnP3VqNNBQOLlfgL8funp6mJtbaLzts0f3pHnWxj2X7jNv32n+Gd8XhUI9iRWxTts0vKNWHyL4TRQrhrZOd6yaMnbdv4RGRLNkcIsci0EIkTZyhKJhNrZ2WZJM0qtV5eKYGOiz41zGT1v90v0zDl1/hOetpxqMLH2mdKnP/qsPuejlm2MxCCHSRhJKHja1ayN+3X2S6NiM3S1lqKfDn1+2ov/i3UTHxms4urTHsGRQC/ov3kW8DCApxCdNEkoeVsbRlsouhVj6b8afK2lWwY2axQszKQcHb2xesShudpYsOHAhx2IQQqROEkoeN75DPf44dIFXYRmfc2R+Pw/+/PcKN70DNBhZemNoxv92nORlcHiOxSCESJkklDzOwaoAXWqWZdaeUxluw8rUkFl9mvD5or9z7LRTEWszxratxYiV/+RI/0KI1Mmc8rnM2aN7Uq3z8Z1go1rWouaPSxnYsDKudpYZ6rdvg3Ks8rzGvH3nGNWqRobayKyRLatTcuQijt1+Sn13pxyJQQiRPLltOJ/4899LnLrnzcqh7dN82/DHHvsHU2nsMm7M+gIHKzMNR5g2+688ZMzaw9yc9SXZMAiBECId5JRXPpHZhx0BXGzN+a5dLQYuSf0oKas0r1gUB0szVh69mmMxCCGSJgkln9DRUfBD+/pM3PJvptr5tk0tnr8OY+uZOxqKLP0WDvRg/KajRETH5lgMQojEJKHkI60qF0dXR5u1x29kuA1thRarvmrDiJX/EB4Vo8Ho0q6ovSUdq5fif39l/EYDIYTmSULJZ6Z2bcS4DUcyNTR8ZdeCdKxRkrHrMne0kxlTuzZg6eHLvMiBYfbDwsLw9vbO9n6F+NRJQslnKrsWomZxB+bsPZepdqb1aMjO8/e49ChnhkSxMDFgXLvaOTK744ULF1iwYAEAhw8fZsyYMcnWjYqKYu7cuSQkyLTGIu/L9G3D3Vs110QcIhvN7NWIimOX8UWTSliaZOyOLxMDPRYNbM7nC3dx5ddB6Ghn/77JVx5VKDFiEXefB1KysHWW9xcfH09kZKTasmrVqlGsWDG1ZbGxsSgUCrS1tYmJieH06dN8/fXXKBSy/ybytkzfNixyp29WHSQuIYHf+3tkqp12v26herHCjGtfW0ORpc/yI1fZe/kBO8Z0ztJ+9uzZw5o1awBQKBQ4Ojry66+/cvbsWXbt2sX//vc/goODmTFjBl5eXgDUqFGD4OBg7t69q0omq1atwsDAIEtjFSKnyC5TPvVjp7qsP3GTJ/7BmWpnyeAWzNp9lseZbCej+tYvxw1vf84/fJFlfXh7e7NmzRpGjhzJpk2b6Natm6osNjaWqKgo4G3S0dbWZsmSJaxYsQJ3d3dGjx4NwJo1a9iwYYMkE5GnSULJpyxNDBnXvjaj1xzOVDv25iZM7lKPQTn0bIqOtoJJnerx7drMvY+UXL9+HWtra2rVqoVCocDMLOmHOj09PWnTpg2WlpaYmJjg4eGhmmBNoVDIKS+R58k3PB8b2aI65x4+5/Q9n0y181WzqgSERuTYlME96pQhMCyCf288zpL2dXR0MDY2TrVeeHg4OjpJX5aUM8siP5CEko/p6iiY0bMRw1YcyFQ7Wlrw55etGLnqYI48bKhQaDG5c/0su+OrUqVKPH36FC8vL2JiYrh582aS9VxcXNi7dy/h4eHExsZy+vRpjI2NUSgU+Pn5yZ1eIs+ThJLP9axbhpi4eLadzdyT71WLFqJ5RTembj+hocjSp3PNUkTGxPLX+bsab9vW1pYKFSowbtw4evXqxf3795OsN2zYMHx9fenfvz+9e/fG09MTbW1tmjdvzpgxY+jRo4fqeosQeZHc5SU4evMJ/Rfv5uHvX6OtyPiIi4GhEZQYuYgL0wbgapf90yDvvnifcRuOcCOLBo4MCgrC0NAw1QvrYWFhaGtrY2RkpFr2LpHIRXmRl8kRiuCzMs6ULmLDwkzOiGhtZsSULvUZ/MdeDUWWPq2rFEdfV4ft57JmnDELC4s0JQRTU1O1ZAJvE4kkE5HXSUIRAMzu04Sp208QGhGdqXaGNK1CQGgEO8/f01Bk6TO5cz0mbzmGHHcLkf0koQgAiheyon21kvyy42Sm2tFWaPHnl60YvvIfomPjNRRd2r07SsmKaylCiJRJQhEqP3drwPIjV3meyQEXqxYtRIPSTvzvr8wlp4ya2KkuEzd7ylGKENlMLsoLNZO2HOORXxBrh7XLVDuBoRGU+mYxl2cMooh19s7uqFRC2dFL+KX7Z7StWkIjbcYGemqknbxG17oBcCanw8ilauZ0ABonRyhCzdg2tTh47RE3vQMy1Y61mRFj29ZixKp/NBRZ2mlpweQu9flpW87cwixEfiUJRagxNtDlp64NGL4ycw87wtsn8S8/epnpJ/EzomP1UoRHxXDgqle29y1EfiUJRSQysFFFnr8OY+/lB5lqR1dHwczejTP9JH5GaGnBjx3rMlWOUoTINpJQRCLaCi1m9m7M6DWHSUjI3CW2zjVLoZfJaYczqkedMrwICuPozSfZ3rcQ+ZEkFJGkNlWKY2NmxErPa5lua9HA5pmedjgjFAotfmhfJ9O3Qgsh0kYSikjWnL5NGb/xaKYTQUUXexq4O/Hb7uy/G6hvg3LceR7IRa+cmapYiPxEEopIVhW3gtQr5Zjp+ecBfu3ViDl7z+Ef8kYDkaWdno42Y9vW4qdtx7O1XyHyI0koIkUzejXit91neB0emXrlFBSyNGVo0ypZNsR8SgY3rsTZB88zfSt0epw5fxOfFwF4+/hx7mLS88TExMRy4PA5/lj5N5evJR6q5s2bSFZv2E9cXPaPOJCW+FNz+vQNfHz88fZ+ydmz6kP+nz17k127TrBr1wlu3vRK93wxFy/e4eHDlO8eTKl/kTUkoYgUudia06NOGY3cLTWufW32XHqQrT/sAIZ6OoxsUY2fd2TfHV9TZ67m+KmrnDxznakzVyVZZ/zUZYyZsJBbdx9z7mLiAS29Hj9n0Ihf8Q8M0nh89x5606HX+GTL0xJ/aiZPXo6n52WOH7/K5MnL1cqmT1/LN9/MZ8GC7dSq9QX29q24d+9pmtueM2czf/11LMP9i6whCUWkakqX+qzyvIbPq9BMtWOkr8uULvX5dl3WTdebnGHNq3HgqhdP/IOzpT89XR10//unp6ubZJ0jJy7zy8TBzJ8xkiED2iUqL1emKJEvD1PI3jrFviIikp9jJTQs6VOMkZHRHDt1NVPxp0ZP74M29BK3MWhQGw4enEtw8EGqVy/N3LlbEtWJiYklJiblSdvCwyMy1L/QPEkoIlWWJoaMbl2D79b/m+m2BjaqyP0Xrzh+21sDkaWdqaEeQ5tWybY7vpydCuLoYIejgx1ORezVyr6btBgrl5bcuOVF574/YuXSklkLNqnKHz/1xcqlJVYuLbEt2ibJmR5dy3dhzcYDlKzaE3On5oz64XdVWUREFENGzcLBvQPWrq2wcmmJz4v3R4VzF2+hUZuRhIVHqPq5fvNhmuNPKxeXQjg52ePkZI+zc8Fk6ykUChQKLbX3GRQUSpcuE9DXr4++fn26dJlAUJD6Ds2ZMzcpUaIbpqaNKVGiW6IjnLT2LzRHxvISaRIVE4fzV79z6MeelHW0zVRbG0/eYu6+c5z7X38NRZc2AaERuH29gLtzh1DI0jRd66Z3LK+Xfq+xMDcBICg4HHs7S1VZREQUbyKiKFm1J2uX/kjViiUxMtTH2NgQeDv/fOCrEB4+8qF+y2FE+f2LQqG+76dn8xmmJkasXPQDrk4F0dXToURRRwDmLNrC8jV7OLJ7HjbW5jz3DcShkI1a/2cu3KLL5xO5e2E9ABbmpujoaKcp/g+lNJbXy5evsLB4u52DgsKwt7dSlbVr9x0PHvhQqpQTJ05cw93dhbVrJ+Lg8Pa7NWDA/7h69QF//DEWpRIGDpxG1aql+PPPcQD07DmZw4cvcODAHAoUMObzz3+mZEknli79Pk39fxpkLC+RTxno6fBT1/qMXnMo0211r1Oa6Ni4TD+Jn142ZkZ83qA8M3dl/e3L9naW6Ovroa+vl+jH2MjIABtrcwwN9bGyMMPG2lyVTAC0tLSwsTbHxjrlWS9XLf6BNs1rU8bdVZVMAKwszPD1e8X+Q2d5HRSqlkze9W9l+XbAzrf9mKslk9TiT/M2sLd630YSP+alS7vQtGl1GjeuysOHPpw7dwuAuLg4VqzYw6hR3ahSpRRVq5bi2297sHz5buLj39+gMGpUNypWLI6ra2G++aYbf/+tfo0stf6F5klCEWk2oGFFvAND+ffG40y39b/uDRmfA3d8fd+uFsuPXCUoPPfP7e7kYJfk8l5dm/LzhEHMX7qdgiXa8fnQ/xGWzHWGnFSpUgkGD27L+vWTGT26O0OH/kZ8fDyBgSGq8ncqVy4JwKtXIaplHx61ubs74+8flOi0mMheklBEmmkrtJjW4zO+WX0w0221qFSUAkYGbDx5SwORpV0hS1M61iipkWdrPlUKhYIhA9pxyfNPzhxawtkLt1i8fGdOh5UiV9dC+PsH8epVCNbWBQC4du39Eey7/7a0fD8VQmzs+wdur1/3onhxRywssneqBKFOEopIl/bVSqKvo8OGk5m/r39m78ZM2HSU+EyOF5Ze49rVZuE/F4jM5qFgsktwSDgBgcEAFHUtjL6+HglK9Qv7NtbmhIVHcO+hNxERUTx77p/tcUZERPHiRQA7dngybtwS+vZtga2tJTo6OnTr1ph587Zy9+5T7tx5wuzZm+jRoyk6Ojqq9adPX8uVK/d5/PgF8+ZtoWXLWtn+HoQ6SSgi3eZ83pQJmzyJjUt891F6VCtaiFIO1vz57xUNRZY2xQtZUd/dicUHL2Zrv+mlpZV8mamJEVrJVDjseZHCpdrj4N4B1/JdqViuGMMHd1KrU7igDZ3aNqBszb4UKd2RJSt2ajDytJk6dSWFC7flxx+X0bu3B7NmDVOVzZkzAl1dbUqV6o67ew+MjQ2ZPXu42vqNG1fFw+MbXF074ev7iuHDO2f3WxAfkbu8RIa0nLYJjwpuDGteNVPtXPType2vm3m6aDg62tm3f5PefnPbjI3R0TE8ex6As6N9ogvuHwoIDMa8gAm6ujrJ1klJVs/YGBgYjEKhUDvV9aGEhASePw/AwcE22QT76ZK7vIQAYHrPhvy07ThvolJ+6Cw1VdwKUqaILas0MKpxevstWdiaNceuZ2u/2UVfX4+iroVTTCbw9tRXRpNJdrC2Nk82mcDb60VFitjlwmSSN0lCERlS1tGW5hWL8uuu05lua3yHt0PMZ3bulfQa1642M/4+jRyjC6EZklBEhk3r0ZCFBy7yKixzA0fWc3eksKWpRi70p0fjci4Y6Orw1/m72dqvEHmVJBSRYYUtTRnUuCI/b8/8oIvjO9Rh6vYT2X608GOnukz761T2dipEHiUJRWTKhA512XT6Fs8CM/dAWfOKRdHT0Wb7ucSj7malDtVK8io8Uu1hzatP/Ah+k/sffBQiu0lCEZlibKDL5M71maKBCawmda7HlK3ZOxHW22mCazN95/trQfUmrebqE79sjUOIvEASisi0QY0qcuKONw9fvs5UO51qlCI+Qcm+yw9Tr6xBfeqX4/pTP256B/DEP5iwyBg8b6V9bg4hxFuSUESmKRRaTOpcjx83eWa6re/a1sqWwRsB1h+/geetp+jpaDOmTU2mbDuO521JJEJk1Kd7A7rIVbrVKs3/dpzktk8g7g4pTwiVkp51y/Dd+n+5+sSPCs5JD36oKXuvPGTjqVvUKFaYHzvW5ZcdJ9FRKECp5OYz9aFI3j7AJ5KW9x7QExkjT8oLjdl65g6bTt1i+5hOqVdOwS87TnLHJ5B1w9tpJrAU9Jj3FxtP3UJPRxsbUyNehUcSFRNLeRd7rv46SFUvtz0pn12y+kn5vC3vJWI55SU0plONUtx7EciVxy8z1c6QppXZeeEefsFJT1+rSRtGtKd77dIoFFo8fx1KVGwcIE9dC5ERklCExmhpwS/dP2Pi5mOZasfSxJBedcsyd1/2DDG/YUR72lctgYH+f/OOa8E1uctLiHSThCI0qm3VEjx/HZrpo5SxbWuy6J+LRERnbqywtHqXVAoY6WdLf0LkRZJQhMb93O0zvl9/JFNtuNpZULeUIyuPZt+gkRtGtKdFxaLoaGuhp63NE//gbOtbiLxAEorQuBaVihIaGc3Z+88z1c43Lasze8/ZbB2OZcOI9jRwdyYmPp4nASGpryCEUJGEIrLE1K4NGLchc0cpjcq6oFBosf9K9j7oeOjHnnStWQpXW/Ns7VeI3E4SisgSjcu5EBUbx9GbTzLVzogW1Vhy6JJmgkqHTd90xNGmQLb3K0RuJg82iizzS/fPmLz1OJ+Vcc5wG33qlWPchiO8DA7H3txEc8HlsDPnb1LEwY6EhAR8X76iehV3VdmDRz7cvf/2if2y7m44O9p/UvGl1enTN3B0fNvGixeB1KhRRlV29uxN/P2DAHB1LUTp0q65bpKslN5ffiVHKCLLNCzjTER0LKfuPstwG2ZG+nSvXYYFBz7t+d/Ta+rM1Rw/dZWTZ64zdeYqtbI7956ycdthhoyaxYHDZ7Ok/3sPvenQa3yG4kuryZOX4+l5mePHrzJ58nK1sunT1/LNN/NZsGA7tWp9gb19K+7dy13D3qT0/vIrSSgiS03pUp+ftmVuvpQRLaqx5OAl4uITNBRVztPT1UH3v396urpqZW2a12bDn5OokYajgoiIlIfZDw1L+uHQyMhojp26mqH40kpP74M29BK3MWhQGw4enEtw8EGqVy/N3Llbkm0rtfeZktDQ5B+QjYmJJSYm5VvTk+s7tfeXH0lCEVmqRaWivAgK46KXb4bbKF3EhmIFLfnr/D0NRpaznJ0K4uhgh6ODHU5F0ndK64n3S4aNnYtr+S6YOzWnW/9J+AcEqcojIqIYMmoWDu4dsHZthZVLS3xeBKjK5y7eQqM2IwkLj8DKpSVWLi25flP9xofMxPeOi0shnJzscXKyx9m5YLL1FAoFCoUWCQnqOwxFirRj1aq9uLl1xti4ISNGzAHg9etQzMwac+XKfVXddesOULlyP7VtMHjwdOzsWlKgQBPMzBrj4/N+fLagoFC6dJmAvn599PXr06XLBIKC3s/p88UXMxg1aj6NGg3D2Lgh1aoN4MED9SPttL6//ESuoYgsN6VLfX7efoKdY7tkuI0hTSuz+OBFOtcspcHIcs73I3th8d81ofT+YJuZGtG8SQ1m/jQUX79XtO76Hbv2n2Rgn9YA/LFqFydOX+PyseXYWJvz3DcQh0I2qvUH921DWXc3unw+kbsX1gNgYW6qsfjeGT++LxYWb9tN6gd37doDXLx4hxMnruHu7sKCBaPVyn18/Bk+fA5r107E1bUwenpvf64sLc1o2LAymzcfpmLF4gCsXLmX9u3rq9ZdvPgvjh27yo0ba7GxseD58wAcHGxV5WPGLMDL6zkXLixHqYSBA6fx7bcL+fPPcQCEh0eyceMhtm37he3b/0ebNmPZtu0o48b1SfP7y4/kCEVkufbVSnL3xStuegekXjkZXWuV5tIj30zPufKpsLezRF9fD319PeztLNO1rqWFGS2a1MDAQA9LC1OafFYVz5NXVeVWFmb4+r1i/6GzvA4KVUsmAEZGBlhZmgFgY22OjbU5OjraGotP1Ya91fs27K0SlZcu7ULTptVp3LgqDx/6cO7crUR11q2bRNu29Shb1o0SJZxUy/v1a8nKlXuJj4/n+fMAjhy5RM+eTd9vAyszfH0D2bv3NK9fh6olk7i4OFas2MOoUd2oUqUUVauW4ttve7B8+W7i4+NV9SZM+JymTatjbm6Kh0cNtSOitLy//EgSishyWlowsVNdft6R8Wsp+rraDGpUKc9dnM+IyMhoRv3wO1YuLalYtz9b/z5KXFycqrxX16b8PGEQ85dup2CJdnw+9H+EhUfkYMRJq1SpBIMHt2X9+smMHt2doUN/U/tBB3BySvroyMOjBpGR0Rw/fpVt247SsGFlXFwKqcr79GnOtGlDmDt3C9bWzendewph/11PCgwMUfX/TuXKJQF49er9w6wf3nVmamqU6JScSEwSisgW3WqV5sLDF9x/8SrDbXzlUYXVnteIjcvff9izF23m4JELXD6+nEfXtjBmWDe1coVCwZAB7bjk+SdnDi3h7IVbLF6+M2eCTSNX10L4+wep/aCnRF9fj0GD2rBx4yHWrNnPwIFt1MoVCgVffdWRa9fWcOHCck6fvsnChTsAsLZ++3zRtWsPVPXf/bflf0duImMkoYhsoVBoMb5DHf7316kMt+Fia467gw07L+Sdi/OpiYmNIzo6Rm1ZVGQMBe2tMC9gwqGjF5j662qiot7XCQ4JJyAwGICiroXR19cjQamehG2szQkLj+DeQ28iIqJ49lx9QrHsEBERxYsXAezY4cm4cUvo27cFtrZpP73Wq5cHy5bt4vLle7RpU0etLDg4jID/blQoVqwIBgZ6qiMMHR0dunVrzLx5W7l79yl37jxh9uxN9OjRFB0duaycGZJQRLbpU78cR289ydSgi/0+K8/Ko1c1FtOnbsyEhZg6NOPGLS/Vss97NufZc39s3FozbOxcRg7tgq/f+2tLhz0vUrhUexzcO+BavisVyxVj+GD1Sc8KF7ShU9sGlK3ZlyKlO7Jkxc7seksqU6eupHDhtvz44zJ69/Zg1qxhauWmpkYpPuxYsWJx3N1d+PLL9hgbG6qVHTp0AVvbltjZtaRIkXZUqlSckSO7qsrnzBmBrq42pUp1x929B8bGhsyePVytDYXi/c+jlpaW2muRNJmxUWSr+fvOc9/3NQsGeGRo/TdRsdgOnMWD+V9RyNI09RU05FObsTEhIQH/gOBkL5hHR8fw7HkAzo72iS64fyggMBjzAibo6mZszzwnZ2wMC3tD4cJt8fRcqHY95J3o6BiePfPH2dk+2SOPwMBgFApFDp3qynszNkpCEdkqMiaOosMWcHPWl1iYGGSojT4L/sbdwZrv29XWcHTJ+9QSyqciJxKKn99rduzw5O+/T2BgoMfOnTOytX/NyXsJRY7hRLYy1NOh32cVWPjPhQy30a9BeZYevqLBqERuEhkZzd27T2nWrDrr1k3K6XDEByShiGw3vHlV/jh0mZi4+NQrJ6FBaWcATt/z0WBUIrdwdi7IvHnf8M033TAxMcrpcMQHJKGIbGdbwJjmFYuy5tj1DK2vpQWfNyiXry7OC5EbSEIROWJ06xrM2p3x2RgHNqzIptO3iIqJS72yECJbSEIROaJEISuKF7Jiz6X7qVdOQiFLU6oXLczWs3c0HJkQIqMkoYgc822bmvy2O+PzffRtUD7Dp82EEJonCUXkmDolixAZE8v1pxl7SrtTjVKcvvcMv+Dk57sQQmQfeQ5F5Kgd5+6y7ewdNoxon6H1e8z7i2pFCzGyZXUNRyaESC8ZuEbkqHZVS/Dt2sP4Bb/Bztw43ev3qluWyVuPZXlCkQcbk5aTT8rnfvJgoxAapVBoMaBhBRYcyNiDjs0quPHwZVCemSdFiNxMEorIcV80qczSw5eJjk3/g47aCi161S3L+hM3syAyIUR6SEIROc7K1JDPyjiz6VTiGfvSole9sqw7cUPDUQkh0ksSivgkDGlamXn7zmVo3WpF387Ud9HLV5MhCSHSSRKK+CTUd3ciLCqGk3efZWj93vXKsuGknPYSIidJQhGfjBEtqjF/3/kMrdujThk2nLyZ4aFchBCZJwlFfDL61CvH/qsPeRYYmu51i9pb4mZnwdFbTzQfmBAiTSShiE+GmZE+PeqUYcmhSxlaPy+d9jpz/iY+LwLw9vHj3MXbubb/+Ph41VzuIu+ThCI+KV80rsyyf6+QkJD+c1ddarmz/ewd4jOw7qdm6szVHD91lZNnrjN15qpc1/+8eVsoXbonOjp1KViwNcOGzebKFfWBQGvWHEzp0j0T/YuKitbQuxDZTZ6UF5+USq72FLIwYe/lB7SuUjxd61qaGFLFrRD/XPWiRaWiWRRh9tDT1VHN866nq5tsvYiIKIyMkp5KOSoqBgMDvUT//U5sbBxxcfEYGupnuP/k7N9/hpYta/Hrr0Px9w9i+vR1rF69jxcvdqkmxbp16xFNm1ajUaMqauvq6Ginuz/xaZCEIj45AxpWZPmRq+lOKABda7mz5cztXJ9QnJ0K4uhgB4BTEXu1sifeL5m1YBN7/zmNz4sAOrSux/wZI7G1sQAgLDyC4d/NY9e+kxga6qOnq4PPiwDCfP5BX1+P6OgYvpu8hEV//gVA727NWDhzlFrCSan/tNi9e6YqIQGYmBjRpcsEbt9+QrVq7qrl9etXZMiQDuluX3ya5JSX+OT0rleWA1e9CAiNSPe6HaqX5O8L9zI8vfCn4vuRvahQtigVyhblu5E91crMTI1o3qQGt8+t497FDdy8/Zhd+0+qytdtPshT75c8u7WdCWP6EBMbR/DT/ejrv00YC5bt4MDhc5w/spRb59Zy7sJt9h8+m+b+0+LDZAIQEBAMQIEC6uO1+fsHcffuU/z8ZOicvEASivjkmBsb0L5aiQxN8WtpYki1ooU5eO2R5gPLRvZ2lujr66Gvr4e9naVamaWFGS2a1MDAQA9LC1OafFYVz5NXVeUPvJ5RsrgjRkYGlCrhDKB29LFh22EqliuOt48/d+49pYy7C3/tOZ7m/tMrODiMefO2ULVqKUqUcFIr+/nnVZQq1R17+1bUrDkYLy+fTPUlcpac8hKfpAENKzJsxQHGtq2V7nU71yzFljO3aVW5WBZElvMiI6MZP3UpqzceoICZMTGxcdSpUVZV3r1TYzw6jiE+PoFjp64y+utuKBTv9x2fPPWlgKkxe/85DUABMxOsLM2yJNbo6Bg6dvwBX99Adu2aoVbm6bkQe3tLFAoFV67c5/PPf6Z790mcP788S2IRWU8SivgkNSrrQmhkNCfvPqNOySLpWrdD9ZJ8u/YwMXHx6OXBC7yzF23m4JELXD6+HKci9sxdvIWzF96Pg6avp4uzU0FKFndizPDuFHN1UFvf2akg5csUZc60YVkaZ0REFN26TeTChTt4ei5MdHRSqVIJ1X83b16TiRP78/XXs1K80UB82uSUl/gkaWnBF00qsfzIlXSv++6014GrXlkQWc6LioyhoL0V5gVMOHT0AlN/XU1UVIyqfP7S7ZiaGKKnq8Pu/adY9Odf3L73RFXet7sHazYd4O99J4mLiyc8PJJXr0M0GmNgYDBNm47kypX7nD+/XC15JCckJBwAPT3Zz82tJKGIT9bAhhXZfPo2b6Ji071u55ql2Hom+x8IzA6f92zOs+f+2Li1ZtjYuYwc2gXfDy5q9+vRgtPnbvLPv+e5eOUuG7cfpkKdfoSFv73JYUj/dnzRrw2d+/6IXbE2WLq0YPXGAxqLLy4ujurVB3Hq1HVmzvyKgIAgTpy4yokTV7l9+zEABw+eY9iw2Zw+fYNnz/zYvv0o06evpXdvD3R0JKHkVjIFsPikNf5pHT3rlqXfZ+XTtd7r8Ejcvl6A35+jNHLa61ObsTEhIQH/gOAkL5g3aDWM/j1b0qe7BwB37j+lfO3PeXB5o9otwNHRMfj6vcahkE2Gn/1IasbGmJhY9PXrJ1m/R4+mrF8/mbNnb9K27Xf4+wepyrp1a8yiRWOwsMia6zmfnrw3Y6PsCohPWs+6ZVl/4ka6E4qliSFVi759yDEjz7N86hQKRbJ3X5Ur7caWnUcwNTXiifdLlq/ZQ+9uzRI9T6Kvr4ezY/qfMUmNnp4uSuXpFOvUqFGGly/34O8fRFBQGEWK2GJsbKjxWET2kiMU8UkLi4zBesBveC8ake4555cdvsLJu96s/rptpuP41I5QUhIWHsGeA6c5ff4mbi6FaFy/CqVLuaClpaXxvmRO+czIe0coklDEJ6/L7O3UKF6YUa1qpGs9TZ72yk0JJTtJQsmMvJdQ5KK8+OT1rFsmQ3PGW5oYUtm1IIeu5+6HHIXILSShiE9ei4rFeOwfzMOX6R+eo3NNd7afvZsFUQkhPiYJRXzydHUUdKnpzirP6+let1ONUuw4fzdPDGkvxKdOEorIFXrWLcOaY+lPKFamhpR3suPIzcdZEJUQ4kOSUESuULeUIwCn76V/8MCO1UvKaS8hsoEkFJFr9PrvmZT06lzTnW1n7yD3MwqRteTBRpFrdK9TmgaT1zC/vwfairQ/U1HQwoRiBS05ccebeu6OGer77e2xIml57/ZXkTFyhCJyjbKOtliZGHHs9tN0r9uxekm2n7uTBVEJId6RhCJyla613DM06GOnGqXYekYSihBZSRKKyFW6/DdnfHqvhzjbmmNvbsy5B8+zJjAhhCQUkbu8O+3leetJutftWKMUO87J3V5CZBVJKCLX6VrLna1n03/6qlONt1MDCyGyhiQUket0runO5tO30n3aq0QhKwz1dLn2xC9rAhMin5OEInKdck6Zu9trx3k57SVEVpCEInKljN7t1bFGKbZn4HSZECJ1klBErtS5pjs7zt9N92mvCs52vImO5d6LV1kTmBD5mCQUkSuVc7LF1ECf43fSf9qrkxylCJElJKGIXKtrLfcM3QbcsXopuY4iRBaQhCJyrY41SrEtA0caNYoX5sXrcJ74B2s+KCHyMUkoIteq4GwHwNUM3AbcsYbc7SWEpklCEbla55ru/H3hXrrX61CtpDw1L4SGSUIRuVq7qiUylFDquTtx78UrfIPCsyAqIfInSSgiV6tbypFH/sG8eB2WrvW0FVq0rVqCv+S0lxAaIwlF5GraCi3aVS3B9gzd7SWnvYTQJEkoItdrV7UEOzNw2qtRWRcuP37Jq7DILIhKiPxHEorI9ZqWd+XMfR9CIqLTtZ6ejjbNK7qx6+L9LIpMiPxFEorI9Yz0dWlazpU9lx6ke932creXEBojCUXkCe2qZey0V8tKxfC8/YTImLgsiEqI/EUSisgTWlUqxv4rD4mJi0/XeoZ6OjQq4yKnvYTQAEkoIk+wNjOiqlshjtx8ku51O1QvyY5zMlikEJklCUXkGe2qZewhx3ZVS7AvA0c3Qgh1klBEntGmSvEMnboyM9KnZnEH/rnqlWK9wMBAbty4QWxsbEZDFCJPk4Qi8gwXW3PMDPUzNGd8+2opDxa5atUqRowYwcqVKwkKCspMmGoePnzItm3bVK9fvnxJt27dCA+XIWFE7iMJReQprSoXY8/l9N8+3K5qCf46f4/4hLdTQHreeornrbeTdyUkJHDo0CGmT5/O7NmzsbW1TVObUVFRqS5/+fIlJ0+eVL22trbmp59+wtDQULUsISGByMjkH75Mrh8hspuWUpneSVSF+HQdu/2UcRuOcPrnfulet/aEVfzUtT6NyrpQ5fvltKpUjMld6vHzzz9z/fp1FAoFjo6OeHh4cPr0aSZMmADA1q1bCQoKYvDgwSxdupRHjx7x7NkzYmNjKVeuHOPHj0dLS4t79+4xa9YsgoODUSgU9O3bl9WrV5OQkKBqe8KECQwePJgNGzagUCjYsWMHmzZtAqBQoUJMnDgRS0vLFPsRIqfIEYrIU+qUdOSOTyABoRFpqr/++A3VfCod/hvb64l/MJce+arqjB49GoA///yTGTNmEBMTo3ZUEBUVpXodFRVFXFwcs2bNYvny5dy5cwcvLy/V+rVr12bNmjXMnj0bCwsLvv76awoVKsSGDRuYMWMGCQkJJCQkAPDmzRs2bdrElClTWLFiBZaWluzbty/VfoTIKZJQRJ6irdCiWQU39l95mKb6J+/5UHHsMsatP0LH6iX56/w9VnleV6vzbq9foVCk6QigQoUK2NvbY2pqSpEiRXj06BGvXr3i6dOndOzYEQMDAwoVKkSNGjVU6yTV9vnz5ylYsCClSpXCxMSEpk2bqp0eS6ofIXKSJBSR57SsVIy9abyOsnhQc4oXtGT636fx+N9GTA31mL/vPKRyJjg+Pm23GCsUb//E3l3I19HRSVQnubPO8fHxaGtrq7UVF5f0E/3v+hEiJ8m3UOQ5baoU5+C1R6oL7Kn5Z3wPDPR0uPf8Fd4BoYRFxQDJH4k4Ozvj6+tLVFQUwcHB3L59O9U+HBwcUCgU7N69m/j4eEJCQrh27Rr29vYEBQURFxenOtX1TvXq1fHx8eHJkydER0dz+PBhateunab3JEROkIQi8pwCRvqUcrDm+O2naarvbGvOxuHtMdTXJSoujrj4hCTrvTslVaJECezt7enTpw9ffvklYWHJT+717sjBwMCA0aNHs3PnTnr27MmgQYN48uQJbm5uFCpUiF69ejFmzBi1dU1NTWndujVjx46lb9++PHnyhJYtW6bYjxA5Se7yEnnSLztOEvwmipm9G6d5nSHL9rP62HUiY2JBCZM612Nyl3rJ1g8KCsLU1DTJ01jJUSqVBAcHY2Jigq6urmp5WFgYhoaGSbYVFRVFREQElpaWae5HiJwguzUiT2pZqRj70nhh/p3Fg5pTxMo01esn71hYWKQrmcDboxwLCwu1ZAKkmJgMDAwkmYhcQRKKyJMqONsREBqBz6vQdK33z/ge6OnqoKWABqWdsig6IfImSSgiz2pTpTi70znplrOtOZtGdECphJdBMvyJEOkhCUXkWS0rFWXf5fSd9gJoX70EG4a3x6OiWxZEJUTeJRflRZ71JioW24GzeL3yW/R1tVNfQQiRKXKEIvIsYwNdahR3wPPWk0y3dfHiRR4+TP1o582bN6xcuTLZBxAz0/+DB2k/fffgwQMuXbqk0Rg+dOnSJd68eZPm/t+8eZOl8YhPgyQUkae1qFg03Xd7JWXOnDn89ddfqdZ7+PAh/fv3x9/fP9193Lt3jzZt2iTb/86dO9Pc1s6dO5k9e3a6Y0iLe/fu0a5dO16/fp3m/l+9ekW7du24dy/9E6CJ3EMSisjTWlQsyv4rmh00MaW5SsqXL09cXByFChVKsY2IiMSDV0ZERODp6Zlq/0mt+05KD1mmZf3U+Pv706JFC5YsWUKRIkXS3L+joyNLliyhRYsWBAQEZLh/8WmThCLytFIO1kTGxOL1MvOTYp05c4YSJUpgampKiRIl1Pa2Hz9+jJmZGWZmZlhYWCQaRgWgSJEirFq1Cjc3N4yNjRkxYoSqbPbs2dSvX5+wsDBVO9euXVNb/9GjRzRq1AhjY2OqVaumdgrM29ub8uXLY2ZmhpubG6dOnVJb98mTJwwdOpQiRYpgbGxMp06dVEdRr1+/xszMjCtXrqjqr1u3jsqVKyd6D7Nnz+azzz5L9MR+av0DtGzZkgYNGjBnzpwkt6/I/SShiDyvdZXiaR4sMiWnTp1i06ZNeHl5YWdnx6xZs1Rlzs7OeHl5ceDAgWT30n18fBg+fDizZ8/m+vXrDB06VFX25ZdfsmPHDkxNTfHy8sLLy4vSpUurrb9+/Xq+++47goKCMDAwUJvpcdasWRgZGXH37l127tzJmTNn1NY1MzOjZcuWPHjwgEePHnHjxg3VKTRLS0saNmzI5s2bVfVXrlxJ+/btE72HI0eOUK9e4tEDUuv/nTp16nD48OEky0QeoBQij9t98b6y2c/rM9VGjx49lNOnT1e93rFjh9LW1jZRvQcPHigBZXx8fKIyQPn3338n28fly5eVpqamyfY/Y8YM1etffvlF2blzZ9VrBwcH5ZYtW1SvZ8yYoezRo0eSbQUHByuHDRum7Natm2rZzp07lba2tsq4uDilj4+PElA+evQo0XqA8vLly4naTGv/Fy9eVALK0NDQJGMTuZscoYg8r0k5V87c9yE6Nm1DzifnwwEY3d3d8ff3T/f88k5OGX/6/sP5UkxNTVWn1V6/fo2Pjw/lypVLsi5AZGQkI0aMwMzMjDJlyrB582ZiY2NV5R4eHkRGRnL8+HG2bdtGw4YNcXFxUWvj1atXwNujnQ+lpf93ChQooNaWyFskoYg8T19XmxrFHDh8I3MTUH34A3z9+nWKFy+OhYVFZsPLNEtLS1xdXblz545qWUxMjFqd3377jQMHDnDjxg2ePXvGd999p1aur6/PoEGD2LhxI2vWrGHgwIGJ+nF1dcXW1jbRcP1p6f+dO3fuYGtri7Ozc3rfpsgFJKGIfKFFBp+a/9D06dO5cuUKjx8/Zt68eckOJZ9Rtra2hIWFce/ePSIiInj27Fma1/Xw8OD333/nxYsXXLlyhfnz56uVR0ZGUqhQIczNzTl48CCTJ09Wm8YYoFevXixbtozLly8ne/tys2bNuHr1arr7f+fatWs0b948ze9L5C6SUES+0LyCG7su3s9UG40bN8bDwwNXV1d8fX0ZPnx4ojopTRFsamqaYnnhwoXp0qULJUuWxN7enoULF6qVf3jKTUtLS+31yJEjuXnzJoULF6ZNmzbUrl1brXzAgAF4e3tjbm7OkCFDGD16NL6+vmrtV6xYEXd3d7788kuMjY2TjLFPnz4sWLAg0XM2qfUP4Ofnx++//06vXr2S3QYid5OhV0S+UeTLeRz6sSclC1tnuI2EhASeP3+Og4NDmuaXz4iAgADMzc0TDXGfmvj4ePz8/ChYsGCSsSUkJODv74+9vX2S64eFhVG4cGE8PT2pVKlSsv38/vvv7N69m3379qkNuZ9S/3FxcTRr1ox27doxbNiwdL0vkXvIEYrIN9pUKc6Bq5l7yFGhUFCkSJEsSyYANjY26U4mANra2hQqVCjZ2BQKRZLJxM/Pj8WLF9O5c2caNmyYYjIBGDZsGBUqVODJkydp7t/Ly4vKlStLMsnj5AhF5Bt7Lj3g9/0X+GdCj5wO5ZPy5MkT5syZg7OzM4MGDcLExCSnQxK5lCQUkW+8iYql0Bdz8P9ztIw+LEQWkFNeIt8wNtClWtHCmb59WAiRNEkoIl9pXtFN44NFCiHekoQi8hWPCkX5+4IMoS5EVpCEIvIVd4e3twzffyFDfwihaZJQRL7TslKxTN8+LIRITBKKyHc8KrixXxKKEBonCUXkO03KuXL89tNMjz4shFAnCUXkO+9uH/a89SSnQxEiT5GEIvKl5hXltJcQmiYJReRLHhWKyoV5ITRMEorIl8o52fI6PBKfV6E5HYoQeYYkFJFvta5cjN2XHuR0GELkGZJQRL7VvKKc9hJCkyShiHyrSTlXPG89IT5BBtwWQhMkoYh8q4CRPuWc7Dh2+2lOhyJEniAJReRrHhXc5LSXEBoiCUXka83Ku/2/vbuNaXI74AD+50GTUmiRir1QhXFxG/rBQkKi3mCcfpggRChxW9yV4BdkiZGowxgziZvE7NoYqhOjxOt7IiFXZSQ4tkTgw6aIMqOgA3q1BIEooKWFChToyz4gjV0LtPogYf3/PvGc85znnCeh+fec56X4x9OX8z0Mov8LDBQKaMnx0eh+N4S3QyPzPRSiBY+BQgEtKGjy7cPV//5xvodCtOAxUCjg8e3DROJgoFDA25IYj7stHXDy7mGiz8JAoYCnDA/FT6Mi0KDvnu+hEC1oDBQiTN3txWUvos/BQCGCb8+jvHv3Ds+ePcPExMQXGhXRwsJAIQLwzc9XoP31O5iHrV7rr169in379uHKlSswmUyi9fvy5UvcunXLtd3b24sdO3bg/fv3ovVB9KUwUIgALAoWsEW9EjVPJh9yNA9bsef7vwMAHA4H7t69ixMnTkCn00GpVPp0TKvVezh9XN7b24t79+65tiMjI1FcXIyQkBBXmcPhwOjoqN/9EH1pQU4n720hAoDva5/gXnsXru3Nwum/PcSBa3fh/KEIx48fR0tLCwRBQGxsLNLS0tDQ0ICioiIAwM2bN2EymZCfn48LFy6go6MD3d3dmJiYgFqtxpEjRxAUFAS9Xo+SkhKYzWYIgoBdu3bh2rVrcDgcrmMXFRUhPz8f5eXlEAQBlZWVqKioAACoVCocPXoUCoVixn6I5gtnKBTQqh7pkXq8HOZhK1KT4l3XUf781wbELQsHABQWFgIALl68CK1Wi/HxcbdZgdVqdW1brVbYbDaUlJTg0qVLaGtrg8FgcLVPSUnB9evXodPpEBERgb1790KlUqG8vBxarRYOhwMOhwMAMDw8jIqKChw7dgyXL1+GQqFATU3NrP0QzRcGCgW0pLiv8M/2LiTsO4eB91YslUlxse4p3g4NIzxUAgCub/2CIPg0A0hKSkJUVBRkMhliYmLQ0dEBo9GIV69eYfv27ZBIJFCpVFi/fr2rjbdjP3r0CNHR0Vi9ejXCwsKwZcsWt+Uxb/0QzScGCgW0OOUSfPfbzegfGsH6P1zGV+Gh+EvNQ2CWhWC73e7T8QVh8iM2dSF/0aJFHvtMt+pst9sRHBzsdiybzTZjP0Tzif+FFPD2Z6zDL9d8DYfTiYYfu/Gfnrcz7h8XF4c3b97AarXCbDajtbV11j5WrFgBQRBQXV0Nu92OwcFBNDc3IyoqCiaTCTabzbXUNWXdunXo6elBZ2cnxsbGUFtbi5SUlM86V6K55Pl1iSgA/fD77Yj+3WlYx6ZmAE5887MVbvtMLUklJCQgKioKubm5EAQBkZGRiI6O9nrcqZmDRCJBYWEhTp8+jdu3b8PhcGDnzp3IzMyESqVCTk6O66L7FJlMhm3btuHQoUMQBAFyuRx5eXkz9kM0n3iXF9EHVY/0+PZMFUbHxgEE4Y+/3og//WbjtPubTCbIZDKvy1jTcTqdMJvNCAsLw+LFi13lFosFISEhXo9ltVoxMjIChULh1/kQfWn8WkP0gWZtAnb9Qo3gYN8+FhEREX6FCTA5y4mIiHALEwAzBpNEImGY0ILAQCH6yHffbkZ4iATg4xxEfmOgEH1kSagEtw/+CgCglEvneTRECwuvoRB58a/WLqz5iRJLPjyLQkSzY6AQEZEoeNswkR/Gx8dRV1eHzs5OrF27FsnJyT61e/HiBdra2gAAarUacXFxftX/r8ePH2PVqlUIDQ2dtr+hoSHX+IaHh9He3u7zeIk+Ba+hEPnh8OHD2L9/P54/f47Gxkaf27W2tuLGjRvYvXu3631c/tR/TK/XQ6PRYGBgYNp9qqqqoNPpXNtGoxEajQZ6vd7nMRP5izMUIj/U1dVBq9VCo9H41S4rKwtZWVnTtputfkp/fz/S09NRVlaGmJgYj3qLxQKZTOZRHhsbi7KyMqSnp6OxsRHLli3za/xEvuAMhcgHBw8ehFwuR0tLC7KzsyGXy3Hy5ElXfV5eHs6fP+/aPnfu3LRPtX8OnU6HzZs3IyMjw628q6sLiYmJkMvlWLlyJe7fv+/RNiMjA5s2bcKpU6dEHxcRwEAh8klxcTEMBgNkMhnu3LkDg8GAPXv2uOotFovbK+3HxsZgsVhEH0d9fT02bvR8er+kpARSqRTt7e2oqqrCgwcPvLbfsGEDamtrRR8XEcAlLyKfSKVSSKVShISEYOnSpfOyZDQ4OIimpiasWbPGo66yshI6nQ4JCQkAJn/Dpbm52WM/tVqNpqamaZfGiD4HZyhEC4TRaAQAyOVyt/KBgQH09PRArVa7yqb73Zbw8HC3YxGJiYFCJJKRkRHX33PxeFd8fDyUSqXH6/IVCgXi4+Ndtx0Dk7c3e9PW1galUjnrbclEn4KBQiSCxMRE1NfXY3R0FA8fPoRWq5123/HxcYyNjX1SfWpqKp4+fepRnpaWhtLSUrx+/RpPnjzBmTNnvLZvbm7G1q1bZz4Zok/EQCESQXZ2Nnp6eiCVSpGfn4/09PRpf6PkwIEDkEgkaGlp8bs+NzcXZ8+eRX9/v1v51LMxy5cvR2ZmJlJSUjz67+vrQ2lpKXJycj7xLIlmxlevEInE6XTCaDQiMjJyTvspLS1FdXU1ampq3F55b7fb0dfXh+joaI9rKDabDampqdBoNCgoKJjT8VHg4gyFSCRBQUFzHiYAUFBQgKSkJHR2drqVBwcHQ6VSeb0gbzAYkJyczDChOcUZChERiYIzFCIiEgUDhYiIRMFAISIiUTBQiIhIFAwUIiISBQOFiIhEwUAhIiJRMFCIiEgUDBQiIhIFA4WIiETBQCEiIlEwUIiISBQMFCIiEgUDhYiIRMFAISIiUTBQiIhIFAwUIiISBQOFiIhEwUAhIiJRMFCIiEgUDBQiIhIFA4WIiETxX+j+fq4WeD9RAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"dict-functions.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we have such functions designed to operate on objects of a given type, we can put those functions inside the class itself. When we do, those functions are called *methods*. We can call methods inside a class like this: `classname.methodname(arguments...)`. This is uncommon, but easy to understand (we'll soon learn a shortcut with some advantages that is a bit unintuitive at first)." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alice Anderson is 25 years old\n" + ] + } + ], + "source": [ + "#methods1.png\n", + "class Person:\n", + " def birthday(somebody):\n", + " somebody.age += 1\n", + "\n", + " def full(somebody):\n", + " return somebody.first + \" \" + somebody.last\n", + "\n", + "p = Person()\n", + "p.first = \"Alice\"\n", + "p.last = \"Anderson\"\n", + "p.age = 24\n", + "\n", + "Person.birthday(p)\n", + "print(Person.full(p) + \" is \" + str(p.age) + \" years old\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"methods1.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ok, here's the shortcut that is almost always used with methods:\n", + "\n", + "`p.birthday()` is the same as `Person.birthday(p)`\n", + "\n", + "Python is able to convert the simpler form to the full version because it can lookup the type of `p` and figure out it is a `Person`." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "__main__.Person" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One implication is that `p.birthday()` is actually passing in one argument (`p`), even though it may not be obvious. The parameter that `p` is passed to is called the *receiver*. Our receiver above is named `somebody`, but it is conventional to call it `self`. Let's redo the above example, using proper OOP style, and adding a second person:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Alice Anderson is 25 years old\n" + ] + } + ], + "source": [ + "#methods2.png 7\n", + "class Person:\n", + " def birthday(self):\n", + " self.age += 1\n", + "\n", + " def full(self):\n", + " return self.first + \" \" + self.last\n", + "\n", + "p1 = Person()\n", + "p1.first = \"Alice\"\n", + "p1.last = \"Anderson\"\n", + "p1.age = 24\n", + "\n", + "p2 = Person()\n", + "p2.first = \"Bob\"\n", + "p2.last = \"Bryson\"\n", + "p2.age = 20\n", + "\n", + "p1.birthday()\n", + "print(p1.full() + \" is \" + str(p1.age) + \" years old\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following diagram shows the stack while the `full` method executes. We called `p1.full()`, so `self` and `p1` point to the same object (if we had called `p2.full()`, then `self` would point to the same object as `p2`)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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VmT37t1cuHCBevXq8fzzzxtHEwBXrlzh4MGDxMfHU6NGDVq1amUsT05OZvv27dy+fRsHBwdq165No0aNMu3/pJoxYwYVK1bk119/Nb4HTZs2pWLFinz11VccOXKEZs2aGetHRESwa9cu7t+/T6NGjWjRogUAx48f586dO7i5uWFvb2+sn5qayr///su1a9dwcnLi5ZdfpnLlysby2NhY9uzZw507d/Dy8uK5554jLS2NK1euEBkZyfr16wFo1qwZPj4+nDt3juPHj5OcnIy/vz/PP/98kSRSIcoj+QtXxC5evMikSZPYsmUL//33HwCzZ8/m6tWrrFq1yjjKW7p0KZs3b2bOnDkAbN26lb/++guABg0acPPmTX7//XeqVavG1atXqV27NkuXLqVdu3ZMnjwZgM2bN/Pll19Su3ZtvLy8WLZsGadPn+azzz4jJSWFd955B41GQ5MmTTh//jxz5szhzz//JCgoyASvTOkRFRXFmTNn+OKLL4xJLUO7du344Ycf2L9/f6bE1q1bNypWrMj9+/dZtmwZY8aMoVu3bly4cIFdu3YRHBxMzZo1cXFxQa1W079/f+7evUvLli3Zt28fP//8M+vXr8ff35+rV6/y3nvvoVareeGFF9i+fTu//PILX375JSEhIWi1WrZv3w5AtWrVOH78OF999RXPPfccTk5ObNiwgaNHjzJlypQSfd2EKDMUkS9paWlKo0aNsvz33XffKYqiKNu2bVMaNWqk/PLLL0pcXJxiMBgUnU6nqNXqTO3s2bNHadSokRIZGakoiqJ8++23SocOHZS7d+8qiqIoERERSqNGjZQvv/xSSUlJURRFUdatW6e0aNFCSUtLU+Lj45UWLVooixYtMra5f/9+pUWLFopWq1WOHz+uNGrUSDl79qyx/MaNG0p8fHyxvj5lwenTp7O8Ng/7+OOPlY8//lhRlAfv57lz5xRFUZSUlBRlxIgRSosWLRS9Xq8oiqLcunVLadSokXLx4kVFURTll19+UVq0aKEkJiYa2+zVq5fy+++/K4qiKP3791fefPNNJTY2VlEURdHpdMru3bsVRVGU77//XnnvvfcyxfPee+8Z41EURUlNTVWCg4ML+SoIUX7JiK2AunfvnukbvY+PT6by9957zzjZwNzcHJVKxbJlyzhy5Ah3794lKioKgMTERDw8PADw9/enQoUKAHh6emJnZ0fdunWNo4rAwEDUajWRkZGEh4ejVqsJCQnh+++/ByAlJQW1Ws2pU6eoXr06AFOnTqVTp07UqVOHWrVqFeMrUnZkzIBUqbKfFKxSqdBqtZm21alTBwAbGxtatmzJ3r17iY2Nxd3dPcv+x48fx9XVlfnz5xu3abVadu/ezZtvvsmZM2cYOHAgLi4uQPrn48UXX8wx3jp16vDHH38wffp0GjduTMOGDeW9FOIxJLEVUM2aNWnZsmWe648cOZKzZ8/Sv39/qlevTkJCAuPHj89Xn+bm5gAoikJcXBwAFStWxNbW1lhn6NCheHt74+rqypIlS1i4cCE//PADarWa+vXr8+OPP2JnZ5evfssbPz8/AMLCwowJ62E3b97M9KXlUU5OTgCkpaVlWx4ZGYmrqyteXl7GbR06dMDJyYmkpCQAAgIC8hzvoEGDcHR0ZMuWLaxcuRKAyZMn065duzy3IcSTRBJbCUhISODIkSN8+eWXvPHGGwCEhIQUqk1fX18A4zf47NStW5eZM2diMBg4fPgwQ4cO5dChQ7z66quF6rus8/Lyws/PjxUrVtC6detM0/iPHDnCnTt3aNSoUY77Z9zXljHSflSVKlVITEzknXfeyVKmKAqQPq0/u8RkYWGR5Z46GxsbBgwYwIABA4iJiWHy5MnMmzdPEpsQOZAbtEuAvb09Xl5eHDx4kGvXrvHff/8xY8aMQrVZrVo16taty1dffcWxY8eIjIzk9OnTTJw4kWvXrrFnzx6mTJnClStXSEpKIiUlBQBHR8eiOKQyTaVSMWrUKM6fP8+oUaMIDg4mLCyMzZs3M3r0aGrXrp0l+Z84cYLIyEjWrVvH33//Tffu3XOcXdq5c2dOnDjBjz/+SFhYGKGhoWzYsIEZM2ZgZmZGjx492LRpE7///jt3797l6NGjfPrpp0D6xKHz589z7tw5QkNDiYuLY+TIkfz7779ERUUZTzfnlFSFEDJiK3LZXbcxNzdnxIgRTJ06lR07dgAY/3DmdNNvdjLqmpmZYW5uznfffcd3333HRx99ZKxTu3ZtHBwc8PLy4vDhw8aZlhUrVuSTTz6hadOmBT628uT555/np59+4ttvv6VPnz7G7R07dmT48OHG9zHj/5999hmxsbEAvPjii5le84xRWIbmzZvz5Zdf8sMPP/Dbb78BYGdnx4ABAwD46KOP0Gq1zJ49m9mzZwPw+uuvA+kj8BYtWvDuu+8CMGfOHDw9Pfn888+N7bdo0YKhQ4cW3YshRDljpjz6WymKjU6nIywsDB8fnyzTzAsjNTWVqKgoXF1dM11vg/TToBqNJtP1HpFZQkIC8fHxVKhQIcdRmE6nIzw8HAcHB1xdXTOVnT59mgEDBrB169YsI6mYmBj0ej3u7u5ZvvSkpaURGxuLs7Mz1tbWmcqSkpIwGAzG63k6nY7IyEjc3Nyy1BVCZCaJTYgCWrp0KWq1mn///RdPT89MsyCFEKYjpyKFKCBLS0suX75Mhw4dZAksIUoRGbEJIYQoV2RWpBBCiHJFEpsQQohyRRKbEEKIckUSmxBCiHJFEpsQQohyRRKbEEKIckUSmxBCiHJFEpsQQohyRRKbEEKIckUSmxBCiHJFEpsQQohyRRKbEEKIckUSmxBCiHJFEpsQQohypdCJbcWmf4oiDiGEEKJIyIhNCCFEuSKJTQghRLkiiU0IIUS5IolNCCFEuSKJTQghRLkiiU0IIUS5IolNCCFEuWJREp3ExcWxd+9erl27ho+PD61bt8bT0xOAq1evcvHiRQDq1atH5cqV89X2f//9h4uLC1WrVi1QbIXtP0Nqaio7d+4kNDSUJk2a0KhRowK1I0RRiYiIQKVS4eHhYepQhChRxT5iu3btGo0aNWLChAmcP3+eSZMm0bVrV2N5cHAwf/zxB++//z5btmzJd/szZ85k3bp1BY6vsP1nGDt2LMOGDeP8+fMcOXKkwO2I0kev19OvXz/69etH//79mThxIqGhoaYOK1erVq0q1GdaiLKq2Eds48aNo06dOqxduxYLi/TuNBqNsbxjx4507NiRTp06Pbad1NRUAKysrHKsk5SUhIODQ47larUaOzu7TNvy2n9udu7cydSpU3NtJ7sY8lKm0WiwsbEhLS0Nc3NzVKrM30nS0tLQ6XTY2toWKH6RM0VRUKvVjBs3DmdnZzZs2MC4ceP4/fffje+DRqPB2toaMzOzx7ZlMBhITU3FxsYmy3atVpvt+6fX69Hr9Y/97Ge0odPpcqyn0+nQaDTZ/o5oNBqsrKwyfa5yilWI0q5YR2zJycmsWrWK4cOHG5MakK9flNjYWLp37461tTXW1tZ0796d2NjYTHUOHz5MjRo1cHR0pEaNGly+fNlYFhoaykcffURAQAD29va8+eabREREFP7g/t+nn36Kk5MTZ8+epXPnzjg5OTFt2rRMdQICAliyZAlBQUHY29szdOjQPMV34sQJatSowWuvvYatrS2LFi3C3d2dF1980bi/Vqtl8ODBWFlZYWdnR79+/TJ9cRBFx9vbm8qVK9O3b1/S0tKIiIggLi6O0aNH069fP959913Wrl0LwKFDhxg2bBgzZ86kV69e7Nq1i/nz59OjRw/j6O/evXsArF27lh49etC3b1+GDRtGTEwMAEOGDGHixIn07NmTPn36sHr16mzjMhgM/PTTT/To0YPevXvz0UcfZfkMTJo0ibfffpsBAwbQp08fLly4AMCNGzcYMGAA/fr1o0ePHixatAggx1iFKBOUQlq+cUuOZVeuXFEA5c6dO7m207FjR2XOnDlZtvfv319p2LChcvz4ceXYsWNKvXr1lPfee89Y/vbbbyteXl7KyZMnlZCQEKVFixbK+++/byyPjo5WNm3apKSkpCjXr19XqlevrsyfPz/P/ecmOTlZiYiIUBwdHZVNmzYpERERSlJSUqY6gOLo6KisX79eOXv2rHLp0qU8xXf06FEFUFauXKm8/PLLipeXl3LkyBEFUG7fvq0oiqJ89913SpUqVZSTJ08qV65cUapXr66sWbMm38chcpaWlqZ069ZNCQ8PVwwGg7JmzRrlrbfeUtLS0pRly5YpM2fOVLRarRIZGam89dZbSkJCgrJ7927lrbfeUtatW6eEhIQoFy5cULp166ZERkYqBoNBOX36tBIVFaUkJSUp3bp1U4KDg5XExETlq6++Un7//XdFURTlvffeU+bMmaMkJiYqFy9eVN566y1Fp9Nlie/cuXNK3759levXrytpaWnK1q1blZSUFOXHH39UfvvtN0VRFOXGjRtKamqqoiiK8vvvvyvjxo1TFEVR/ve//ykzZ85UFEVREhISlKNHjyq3b9/ONlYhyopiPRUZHx8PgL29PQALFy4kKioKMzMzRo4cibm5+WP31+l0LFq0iGXLltG4cWMARo0axTvvvMP8+fON+48YMYKnn34agOHDh/Phhx+yYMECANzc3Gjfvr3x323atGH37t0MHDiwSI7Rzs4OOzs7bG1tcXd3N06KedSyZcvo0KFDlu25xefo6Mhbb73FkSNHePrpp2natCmOjo7cvXsXf39/li1bRqNGjbh16xYATz31FGvWrKFLly5FcnzigZEjR5KWloaDgwOfffYZFhYW7N27FwcHB6ZMmWKsd/LkSSB9pJ5xalqr1WJpacnUqVNp2rQpLVu2xN3dnd27d1OhQgVq1aoFQOvWrVmyZAm9e/cGoEWLFjg4OFCzZk0MBgORkZH4+PhkimvXrl00b96cwMBAANq0aZMl9tjYWBYsWMDdu3fRaDR4eXkBUKNGDVavXs3PP/9MgwYNaNasGWlpadnGKkRZUayJLeMXMCoqCmdnZ+Lj47l06RJLlixhyJAhuSa2qKgoABo2bGjcljHbMDo62vjL+fB1gdq1axMREUFsbCyurq6kpKQwduxYFi9ejLOzM6mpqbRo0aJIjzMvKlWqlO32vMaX3XU1SD+V5OzszMaNGwFwcXGRP0LFZPz48VSsWNH4RQ0gISGBnj17UrFiReM2T09PY3LLYG1tzZw5c9i1axenT59m1apVTJ8+Hb1en+n3QKVSodPp8hVXVFSUMallJy4ujm+//ZYPPviAJk2aGCdMAXTt2pWqVaty9OhRFixYwL59+xg7dmy2sT58jEKUZsV6jc3HxwdHR0f27dsHpI+sRo0alef9M6Ypnzlzxrgt499ubm7GbWlpacZ/nz17lurVq+Pq6grA9OnT2bp1K+fOneP27duMGTOm4AdUDAobX2BgIA0aNODXX381/jd16tRiivbJ5urqmimpAVSrVo3jx49TqVIlgoKCSE1NJSkpKcu+9+7dIzQ0lC5duvDVV1/h4ODAtWvXaNq0KWFhYYSGhqLVatmxYwfNmzfPV1x16tTh4MGDxutgR48eRavVGssTEhIAaNy4Mba2tpw9e9ZYtn//foKCghg4cCB9+vThypUrOcYqRFlRrCM2CwsLRowYwdixY2nQoAFPPfVUpokdj0pNTUWr1WJtbW3cv0ePHsyePZsGDRqgKAozZszg7bffzjQZZcqUKbRr1w4XFxdmz55tPLUH6SMiX19fXFxc+Pfff5k4cSItW7bMU/8lIT/xZefdd99lwoQJvPzyy7z++utoNBq0Wq2M2orQ42Y6Dh06lOXLlzNgwAA0Gg3m5uZMmjQpS73U1FTjpCJzc3OqVatGy5YtsbCw4I033mD06NGoVCqcnJwYMGBAnvrO0KlTJ65cucKQIUOwtLTE2tqan3/+2VhesWJFGjZsyPvvv49KpTKe6YD0L4o//vgjdnZ2WFlZMXDgwBxjFaLMKOxFusdNHlEURdFoNMonn3yiAMb/PvzwwywXwTt27GgsP3PmjHF7eHi40qJFC2PZiy++qNy7d89Y/vbbbyudO3dWvLy8FECpUqWKcuPGDWP5tWvXlCpVqhjLJk6cqDRs2DBLnDn1n1deXl7K4cOHsy1zdHTMsc3HxXf06FHF0dFRURRFGT16tDJ69Ghje8eOHVMURVFSU1OV0aNHGyeoAMq0adPyHb8oHJ1Op8TGxuZaLyYmxjiJ42EpKSlKdHR0oWJISUl5bAyxsbFZJjYpSvrvaHb75RSrEKWdmaIoSmES44pN/9Dz9Xa51ktLSyMsLAxfX98CjYiioqJQqVSZTkE+zGAwcOfOHfz9/bN8yzUYDERERGS56F5aFEV8Wq2W8PBw/P39M41mhRDiSVNiiU0IIYQoCbIIshBCiHJFEpsQudDrFS5fj873fhHRyUTHphRDRPmXlJzKrbsJpg5DiBIhiU2IXCQkaXl/XPaLCe88HMqIb3ZkW7Z8wwX+PXijSGIIuRXLmm2XjD9rtDpm/3YcvSHnKwkPx3Yy+B4//HY8X33mpQ8hSiNJbELkgzZVj+Ghy9JN6vkyrF+TLHVS0/TZ7p+izf3ma4OikKROy9TP/ahk9h67Zfw5TWdgzdZLPO4SeXaxQXrCyovH9ZHTcWi0ukxxC2EKMn1OiDya9NMBdhy8QQUvB8YMfJaGdXwIvhbF39uv8M2nL6LXK8xacoy/d1wBwNbGgn5d6wNw5UYME3/YR3RcCkEVXRnQvQEN62SdBfv3jit8v/Aotjbpv5qD+zzD6y9V5asf95Oi0dHm3RXUq+GFrY0lAO0H/AnAhvndGf6/7TR+qgJHTt0hTafnw7cbGWMDuH0vgXfHbCTkVhwvNavEx70b4+Vux7tjNjL+4xYEVXRBUaBt/xWs+qEL3y88mqWPm3fisz2O0LB4vpi1l4joZFI0Ovq/WZ9+XesV35shxGNIYhMij1o0DmDsB8/x947LrPv3Mg3r+JCm06PWpK98s/3gDY6dvcviqW9Q2d+Zb+ceNO77y5+n6P9mfV55LpCjZ+6wYOUp5k3OOpu4aQM/tvz6Fg72Vpy/EslHX27ltReDmPBJC/7cEsys8a0ww4zE5FT2HL3JxgVvYWFhhsosfduVGzEM6fsMjvZW3L6XYIwNQKcz8Nmg5ni52fHdgiP8u/86vTvVJSEpFb3BYKyXotGhKAqfDmiWpY+cjmPFpgs0fqoCQ/s+Q1JyKpcKcE1SiKIiiU2IPHqpWfp6n3Wre7FyU3CW8v/Oh/PKc5UJqugCgINd+nPRYuM1HD1zF0cHaw6duoNebyD4WhRxCRpcnLI+wunH3/8j+FoUEdHJAKSm6sm4NVP1//8w/qx6sA2gd8e61K2evhD37XuZJ4sE+rtQvXL6faCtng9kzbZL9O5UN8fjfbSPxx1HjSruzF9xEitLcxrU8qZpA98c2xWiuEliEyKfzM2zX+bK0lyFg23Wh3zGxKfPjOzVoa4xWfTtUg97u6x1P5u2i6YN/Jg1rhW2Nha07b/SuOCAIZtJHAW9nJWWpkejeXCdTHnMBJGMPh53HF1a16BaJVcOn77DrCXHeLq2N2M/eK5gwQlRSDJ5RIgi0vipCuw7fovYeA1xCRquhKY/MDSgghMuTjZcvh5NlQAXKvk6c+deIipV5gSpKBAdp6FhHR/cXGw5e/nBA3G9PewJj0hCr1cwKAp2NpbY2lgQEZ2c58kaak36hJTE5FS2H7xBo7rp1/iqVXbj2q1YFAWOn7trrP9oH487jgMnbhMY4MrAt55m0NsNOXup6B7mK0R+yYitDFm9ejXdunUzdRhPnDysQwxAk/q+LPv7HB0/XI2tjQVe7ulPArCyNGfq6JdZ/c9Fflt3lvCIJIIquvBcQ/8s/bz/VgM+/XYntjYW1KjyYCHrKgGuVK3kymsDVlIryINZ41vRq0Nd+o/dBKRP7EhvI+dgz1+JpNOHfxGXoKFudU96dXwKgE6tqvPN3ENMnX+YpvV9je2Ym5tl6SOn4zhzMYLPp++hgpcDdjYWDM1mNqYQJUWW1CpDJLGVfumjrhRcnWyyPWWZotWhGBTsbC1zbCNFo0Obqsv2+ltScio2NhZYmKefbMmYum9jnbfvqOqUNNQaHR6utpm26/QGktVpODtmXcc1uz6yO47UND0pGl22bQhRkmTEJkQuWvb83dQhlEmLprxO1Uqupg5DPIEksQmRi30r3jF1CEKIfJDJI0IIIcoVGbEJkYupU6eaOgQhSrUxY8aYOoRMyl1i0+l01K9f3/izk5MTLVq0YOjQofj5+ZkwMlGWjXivqalDKJVmLDzKmDEtTR2GMKGpU/eZOoQsyt2pSEVRCA4OpkmTJowYMYJ27drx22+/0bJlS2JjY00dnhBCiGJW7kZsGVq2bMm7774LQNu2bWnatCn79u2jY8eOAJw5c4YtW7YQHR3N008/zVtvvYWFhQXJycmsXLmSDh06EB0dzX///Uft2rVp2LAhR44cYdeuXSQkJBAUFET79u3x9U2/7ychIYHly5dz5coVqlSpwltvvYWnZ/rSRteuXWP//v288cYb/Pnnn9y9e5fu3btnGlkWhl6v5/bt28TFxaHX63F3dycgIABzc/MiaV8IIcqScjdiy06lSulr/GWM2H7//XcaNGjAunXruH79Or1792bw4MEAxMXFMWDAADp37kytWrV45513WLVqFUuWLOHZZ5/lwIED3L59m/HjxzN8+HAAY3IcNGgQV65cYfDgwdStW5fQ0FAATpw4Qf/+/alSpQoLFixg+/btNGjQgL/++qtIji80NJTo6Gj0er0xntu3bxdJ20IIUdaU2xFbBrVazcSJEwF49tlniY2N5eOPP+abb77hs88+A2Dz5s307NmTWbNmGffz9fXl2rVrBAUFodPpePnll2nTpg1btqQ/cDI1NZVz584BMH36dK5fv86dO3fw9fUlNjaWSpUqMXnyZBYuXGhsc+PGjbzwwgsAdOjQgQ0bNvDmm28W+hjj4uKybIuJicHMzAyVSmX8L+PnjJGcubl5pvKM/zK2P24VCyGEKK3KbWIbOnQoEyZMICwsDIDFixdTo0YN9u3bR2JiIufPnzeOuJKTk0lMTGT//v3UqlULgGHDhhEUFASAhYUFzzzzDDNmzGDo0KG8/PLLtGzZkkaNGgGwf/9+WrVqZTwt6erqSqdOndizZ0+mmFq2fHCRvWHDhqxYsaJYXwM7OzsURcFgMKAoCnq9nrS0NMzMzEhLS8NgMGT7n4WFBSkpKSiKYkxyGf+3trZGURQsLCywsLBApVJhYWGBpaUl5ubmWFpaGsuEEMIUyu1fn+7du/Pqq6/i6+tLnTp1cHdPX3cvKioKgOrVq2Nvb2+sP23aNAICAnJsb/Lkybi4uLBs2TJ++OEHAJYtW0avXr2IjIzk5ZdfzlQ/MDCQ9evX59iepWXOSyrll4uLS5ZRm5ubm/EaX2Ho9Xr0en2mxJeWloZer0en02EwGEhJSUGj0ZCSkkJaWpqx3NHREYPBgLW1NdbW1lhZWWFjY4ONjY0kPiFEsSm3f12aN29Ojx49smwPDAwE4KWXXso0gspw586dbNuzs7Pjiy++4IsvviAiIoIBAwYwYcIEevXqRY0aNfj3338z1d+9ezc1a9YsgiPJXeXKlQkNDSUxMTHT5JGiYG5uXuBJKGlpaaSmpqLVatFqtSQnJ5OcnGxMwnZ2dtjb22Nra4ujo6MkOyFEkXji/pLUq1ePZs2a8e6777JgwQJq1arF9evXWbhwISNGjMDNzS3b/Tp16kTPnj1p2bIlGo2GxMREKlSoAEDfvn158803mTRpEm+//TYbN25k//79zJ07t0SOydzc3HjatDSxtLTE0tIy08gY0ifz6HQ61Go1Go2G2NhYbt26hYWFBU5OTjg6OuLi4mKaoEWRi4pKIDw8jpo1fbG0fOL+5AgTKHezInOb8GBubs5ff/1F/fr1efXVV/Hz86NFixZcuHABZ2fnHPf39fWlR48e+Pr6UqVKFRwdHfn1118B6NKlC5MnT+bLL7+kWrVqjBgxgpEjRzJgwAAAVKpy9zIXWkYS8/LyokqVKtSvX5+goCBsbW2Jjo7mxIkTXL9+PduJMaLsWLJkD0OHLmHx4j3ExiYXWbvXrt3jr7+OGH++dy+OHj1mkZSkKbI+RNlV7r4+WVhYkNuTePz8/Fi7di1arZbw8HA8PT0zjSqy2//nn39m9uzZ3L17F29vb2xsHjxSxMzMjPHjx/Ppp59y+/Zt/Pz8sLOzM5Z369YtS5vjxo1j3LhxBT3Mcinj+puHhweQfntGQkICN27cwNPTE09PT6yt5ZEoZYXBYGD79rNMmfI2AQEeed5Po0nFxibr08Uf3n7vXhwHDlzizTebAeDh4cikSd2xfegxOgaDAa02DVvb7D8zOfUjyr5yl9jyw9ramsqVK+e5vqWlpfGeuOzY2NhQrVq1IohMQPrsUldXV/z9/YmIiODq1as4Ojri7u6Og4ODqcMTufjmm3WkpekZNWoZFSt60LZtAw4dusz48V0BWL36MLGxyQwc+CoLFuzg+vUIbt+OIi1NT716FRk3rgtmZmZcvnyX77/fRFxcMiqVGX37vsBvv+3FYFDo0WMWFSt6MH58FyZMWMXy5UMAWLv2KCtXHgLA19eVCRPexM3N4bH9iPLjiU5somxQqVT4+Pjg4+NDYmIid+7cwczMDB8fH5ycnEwdnsjByJGv07fvz/z66wfY29uwbdsZNJo0Y7lGk2b8WaNJQ6fT8/33fbC3t+bDD38hJOQ+Vav68Ouvu2jevAZvvfUsMTFJ3LoVzSeftOWvv44wY0YfzMzMiI9XYzCknxVJTtawcuUhvvqqGwEB7syYsZktW07Ru3eLx/Yjyg+5+CPKFEdHR2rUqEGFChW4d+8e165dQ61WmzoskY2MUVBeb/Zv0KAyPj4uODraEhDgwfXr94mOTuTmzUi6dm2CjY0Vvr5uNGv24KxIdm0fO3aNChVcqVXLHwcHW1q3rs+BA5ce248oX2TEJsokR0dHHB0dSUxM5ObNm9ja2sr6mGWAXm/IUz2VKj1ZZUw4sbDI+r7mdCldr1cwN3/wnV2lMkOn0z+2H1G+yIhNlGmOjo7UqlULR0dHLl26RHh4uKlD4t79GPYfPlMsbV+6eotzF0LytU/Y3UgOHztfLPHkR+XKnoSHx6HRpBIXl0xwcFiu+/j7u6FSmbFx4wn0ej3x8cmcOROKj48LsbHJ6HTpiwc8rGnTqoSFRRMaGoFWm8aOHedo3rxGcR2WKIVkxFbGrF69Otc63bp1K4FIShd3d3fc3d25e/cu58+fp1KlSjg6Opoklv2Hz9Dr/UloI3Zlewru8rVbvNJhGAt/HEubV5rk2M7iP7ZQtYofLZ598BSIOb+sJeTGHbasnpbneDZtPci4yb8QfWNz/g6kiGS8BDVq+OLj40KfPnNQqczw8HDi/28FzSJjJGVjY8XIka8za9YW1qw5isGg0KvX83To0BhfX1d69/4RX183JkzoatzX0dGWN95oxOjRf6BSmeHkZMeAAS8/th9RvkhiK0OexISVX76+vri7u3Pz5k1iYmIeO4vVVNxcnPhkYBcqV3r8hIVZc1fTrdOLmRJbWWJjY8WqVcONP5uZmTFlytvExibh6Gib6fTikCHtMu379dcPVg165pmqLFs2mLi4ZBwcbIw3eU+Z8jaJiSnY2lphYWGeqa933mlJt27NUKtTcXN7MIP2cf2I8kMSmyh3rK2tqV69OjExMZw4cYIqVarg6upa4nHcCY9i3aZ9hN2JoGXzBrRv/SwA9nY2eHu64eyY/gf32vU7HDxylnd6tOHof8FcDQnDzs6a6Jh4Tp6+wuI/0p8o0bt7a2PbwZdD2fDPASzMzXm7Wyt8fR7cJ6YoCus37+fwsfM4OdlzPyLzA3YPHDnLkeMXiIyKw9bGmhbP1efllg0xMzNj36HT3LsfQ/fOmUc4y/7cRp1agTxdr3qhXxdX1/zfqmFmZpbtfo6OtjnuY2NjJfepPaHkGlsZkpfTkOIBNzc3GjVqRGxsLNevX8/2xvuwsLBcb+gvqPrN+7Hsz3/5Y/V2Ovf6nHmL1gMQn5jMB8Omce1G+jWmU2ev8P7Q72j35qe80H4wA4ZMZduu40RExnL63FVWr9/N6vW7SUvTAbBjz380eP5dtu44yq9LN1H5qW7cvRdl7Pf9od/x1rtfsm3XcU6evsL8xX9niuub739n9fo93I+M5b/Tl2j35qdM+yH9SRNR0Qn0HjiZ4MuhxvqHj52n/ydTjP0LUdpJYhPlXsaI7eTJk8aHzWZITk7mwoULxdLv1jXTObpzPlf+W06Hds0ZN/mXLBMdHtayeQPuXfkbbcQu5s0YSa0alen/Tnu2rJ7GltXTsLNLX+2mSmVfLh3/gz2bfuTk3oU4Otjx765jABw8co6lK7byw9ShnN6/iLXL/scPU4dm6mfV4kkc3TmfJT9/zqY/v2PYoG4sXbEVgDfaPoeXpyuLfn9wPW7+kg00fromTRrVLuqXSIhiIYlNPBFcXV1p1KgRSUlJhIQ8mFXo7e1NWloa9+8X/b1MjZ9Of7qDnZ0Nr7d9jsQkNZFRcTnW/3zEO7i5OmFmZvbY2xaqVPalSmVfY9tP1anCmXPpx3To/2c/9ureOsd7xxKSkhk3eQEvvj6YKvW7M2vuasLvRwNgaWnBRwM688P8v0hMUnPvfgzLV29n8MCu2bYlRGkkiU08UQICAnBzc+PEiRPExcXh4uKCwWDg7t27pKSkFFu/Ls7pMzS1qWm51Mw/aytLFNJPp8bFJ1Klsi+ODnbZ1o2NS+SpZ/uyadth3nmrDYt//pxPB2eeQNHv7fQJFqvX7+a3Ff/g6GBH59ezPuJJiNJKEpt44mSM3qKjowkNDTU+EPXy5cvF1ueBw2cBMk3yyI2NtRW6tOxvLM5J82b1uB56l9i4xGzLDx+/QGKSmjVLv+a9d17nheYNCKzkm6mOr48H3Tu/zIyf/uTHBWsY/nH3Ak/C+O+/i1y7lvv9asnJKSxevAmdrmiv4/3330WuXr2d5/pXr97mxIlLuVcsoBMnLpGcXHRfoK5evc2GDfvZsGE/oaE538OZmprGP/8cZu7ctZmOLzk5pViP11QksYknil6vR6vVolar8fLywtzcnJSUFFQqFYqicO3atSLra+/B09y9F8XC3zex+I8tfDSgc7YraOTkxecbsHHbIa5dv8Ops1fQ63NPcs83ewqAj0bO4Oh/waxev5tZcx9MOqpRNf0BtKvW7+LytVv89fcevv9pZZZ2BvXvxJWQ20RExvJur9fyHPOjZs78k3Xr9uZa79q1MPr3/4aIR2Zw5sXlyzfp0GF0jv2vX78vz22tX7+PGTOyvh5F4fLlm3TqNJaYmIQiazM4+AZ//PEv778/hS1bDudYb+zYuQwbNpvz569z5MiDa8rR0fF06jSWy5dvFllMpYFM9y9ho0ePxszMjKlTp5o6lCfSvXv3uHfvHmZmZsZrWYqiGCd1JCYmEh0djbu7e4H7yLi21XvgZCIi0/9Qd2rfgq8+65+5HmaZ6j+qd/fW7DlwmtpNewMQG7qFnJZczGjLydGeqV8NYsyXc1mzYQ+ODnY826SO8dpeUKAfY4f1YuK3i5j47SK8PF1p8FTVLNf+nmtaF0cHO9q3eRa/Cp75fg2yk5SkxiGHU6T161dDp9uf65JoarXGOInmwTYte/aczLX/7PbNkJiYjKOjfbZledk/NxERMbz22qfMmzeKgADvbOskJCTj5JR9DGlpOnQ6fZZH8HTs2JKOHVvSqdOYx/a/c+d/TJ36EZ06ZT6lXLGiD/PmjeK11z7lyJEFeHqW/G0xxUFGbCXk119/pUuXLkybNo2IiAhTh/PE8vPzo27dugQEBGBvb09aWuZrXgaDgdDQ0EKdEnuz44ukRu4m9Oxqgo8u487FdaxaMglnp/T7sCp4u5MauZvm/z+6yqj/aIJ7qk4QR3fO5+6l9cTd/Ad7e1t+mDosy6oj29bOYOa3g40/D/+oOzE3tnDx2DIirm1g05/fZVp1ZNK4AUTf2Ezw0WWEnl2dpRzgxOnLJCapGdS/U4FfhwyHD5+nRo0eODq+So0aPTKNDm7cuIuT06s4Ob2Kq2ubbGeNBgR0YsmSzQQFdcPe/mWGDp1pLJsxYwUvvPARiYlqYztnzlzNtP/163d55ZXB2Nu/TJMm72U6NXnr1j3q1++Dk1MrgoK6cfDg2Uz7hoaG89FH0wgI6IS9/cu8+ebnRETEABATk4CT06ucOnXFWH/Zsq00avRulmOYMWMlL73UkPbtm2farlZrGDhwCt7e7XF2boWT06uEhT34+6DVpjJ48AysrFpiZ/cS/fp9jUajfezr/bBPP/0RJ6dXOXv2Gp07j8XJ6VWmTfsjU5327Zvz4otPM3Pmn3lut7STxFYEDhw4wNatWzl16hRff/01EyZM4NSpU5nq2NjY0LhxY6pUqVLk/ev1ekJDQzl9+jQnTpwgNDQ0T6etnlTW1tZ4enpSvXp1GjVqRFBQED4+PlhbWxuTy7lz5wrdj4WFOVWr+OHp4VKodjzcnfM9UnBwsCUo0C/HEZCjgx1Vq/jleGr0h/l/8XS96jzbpG6+433UwYNnWblyEiEhq/H2duX771cYyypXrkBIyGq2bp1JYmL2T2kIC4tgyJCZzJgxmLNnf+ejj7oYyz78sDNr136Lo6MdISGrCQlZTZ06gZn2/+OPbYwZ05vY2G3Y2Fjx11+7jWXff78COzsbLl1awfr1Uzh8OPOamk5O9rRv/xxXr/7J9et/ce7cddav3w+Am5sTL7/ciD//3GGsv3jxZjp3fiHLMezadYKWLRtk2T537jr27j3NuXO/YzAcJDh4Of7+XsbyH35YzZYthzl5cglXrvzJ4cPnH3vK8VGTJr1PSMhqHB3t2LRpGiEhqzO9fhmef74eO3Ycz3O7pZ0ktiKwfPly2rVrR8OGDdm6dSuTJ0+mYcOGnD//4Jekd+/efP7558XyINLQ0FCio6ONySw6Oprbt/N+wfxJ5+joaBzJ1a9fnypVqmQ7mntSqNUazM3N+XJs1pFHQYwY0YOnn65OlSp+DB/eg7//3m8sMzMzw9PTFS+vx58CW7bsSzp2bMlTTwVRo8aDZdLs7Gxwd3cGwNPTFU9PVywsMl9hGT++H61bN8XFxZG2bZtlGmGtXbuXESN6UKNGJZ56KoiRI3tm2tfNzYn27ZtjY2ONm5sTbdo0ZffuE8byd99tz+LFm9Hr9dy5E8muXSfo1at1pjbi45M4fvwiTz0VlOW43N2dCA+PYvPmQ8TEJGRKaunHvY1GjWpw69Y9goNv8NRTVVizZs9jX6uH2dnZ4Onpiq2tNe7uznh6umJvn3W1lnr1qnL8+EUSE5Pz3HZpJtfYikj16tXZvXs3vr6+3L9/n3r16rFlyxbq1i38N97cxMXF5WmbyJ25ubnxyd1PKjs7GxbP+azI2lOpHnx/rl27MhERscTGJuDqmveHxFbKZV3Nx3n4FK+jo53xdGdMTAJhYRHUqxeUbV2AlBQtY8f+zOLFm3F2diA1NY0WLR6s3dm2bTNSUrTs23eas2dDePnlRgQGZp5lGh0dD4CTU9bri336tCM5WcOsWavo3/8bevduw88/f2q83nfjxl2cne3ZuPEgAC4ujsZEXpScnR3+P9aEXK81lgUyYisilSpVwtc3/QPt7e1N69at2bZtW4nHUVzLQwlRUA8vxXX2bAjVq1fMV1IrLm5uTlSp4sfFiw+u+aU+cp/h9OnL2br1KOfOLeP27fWMGdM7U7m1tRXvv9+BFSu2s3TpPwwY0CFLP1Wq+OHl5UpwcGiWMpVKxccfd+XMmaUcP76QQ4fOM2fOWmN5YKAvDRpU59dfPzP+N3XqR4U88qwuXgzFy8uVypVzeNxCGSOJrZi4uroSGhpaIn25uLgY/53xjdNUj2wR4lFTpvzOqVNXuHHjLrNnr6J9++eKtH0vL1cSE9VcvnwTtVrD7dt5X0Wmbdum/Pjjau7ejeTUqSv88EPm9VhTUrT4+nrg4uLAv/8eZeLEhWg0qZnq9O7dll9+2cDJk5fp0OH5bPtp06Ypp09fzbI9Li6RyP+fOVutWgA2NlaZJtC8+257lizZzPr1+9DpdCQlqY0jwEelpqah1aZmW5abM2eu0a7dswXatzSSxFZMtm3bRq1atUqkr8qVK+Pi4mKcKODq6oparUarzfvsKSGKy6uvPkPbtsOpUuVNwsOjGTIk6+OXcrqNAdJPH+Z0SwSAn58n3bu/Qs2aPfHxeZ05c9ZkKn/4VKiZmVmmn4cNe4vz56/j59eRDh1G07x5vUzPaHvvvde5des+Li6tGTRoOiNH9iQ8PDpT+08/XZ3atQP58MPO2V6/gvRTjj/99JdxRmWG7duP4+XVHm/v9gQEdKJhw+oMG/aWsfzjj7syaFAXOncei5tbWxwdX2Xx4uyfqzd8+GxsbF7k7Nn83Yt5/34MP/64mt692+Rrv9LMTCnkuasVm/6h5+vtcq9Yjn300Uds27aN33//HVtbWxYtWsRPP/3Epk2baN++PQDh4eFotVp69+6Nj48P06dPx8nJCTc3tzz3s3r16jw/k02tVhMSEkKNGjWwspJHdxTG1KlTGfFeU1OHUSrNWHiUMWNyX27LYDBw504k/v5ej01ShREZGYuLi6PxeW15pdfruX8/hgoVPLKNzWAwEBERi49P9vc2JiYm4+fXkT175tCwYc5P6v7xx9Vs3HiQLVumZ5rgotWmcvt2BJUr+2SZ+PJwnfDwaPz9PXOsUxA6nY42bYbTqVNLBg8u2PMep07dx5gxj7+PrqTJ5JEiEhkZSdu2bUlMTF/KaNasWcakBumzInft2mX8ec2aNXz44YfMnTu3WOKxs7OjUqVKXLlyhZo1axbpL4MQ+aVSqXK8MbmoFPTmYnNzc3x9c74JXaVSZZvU7t+PYe3aPfz9935efrnRY5MawODB3bh9O4LQ0HtUrepv3G5tbZXp5+xYW1sVy/WvkJA7NGpUs8BJrbSSv3ZFpFmzZmzZsoWIiAi8vLyyJJKdO3eWeExOTk74+fkZk9vDp2CEEIWTkqLl0qWbtGnTlPffzzppJDvfffdxMUeVPzVqVCp1MRUFSWxFyMLCwjgzsrRwdXVFp9Nx9epVqlevXmyngYR40lSuXIHZs4ebOgyRDUlsRaBRo0b4+z/+VIIpeXp6kpaWRkhICFWrVjV1OEIIUawksRWB9957z9Qh5MrX15ebN29y8+ZNKlWqlPsOQghRRslFlydIpUqV/n/pnzumDkUIIYqNJLYnTGBgIMnJyURGRpo6FCGEKBZyKrKMWb16da51Hnevm5mZGVWrVuXy5cuYm5vn6z46IYQoCySxlSF5vTk7NyqVimrVqnH58mUsLCxwcjL9un2l3YyFR00dQqk1dWren1AtREmQxPaEsrCwoHr16ly6dMn4mBaRM1l5JHt5XXlElF+l8YuNXGMrQ/JyGjI/LC0tqVatGtevX0ej0RRp20IIYSqS2J5wNjY2VKlShatXrz6xD9YUQpQvktgE9vb2xnUlM57CLYQQZZUkNgGkryvp6+vL1atX5WGlQogyTRKbMHJ1dcXd3Z1r1/L3PCchhChNJLGVMJ1OZ+oQHsvT0xM7Oztu3Lhh6lCEEKJAJLGVgBs3btChQwecnJywtLTklVdeYc6cOaU2yfn5+QEQFhZm4kiEECL/JLGVgBs3bnDv3j1mz57NP//8Q506dfjkk0+YPXu2qUPLUWBgICkpKbL0lii0qKgEzp27RVpa6fwiJ8ofuUG7CBw4cICkpCS8vb3ZvHkzqampdO7cmaeffhqAli1bcuzYMWP9Nm3asG3bNnbv3s3IkSML3b9er+f27dvExcWh1+txd3cnICAAc3PzQrWbsfSWhYUFrq4FezqxeLItWbKH7dvP4u3twtixHfHyci6Sdq9du8fp06G8+WYzAO7di2PYsCX8+uuHODjYFEkfouySEVsRWL58Oe3ataNhw4Zs3bqVyZMn07BhQ86fPw+Q5Wnaer2e8PDwIksWoaGhREdHG6fqR0dHc/v27UK3a2ZmRrVq1bh79y6JiYmFbk88WQwGA9u3n2XKlLeZMaNPnpOaRpOa6/Z79+I4cOCS8WcPD0cmTeqOra1lpv5TUrT57keUfTJiKyLVq1dn9+7d+Pr6cv/+ferVq8eWLVuoW7dulrpLliwhMTGRXr16FUnfcXFxedpWEObm5salt4KCgrCzsyuSdkX5980360hL0zNq1DIqVvSgbdsGHDp0mfHjuwKwevVhYmOTGTjwVRYs2MH16xHcvh1FWpqeevUqMm5cF8zMzLh8+S7ff7+JuLhkVCoz+vZ9gd9+24vBoNCjxywqVvRg/PguTJiwiuXLhwCwdu1RVq48BICvrysTJryJm5vDY/sR5YeM2IpIpUqV8PX1BcDb25vWrVuzbdu2LPX++ecf3n//fQYPHkzbtm1LOswCsbS0pGrVqoSEhKDV5vwNWIiHjRz5OgC//voBU6f2IjVVh0bzYHUbjSbN+LNGk4ZOp+f77/uwcOGHXLx4h5CQ+/+//y6aN6/B0qUfM2NGH1xdHfjkk7b4+rqyfPkQpk7thcGgYDCk33+ZnKxh5cpDfPVVNxYt+hA3Nwe2bDmVaz+i/JDEVkxcXV0JDQ3NtO3ff//ltdde4/3332fmzJlF1peLi0uethWGra0tgYGBXL16tdTO5hSlS8YoSKVS5WlE1KBBZXx8XHB0tCUgwIPr1+8THZ3IzZuRdO3aBBsbK3x93WjWrJpxn+zaPnbsGhUquFKrlj8ODra0bl0/02nL7PoR5YsktmKybds2atWqZfx52bJltGnThrFjxzJ//vxCT+x4WOXKlXFxcTG2aW5uTkBAQJG1n8HBwQF/f3+uXr2KwWAo8vZF+afX5+1zo1KlJ6vY2GQALCyy/r7ktECOXq9gbv7gT5tKZYZOl/1ScRn9iPJFElsRCQkJ4dChQ5w6dYrBgwdz5coVBg0aBKQntXfeeYeuXbvy2muvceDAAfbv38/+/ftRq9WF7tvc3JygoCAaNGhAo0aNsLe3Jzk5udDtZsfFxQU3NzdZnaSMiYiMZdO2QwRfyv3Ge602lT0HThGfkATA5Wu3OH3uaqFjqFzZk/DwODSaVOLikgkOzv0+SX9/N1QqMzZuPIFeryc+PpkzZ0Lx8XEhNjYZnU6f5UtW06ZVCQuLJjQ0Aq02jR07ztG8eY1Cxy/KDpk8UkQiIyNp27atcfbgrFmzaN++PQDXr18HYM2aNaxZsybTfsHBwZlGdkWhQoUK3Llzp9geIOrt7U1qaiqhoaFUrly5WPoQRWf0hJ+ZNXc1jg52tGvVjGULvnhs/Zi4RFp3HsGujbN5vlk95i5cz8XLoWxbO6NA/WecKaxRwxcfHxf69JmDSmWGh4cTFSpkv0/GSMrGxoqRI19n1qwtrFlzFINBoVev5+nQoTG+vq707v0jvr5uTJjQ1bivo6Mtb7zRiNGj/0ClMsPJyY4BA15+bD+ifJHEVkSaNWvGli1biIiIwMvLK9MU/wkTJjBhwoQSi8XBwQGApKQk47+LWkBAACEhIYSHh1Mhp79OwuQSk9TMmruaZQu+oHvnl0v06Q02NlasWjXc+LOZmRlTprxNbGwSjo62mU4vDhnSLtO+X3/dw/jvZ56pyrJlg4mLS8bBwQZLy/TfrSlT3iYxMQVbWyssLMwz9fXOOy3p1q0ZanUqbm4Pfgce148oP+RUZBGysLDA19c3y31rplChQgXCw8OLtY8qVaoQHx9PbGxssfYjCiYpKYWvp/0GwL2IGBb/sYXomAR27z/Jzr0nMtVdv3k//526lF0zRc7V1SHba2aPY2ZmhqurgzGpZXg0QT7MxsYqU1ITTw7T/wUuBxo1aoS/v7+pw8jEycmJO3fuoFari+3es4wbuC9evIilpWWxjQ5FwSSrU9i6M33Fm43/HMTS0oJmz9ThtxVb0Wi0vPJCI2Pdb2cso/VLz9D46ZqmCleIIiOJrQi89957pg4hWxmjtqCgoGLrw9zcnGrVqnH58mWqV6+OjY0sZ1RaeHu5MX3yR7TvPpq/lk7G2Um+eIgng5yKLMdcXFzQ6/VoNJpi7cfa2poqVapw7do1eQK3EMLkJLGVcx4eHsV+rQ3SJ6zIE7iFEKWBnIosY1avXp1rnW7duhn/7ebmxp07d0hNTcXKyqo4Q8PNzY3k5GRCQ0MJDAws1r5EwTnY2xJ+LyrL9uJcLjE1NY2dO/8jNDScJk1q06hR3q7lXb16m4sXQwGoV68qlStXyFf5o06cuETNmpWwt7fN9zEUJL4MOR1/cnIKly7dzPPrIfJGElsZ8nDCyo+Ma22VKlUq4oiyCggI4OrVq8bbHkTp8+qLjVmwZAPbdx/Hw92Z5at3cOrsFVq/9Eyx9Tl27Fw2bz7Eq682xmBQ8vyHPDj4BsuXb2fPnpN8+eV7fPRRl3yVP+zy5Zt06jSWQ4fmF1liy2v/OR1/dHQ8nTqNZceO2dSoUfy/n08KSWxPAA8PD+7cuYOfn1+J3IoQFBTExYsXsbGxKbabxEX+PLye4isvNKJT+xa07z4agA7tmuPv65llxGZG0Q3hdu78j6lTP6JTp5b52q9jx5Z07NiSTp3GFKg8Q0REDK+99inz5o0iIMA72zoJCck4OdlnW5aWpkOn02Nra12g/nM6/ooVfZg3bxSvvfYpR44swNNTnntYFOQa2xOiJO5ry6BSqahWrRqhoaHyNAATa/XSM6RG7sbJ8cEfbEcHO1YtmcTtC2u4f3UDfy39mutnVjFp3AAAKni7kxq5m+bNngJg1rdDCrzqyKef/oiT06ucPXuNzp3H4uT0KtOm/WEsHzDgW+bOXWv8+eef1zJgwLcF6utxZsxYyUsvNaR9++aZtqvVGgYOnIK3d3ucnVvh5PQqYWERxnKtNpXBg2dgZdUSO7uX6NfvazSavH+mczt+gPbtm/Pii08zc+afhTtIYSSJ7Qnh5eVFVFRUiS1ebGVlZXwagCyYXDp5e7nh6uJYrH1MmvQ+ISGrcXS0Y9OmaYSErM50ui4xUZ3pgZ9abSqJiYVfP/VRu3adoGXLBlm2z527jr17T3Pu3O8YDAcJDl6Ov/+DU+g//LCaLVsOc/LkEq5c+ZPDh8+zZcvhPPeb2/FneP75euzYcbxAxyayksT2BCnJURuAo6MjHh4exrUyxZPHzs4GT09XbG2tcXd3xtPTtciub+VVfHwSx49f5Kmnst7P6e7uRHh4FJs3HyImJiFTUgNYtmwbjRrV4NatewQH3+Cpp6qwZs2ePPed1+OvV68qx49fJDGxeBYvf9JIYnuC+Pj4cO/evRLvEyjxfoXIEB0dD4CTU9YVePr0ace33w5i1qxVeHi04513vsqUXG7cuMu9e9Fs3HiQjRsP4uLimCX5FQVnZ4f/jzWhyNt+EhV6JkHP19vlXkmUGhUqVODevXvGhFMSqlSpQnBwMPb29jg6Fu+pL1H2qNUPFhAojnsgq1Txw8vLleDgUIKCMi99p1Kp+Pjjrnz8cVf+++8ib701gTlz1jJ27DsABAb60qBBdX74YXh2TReZixdD8fJyzfV2BZE3MmJ7wvj4+HD37t0S7VOlUlG1alVu3LghT98WmdSvX5Vdu06QkqLl6NELTJ26LMe6qalpaLWpBSpv06Ypp09nfaZcXFwikZHpi3hXqxaAjY1VpmvC777bniVLNrN+/T50Oh1JSWrjCDC/8T3OmTPXaNfu2QLtK7KSxPaEUalUeHp6EhERkXvlImRjY0NAQADXrl2TlUmEUefOLxAWFomd3UsMHDiV1157LsdnpA0fPhsbmxc5ezb7h9w+rrxPn3b89NNfRETEZNq+fftxvLza4+3dnoCATjRsWJ1hw94yln/8cVcGDepC585jcXNri6PjqyxevLlA8eXk/v0YfvxxNb17t8nXfiJnZor8lXni6HQ6Lly4QP369Uu875s3b2Jubl7qnobwOFOnTmXEe01NHUapNGPhUcaMyd+9aY9SFIXo6Hg8PFyKJqgc/PjjajZuPMiWLdMz3c+p1aZy+3YElSv75Hifp1abSnh4NP7+nkV6L6hOp6NNm+F06tSSwYMLtgCDqU2duo8xYx5/H19JkxHbE8jCwgIXFxeiorIuq1TcKlasSFxcHAkJcpFcpDMzMyv2pAYweHA3GjSoRmho5olM1tZWVK3q/9iEZW1tReXKFYp8gYOQkDs0alSzzCa10koS2xOqpKf+ZzAzMyMoKIjQ0FC53iZK3HfffUzVqqXnbEGNGpX47ruPTR1GuSOJ7QllZWWFvb09MTExuVcuYra2tlSoUEHubxNCFAtJbE+wjKn/puDp6Ym5uTn37983Sf9CiPJLEtsTzNbWFisrK+Ljs5++XNwCAwOJjIwkJSXFJP0LIconSWxPOF9fX2JjY03St0qlonLlyly/fl1uARBCFBlJbE84Ozs7tFotiYmJJunfwcEBR0dH7ty5Y5L+hRDljyQ2YdJrbQD+/v7ExsaSnCwLwAohCk8eNCpwcnLizp07qNVq7OyyLhRb3DJOSd64cYM6depkeihmaTFj4VFTh1BqTZ26z9QhCJGJrDwiAIiLiyM6OpqgoKyP9igpZXFVEiFE6SOnIgUALi4uaDQaNBpN7pWLSUBAADExMXJKUghRKIUesa3Y9A/PN3uxiMIRJSHAI/sHPUZHR5OQkEBgYGAJR/RAfHw8d+7coXbt2iaLQQhRtsmITRi5u7uTmJhIWlqayWJwdnbG0tKyxJ8+IIQoPySxiUz8/PyIjIw0aQwVK1bk7t276PV6k8YhhCibJLGJTNzd3YmIiDBpUrG2tsbT05OwsDCTxSCEKLsksYksfHx8TLLy/8MqVKhAfHy8LLclhMg3SWwiCx8fH5MvTqxSqfD39+fmzZsmjUMIUfZIYhPZ8vHxMelqJABubm6YmZkRHR1t0jiEEGWLJDaRLVM9iPRRlSpVIiwsDIPBYOpQhBBlRIktqZWamsrBfbsJu32L+g0bUa9+wzztd+P6Na5duQxAzdp1CahYKV/lomBUKpVxIomXl5fJ4rCxscHFxYXw8HD8/PxMFocQouwosRHblMlf8NX40Vy+dIFT/x3P835XL19i3V8rGTPiY3bv2JbvclFwpl4c+eE4IiIi0Ol0pg5FCFEGlNiI7eD+PXw24WvavPZGvvZr3e51Wrd7nQF9uheoXBScpaUlbm5uxMbG4urqarI4rKys8PDwIDw8nICAAJPFIYQoG4p9xPb1l59RO9CbixfO8X7ft6gd6M28n2Yay0cP+4jfF/9i/HnpogWMHvZRcYcl8sjDw4O7d++aOgwqVKhAdHQ0qamppg5FCFHKFXtiGznmC/YfP4+DgyOLl69h//Hz9Hl3oLE8KSkRrfbBwrupqVqSkkzz0EuRlY2NDdbW1sTHx5s0DgsLC7y8vEpFkhVClG7Fnths7exw9/DExtYWV1d33D08sbO3L+5uRREqLTMkfXx8iI+PR6vVmjoUIUQpJtP9Ra7s7e0xMzMjKSnJpHGoVCp8fHy4c+eOSeMQQpRupSKxpaSojf+W556WTqXhhm0ALy8vEhMTZaktIUSOTJ7Yatd9ikP796JJSeHUiePM/XFGjnXT0lIfexoqt3JRcM7Ozmi1WpMnFDMzM3x9fWWBZCFEjkye2Nq81oHwu3eoXtGdsSM/4aVX26BSZR/WV+NHU83flYsXzhWoXBSOn58fMTExpg4DDw8PUlJSUKvVuVcWQjxxSsUTtBVFITYmGjd3j0K1I/Impydo58XZs2epVasWlpaWRRhR/kVGRhIfH0/VqlVNGocQovQx+YgN0k8vSVIrG0rLtTYPDw/UajUajSb3ykKIJ0qpSGyi7PDy8iIyMtLkk3zMzMxkhqQQIluS2ES+lZZRm6enJ8nJyTJhSAiRiSQ2kW+lJbGZmZnh7e0tq5EIITKRxCbyLeORNpGRkaYOBU9PT+Lj40lLSyu2PvR6Pf369aNfv37079+fiRMnEhoaWmz95deOHTv49NNPC7SvRqNh1qxZ8rw7Ua5IYhMFUqFCBRISEkwdBiqVCk9Pz2IdQSqKglqtZvjw4UyYMAE3NzfGjRuXKRloNJo8XXc0GAzZTngxGAw53iOo1+sfu/hzkyZNGDx4cJbtOU2sebif1NRUDh06lCWx6XS6x640k1PbaWlp6PX6TNsURZFJPqJEldhja0T5YmlpiZmZmckfaQPg7e3N+fPn8fX1xdzcvFj78fHxoW/fvhw4cICIiAhsbGz45ptvuHXrFjY2NnTo0IEuXbpw6NAhVq1aRaVKlfjvv/947733uHr1Kjt37kSlUmFjY8OUKVPw8fFh7dq1rFy5EgBfX19j8hwyZAhubm4EBwejUqno2rUr3bp1yxJXcHAwGzZs4JtvvuHQoUMsXboUCwsLIiIi8PHxYfz48Xh5ebF7927mz59v3G/IkCFs3boVgN69ewOwZMkSvvvuO86fP49KpcLKyooxY8ZQp06dx7YdFxfH1KlTCQkJAaBZs2aMGDGCbdu2sXjxYgCqV6/Ohx9+iK+vb7G9R0KAjNhEIZSWa20WFha4urpy//79Yu9LURRjcvLw8GDz5s34+vqydOlSpk+fzqpVq0hMTCQ1NZV79+4RGBjI5MmT8fHxYefOnfz888+sWLGC4cOHY2lpSXJyMitXruSrr75i0aJFuLm5sWXLFgDUajVeXl4sWrSIiRMnsmbNmiyjIUgfJWWMiFJTU1Gr1QwaNIjly5fj7OzM/v37Afj111/58MMPWblyJdOnT8fNzY2RI0cCsHTpUpYvX46NjQ19+vThjz/+YOXKlbRu3ZoVK1bk2vamTZswNzdn3rx5LFq0iNq1a6PRaFi6dClTpkxh+fLl+Pv7s2nTpmJ/j4SQEZsoMDs7O1QqFYmJiTg6Opo0Fm9vby5duoSPj0+OK9cU1siRI0lLS8PBwYHPPvsMCwsL9u7di4ODA1OmTDHWO3nyJAABAQF06tQJAK1Wi6WlJVOnTqVp06a0bNkSd3d3du/eTYUKFahVqxYArVu3ZsmSJcYRVIsWLXBwcKBmzZoYDAYiIyPx8fF5bJze3t7UqVMHgDp16nD9+nUAAgMDWbp0Kbdu3aJJkybUrFnTeDpZpVIZX7fY2FgWLFjA3bt30Wg0eHl55dr2nj17GDhwIG5ubgC0bduW/fv3o9frWbp0KQAxMTEkJSUxcOCDx1YJURwksYlC8fHx4f79+yZPbDY2Njg6OhIZGYm3t3ex9DF+/HgqVqyI/UOPXUpISKBnz55UrFjRuM3T09OY3DJYW1szZ84cdu3axenTp1m1ahXTp09Hr9dnOn2qUqnQ6XRFFvPDbU+cOJE9e/Zw5swZJk6cSN++fWnevDnwYPHxuLg4vv32Wz744AOaNGlCcHAwf/zxR65tJyUlYWGR+c9JZGQk/v7+9OrVy7jt0TpCFAc5FVmGHNld+k7jZCyOXBomB2Qk2eLi6uqaKakBVKtWjePHj1OpUiWCgoJITU3NdtLFvXv3CA0NpUuXLnz11Vc4ODhw7do1mjZtSlhYGKGhoWi1Wnbs2GFMNkVt586dvPTSS4wcOZKmTZty6dIl7O3tUalU3L9/H4PBYBzBNW7cGFtbW86ePZuntgMDA9m8eTNJSUmkpaVx6NAh6taty61bt1AUhaCgIFm8WpQY+fokCq1ChQpERERkGrWYgr29PRYWFkU+ocXMzCzHsqFDh7J8+XIGDBiARqPB3NycSZMmZamXmprKtGnTgPSRTrVq1WjZsiUWFha88cYbjB49GpVKhZOTEwMGDMhT3/mNfd26dSxcuBA7OztcXFwYPXo05ubmtGvXzni7wJIlS2jYsCHvv/8+KpUq02nIx7U9ePBgvv76a/r3749KpaJevXp8/vnnfPDBB8ybN4+IiAg0Gg3PPfdcsSVuITKUikWQRd4c2b2JZi+9Xuh2CrMIck7OnDlDnTp1TH6qKTY2lvDwcGrXrl2i/er1ehITE3FxcXlsvdjYWBwcHLIsIq3RaFCr1cZrVMUlYzTp4OCQpX9IP6UL6ackLS0ts4xQc5OYmIi5uTl2dnaZtickJGBjY4OVlVVBQxciz+RUpCgS3t7eJTIrMTeurq7odDqSk5NLtF9zc/Nckxqkx5fdkxFsbGyKPalBekJ7NKll9J+R1ABcXFzyndQAHB0dsyQ1ACcnJ0lqosRIYhNForQkNihdsQghSp4kthKg1Wo5dGAvCQnxmbZfvXKJHf9u4f79cBNFVnTMzMzw8PB4YpbZEkKUXpLYSkBcXAw9OrfjUvB5IP2G2k7tXuSV5g0Z8sG7bP9ns4kjLBql5YbtjLUsZdQmxJNJZkWawLEjBzn53zEOnrhIQMVK2a4mURZZWVlhZ2dHXFxcnq43FSdvb28uXryIr69vkdywnRa1p/BBFTNLjxeZOnUqY8a0NHUoT6hnTR2A+H+S2PIh7PYttm7+m8iI+3h6edO8xYvUqvOUsXz3jm2cOH4UgOdavMBzz7+QpY3Q6yEsnP8THp5eHNy/GzMzM956u2+h4opXa5i0Zg//nr5GfIqWbs/WYULXF3G2s8l95yKWcX3L1InN2toaBwcHoqOj8fT0NGksQoiSJaci8+jyxQs817Am61avJCoqktUrl9H19VeN5WNHfkLfnp25cO4MRw7tp0fndmxYtzpLO2Fhtzh98j+iIiPYuH4Nm/5eW+jYRi7dyurDF4hPSX/g5urDF/jqrz2FbrcgHBwcjGsKmpqXlxcRERGmDkMIUcJkxJZH/2z+G4C1W3ZhbW0NwH/HjgBw5NB+li9dxJpNO3mmafrpiG8njWfd6pV06Jx5NfbnW75Ej1792LtrO3+s3lgksf17NuShnxTAjG2nr0KftkXSfn5ljNoCAwNN0n8GJycnFEUhISEBJycnk8YihCg5ktjyqE7d+gAM/qAvbdt3pHGTZ2ncpBmQfs0MYMvGdWzZuA6Aa1cvs3fXdpKSEks+WEUhSZNKlU9m4O/uhL+7MxXdnfFzc8Lf3Ymm1Xyo5OmMj0vW+5mKgpubG7dv30an05n8hm1vb28iIiIksQnxBJHElkevtnmNH+cv4bdF8xn20XsAvPfBJ3z59XdER0Xh4OCIT4UHz5nyqeDL8y1fQmVW/Gd7W9cLemjUZgZm0LVZHab1bkNYdDy3//+/OzGJ7A0O5eDlUPZfukVcsoYq3q5U8XIl0MuFQC8Xqni7UtXbjSreLthYFfzjkTFq8/PzK5qDLCB3d3fu3LmDVqs1jrSFEOWbJLY8MjMzo2OX7nTs0p0UtZr5P89ixtSv+fCT4QRWqUpSUiJv9+mPo2PWkUFiUvE+afr7Pm0ZuXQrR66GkZCi5c1mdfjyzRcxV5lRydOFSp4umepnLKmlSdVxPSKW6/fjuBERy42IePYE30STqmPfxZu4O9pRzceNqj5uBHm7UNXHjRq+HtTwdcfS4vEJ28vLi9OnT5s8sWVM/Y+IiCAgIMCksQghSoYktjz6fspkHJ2caN32dewdHEhRq3FwcMTS0pJ2r3fku/99ySfv92XsF5NwcnbhYvA5fl/0C7+tXFfssTnb2fDrh53yvZ+NlQW1/T2p7Z/9rME7MYlcDY/h2r0YQu7HsvLQBRLUWvYE3yTA3Ymafh7p//m681QlL54K8MLOOn25qIwFdKOjo3F3dy/M4RWal5cXFy9exM/Pr9ie1SaEKD0kseVRQMVKTBw3iq+//AyAxk2f5Yd5i3Fz9wBg2eqNfPbpYNq82NS4z2tvdMrUhhnpq6GrVCpU5qX/D6yfmyN+bo68WKdSlrLr92O5dCeaS3ejOHbtLnsv3mTd0Uv4uzvRoLIPDSp785S/O25mUTxr4sQmU/8f0Ov1mJmZSYIX5Zqs7p8P6U8wvo+1tQ0uLtk/FiUxMYH4uDi8vH2KfNHX0ry6f4Yrd6M5HXqf0zfvcz8uiTVHgqng6kDzmpV4trofzWsGUNPXo9j6z0lCQgK3bt2ibt26Bdq/rN+gPXv2KhYs+Jvg4Bt4ebnSvfsr9O//Ok8/Xd1Y59lnB5KQkHXx6BMnFmFjI9cncyc3aJcWMmLLB5VKhbd3hcfWcXR0yvY625Oiuq871X3d6f5c+mNjvu/ZgqMXr3MnRcXhq2FsO3OdY9fu0K5BVdo9XZXXnq6KRQmMXjNmRSYmJpr8ad+m8M8/h2nf/jm+++4jIiJimTJlGb/9toW7dzfg4JC+Gv+FC9dp3boJr7zSONO+Fhbm2TUpRKkliU0UKxcXFyrYW/By41r0f7kBALei4vnn1DUW7T5NvzkbaFm7Im83r2tMhsUl44btkkxsq9bt4ur1MOLiknBzc6Jju+bUrvng/j5FUVi3aT9Hjp/Hwd6W+k9VQ63W0PPNBzf/nz1/jX92HCUmNoEGT1WjW6eX8p1sNm6chqXlg193Bwc7uncfT3BwKE2aPHjdX3jhaQYN6lKIIxbC9OREuyh2Pj4+mVb9r+jhzAetGrF+VHdiFn9K/5casPbYJazf/ob352/myJWwYonD3d2dhIQEUlNTi6X9RymKQu+Bk9mz/xQxcQms37SfBi36c/DIOWOdvoP+R4/+X7L34BnOXgihW98v+GTUTGP5H6v+pfFL7/P3lgPcuBlO30H/Y9hnP+Q7loeTGkBkZBwAzs6Zn7kWERHLpUs3uX8/Jt99CFFayIhNFDsPDw9Onz6Nr69vtuUdGlenQ+PqpOkMLD94jhFLt6MoMPS1JvRoXqfI4jA3N8fNzY3IyMgSuQ3BzMyMmBtbcHBIv6ZpMBh4ttUg1mzYQ/NmT7Fz7wlWrtnJrz+MoU/P9FVi5i1az7jJvwAQG5fIkDGzmTxuAGOG9QJgy/YjvDNwMt9//THW1gW7hhsXl8js2at45pla1KiReWLQ118v4euvlwDQrFldli2bQFCQf4H6EcJUJLGJYqdSqXBzc8t16r+lhYq+L9Sn7wv1OXr1DrO3HGPe9hO8/XxdBr7asEhi8fb25tKlS/j6+mJmZlYkbT7Opas3+eW3jZwLvs6tsPtERMZSo1r6/XRHTwQD8GbHF7Pd9/zF6yQmqblw6Qafjp8DQLJaQ2KSmgNHzvHKC43yHY9Wm0rXrp8THh7Fhg1TM5Xt2TMHHx83VCoVp05doV+/r+nZ80uOHVuY736EMCVJbGXMkd2bcq1TFDMni5qXlxc3b97M8z1tTav5sXxoZyLj1Xyxag9Bg3/i254vF/o6nI2NDXZ2dsTExBT7/XUHj5zjpTeG0KFdc4Z++CYV/b2ZOGWRsTxVm4a/ryd2OTyFISo6/cG01YICsH+ozpSJH+Lvl//bFtRqDT16TOD48Yvs2TMny2itYcMaxn+3a/csEyb055NPvket1uQYoxClkSS2MqQ0Jqy8srNLn3mXnJyMvb19LrUf8HS2Y977r3EjIo7Plu/i7+OXGdPpOepV8i5wLJ6enoSHhxd7Ytv87yG8PF1Z/dtk4+jQ3c3ZWP5Sy4Z8M+N37t6Lwtcn/RaINN2DZ/MFVkqfgfvi8w1o8Wz9QsUSFRVHp05juXnzHseOLaRmzaz3Jj4qPj4JAKtCLK0mhCnIJ1aUGC8vLyIjI/OV2DIEermwclgXzt6MoM9P63m5biAz+rYqUByurq7cunUr30k2v+rUDCQiMpbN/x4mKNCPHXv+46+/99Cj6ysAPPtM+vXD59t8xMB3OxB2J5IFSzbg+P/T75+qXYWmjWvz/pDv+Pn7kdSsXpEboeEsXr6FYR92o27tKnmKQ6fT0bTp+1y/focVK74iMjKWyMhYANzdnaldO5B//z3Kxo0H6dmzFQEBXhw7FsyUKb/zzjttTb6QtRD5JZ9YUWLc3d2Jjo7GYDAUeOWLepW8OD1tILM2H8Xt3WksH9qFtg2C8t1OxtT/4ny0TufXW7J6/W669B4HQOOna1KrRmVjuZWVJfv/mcPkaUtY8ddOGtavzsB+Hdjy72EgfbLLykUTGf7Zj7TtOtK4X+Ona+LklPeEbDAoXL9+B4CePb/MVPb2263544+JODnZs2rVTn766S9jWY8erzJ79rD8HrYQJicrjzyBinPlkdyEhYVhaWmJt3fBTyVmiEvWMHD+Zjyc7Ph5QLt87avT6Th79iz169fH3Dz3e8IKs/JI+P1o9HoD/r65Xxd79+NviY6OZ8PKKZm2a7WphN+PwdPdGXv77N+/x608kheKohAREUtsbCIBAV459iNyIiuPlBYyYhMlytPTk6tXrxZJYnOxt2HViK7M+/cEfh/M4u/Rb9E46PErw2SwsLDA1dWViIgIKlTI2z4FVcE752t5bbqMIMDfmwBfL84Fh7Dhn4NsXvVdlnrW1lZUruhTnGFiZmaGt7cb3t5uxdqPEMVNbtAWJcra2horKysSE4vuAawftm7Ef1MGMG7lbr5ddyDP+2WcjjSlTu1bolZrOHX2Cv5+Xuz/Zw6tXnrGpDEJUdYV+lSkEPkVGxtLbGwsVarkbfJDfoxbsZvToffY/FnPPNW/cOECfn5+uLi4PLZeWV8EWZQEORVZWsiITZQ4V1dXEhIS0Ov1uVfOp//1fIlP2j6DU9+pnA69n2t9b29vk4/ahBBFSxKbMAlvb2+io6OLpe12T1fl7vzhDF60lXn/nnhsXXd3d5KTk9FqtcUSixCi5EliEybh5uZWrCMlBxsr9k/qy9lbEQycvznHemZmZnh6esqoTYhyRBKbMAlra2ssLS1JSkoq1n5+HtCOJlV9aTz21xzreHl5Ge+vg/Rntt27d69Y4xJCFB9JbMJkPDw8Mj3OprgMeOVpFgxsj/lbX3M6NHPCikvWcuDKXRwcHIynRqOiooiJkce2CFFWyX1swmTc3d25efMmlStXLvaV9htWqYD+z/G8PXsdbRsE0eeFegA42ljQ9n9/MKP3S7xUWYunpycJCQlYWlpm2n/GwqPFGl9RGDPmRQCmTt1n2kCeUGPGyKzI0kKm+wuTCg8Px8rKqtgXJH5Yvzkb8HK2Z0y7Bty+fZv3Vxzj3O0ojn/2BgEBAdy4cQOAp59+usRiEkIUHRmxCZNycnLi1q1bJZrYlnzcgekbDtN7/jbm9GhGYz8nTt2M4Ic9lxnZKn2klnG9LYPcxyZyJyO20kKusQmTsre3x2AwoNFoSrTfTzs8y7DXmtLyuw3U8HXH3sqCP45c4Xp4dJakJoQoWySxCZPz8PAgKiqqRPpSa9OYu+0/tp4OwdbKgl8+eJ2lR2+QnKojJVXP2L9PlkgcQojiI6cihcm5u7tz4cIF/P39i70vgwE+/X07ipJ+D5u5ygyDomBQADMzbkQls/9aBC/WqIBer8/Tyv9CiNJFRmzC5CwsLLC3tyc+Pr7Y+3KwtSR52WdsG9+L9g2rkqRJwwxQDOlzqJK0Or7cdBpFUVCr1cUejxCi6MmITZQKHh4exMTE4OzsXCL9tahVkRa1KgLw254zzNp8lJD7saSk6UjS6vhpzyVmVa1aIrEIIYqWjNhEqeDi4kJsbCymuPuk74v1OTVtIKenDWT4a02xs7bkt8PXiIpPLvFYhBCFJ4lNlBpubm7FtjByXlTxduW7d14l8fexrBrWmUD/4n2wpxCieEhiE6WGu7u7SRPbw7o8V7fQbajVGrbvPs6BI2eLIKLCO3ToHGFhEdy6dY8jR85nW+fgwbPs3386y/arV2+zYcN+NmzYT2hoeI59JCensHjxJnQ6XVGFbZSX+IUASWyiFHF0dESr1ZKWlmbqUApt9frdBNTpSvvuo+nRfyJ/rPoX/9pdiIlNKFB7KSlapsxaxo2bOSeV3EycuJA9e06yb99pJk5cmKVcq02lXbsRtGz5EWp15vsKg4Nv8Mcf//L++1PYsuVwjn1cuxZG//7fEBERW+A4Cxq/EBkksYlSxcvLi7i4OFOHUWhzfl3LOz3aoA7fwc1zq6lVoxKDB3bFxtqqQO0lJacw4X8LuRWW+8NTc2JlZYGlZfp/VlaWWcr37j0FgKOjHTt3/peprGPHlvz552SeffbxI9n69auh0+3H19czxzoJCck5XktNS9ORkpL9s/Fyi1+IDJLYRKni7OxcIiv+F6flq7dz6Oh5DAYDv/+5jQsXb+Ds5IC3lyu2ttZA+oju3IUQ7t2PYc2GvWzZfgSAm7fvMXveaj6fNJ/Z81Zz7kIIAGs37gVg87ZDLP5jCxv+OZjvuAIDfalUyYdKlXyoXLlClvI1a/bQq1cb+vZ9jbVr9+ar7Rs37uLk9CpOTq/i6tom29VbFiz4G2/v9jg7t8LZuRU//rjaWKbVpjJ48AysrFpiZ/cS/fp9jUaTOcHlFr8QGWS6vyhVbG1tURQFjUaDjY2NqcMpkE3bDgFw8Oh5rl2/g6ODHWZmZgwcOo3e3dtgYWHOF//7FWcnB06dvQJA46drUsnfm6db9ufpetV5qk4Vtu06zqSpS4i+sZltO48BsPfgGc5fvEH1qgF0aNc8X3GNG9cXV1dHgCyJIS1Nx4oV2/nzz8lYWlrQpctnzJs3Cus8jjArV65ASMhqrl4No3nzD7KUr169iw8+mMqCBWN4661XSUpSZ7r5/YcfVrNly2FOnlyCg4Mtr78+ii1bDtOly4t5il+Ih0liE6WOm5sbMTEx+Pr6mjqUAlkwazR//b2H/41/n7avNgVgzYasIyCNNpW9m3+kSaNaKApMmbUMgH1bfjQmlMPH0idJzJ81Cr9anflu0iBeaN6gQHH5+Lhn+2+A/ftPk5ioJjU1Db3eQGKimt27T9K2bbM8tZ3+JHJX4nO4ReLnn9fSt+9rvP9+RwCcnOwzlS9bto1GjWpw61b68/KeeqoKa9bsyZTYHhe/EA+TxCZKHTc3N65evVpmE1te9erWimebPLhmVb9u+g3h73zwNZ3at+DZJnUzlRendev24eXlyvffrwDA39+LtWv35Dmx5SY4+Abvvts+x/IbN+7i7GzPxo3pp1hdXBxxdy+Zm/VF+SOJTZQ61tbWmJubo1arsbOzM3U4Jeb1Ns/x+/zxzF20nn4ffQPAkA/eZPrXHxvrFMcN7Dqdjt9+28KSJeONI6SNGw/Qq9dE5sz5FEvLwv+ZqFYtgN27T9KnT7tsywMDfWnQoDo//DC80H0JIZNHRKnk5uZGbGzRTxkvzczMzHiryyvs2fQjcTf/YcKYfvww/y/u3ovCwiL9elRaWtHfH3b48HkSE9W0avWMcdsrrzQmMVHNvn2ns9RPTU1Dq03NVx/9+7/OkiWbWbr0HzQaLWq1hqioOGP5u++2Z8mSzaxfvw+dTkdSkpro6OJfO1SUT5LYRKnk6upKTEyMqcMoUV9NWczMn1dx7fodEpPUqNUaHB3ssLK0xNXFkafqBPHX33u4FXbfOFuyKPz99346d34BR8cH173s7Gzo1u1l/v57f5b6w4fPxsbmRc6evZalzMws+z769XuN//3vA/r2nYyt7UvY27/Mzz+vNZZ//HFXBg3qQufOY3Fza4uj46ssXry58AcnnkhyKlKUSlZWVlhYWJTJ05E5/XHPTeWKPowY9xNjvpwLwHNN6/LbvHF4/P+1prHDejHmy7ks/mMLTRvXZv8/c4ok3unTB2e7fdWqr7NsW79+6mPbCgryR1EOZdmuUqn4/PO+jB7di3v3YvD0dMk049LS0oKpUz9i0qQBhIdH4+/viYWF/HkSBWOmmGLVWSHy4N69e+h0uhJ5Tltu0qL2lEg/BoOB+5Gx2Fhb4erimG15RGQcHu7OxtOTGSw9XmTq1KmMGdOyRGIVj3rW1AGI/yenIkWp9SReZ1OpVFTwds82qWWU+3i7ZUlqQogHJLGJUsvKygoHBwdSUlJMHYoQogyRxCZKNVtb2yduEokQonAksYlSzcXFpVwsiiyEKDmS2ESplrFepEajyaWmEEKkk8QmSj0ZtQkh8kMSmyj1XF1dn7jZkUKIgpPEJko9Ozs7LC0ty8WTtYUQxU9u7RdlgpWVFXFxcXh65vxk5uI0Y+FRk/SbH2PGvAjA1Kn7TBvIE2rMGLlBu7SQlUdEmZCQkMD9+/epVq2aqUMRQpRyMmITZYKTkxPXrl1DURTMCroYYyGU1JJahSFLapmajNhKC7nGJsoMmR0phMgLSWyizJDEJoTIC0lsosxwdXWVmZFCiFxJYhNlhpmZGYqikJiYaOpQhBClmCQ2Uaa4uLgQHx9v6jCEEKWYJDZRpjg7O0tiE0I8liQ2UabY2NigKApardbUoQghSilJbKLMKUujtsvXbnH63FVThwHAoUPnCAuL4Natexw5cj7bOgcPnmX//tOF7uvq1ducOHGp0O2UpLy8PqJskMQmyhwXF5cy8xibuQvXM+bLuYVuJyVFy5RZy7hxM7zAbUycuJA9e06yb99pJk5cmKVcq02lXbsRtGz5EWp14V7f9ev3MWPGykK1UdJye31E2SGJTZQ5jo6OREZGmjqMEpWUnMKE/y3kVtj9ArdhZWWBpWX6f1ZWllnK9+49BYCjox07d/6XYzuPS3qJicmPjSEtTUdKSu6nkR/XR0JCzn2kpqaRmvr4W0Jyaju310eUHZLYRJlUlk5HPmzVul387/uljPriZ76duYzgSzcyld+8fY/Z81bz+aT5zJ63mnMXQgBYu3EvAJu3HWLxH1vY8M/BfPcdGOhLpUo+VKrkQ+XKFbKUr1mzh1692tC372usXbs3U9kHH0xlxIgfeOWVwdjbv0yTJu9x9eptY/mtW/eoX78PTk6tCArqxsGDZzPtr9WmMnjwDKysWmJn9xL9+n2NRpM5wQUEdGLJks0EBXXD3v5lhg6daSxTqzUMHDgFb+/2ODu3wsnpVcLCIozlsbEJdO8+HmvrF7C2foHu3ccTG5uQ5/jz8vqIskMSmyiTymJiUxSF3gMns2f/KWLiEli/aT8NWvTn4JFzAFy4eINqDXuyfPUOIqLiWLpyGy++PgSAbTuPAbD34BlWr9/Nrn0n8t3/uHF9efrp6jz9dHU+/7xPprK0NB0rVmynQ4fn6dixBWvW7EarTTWWJyWl8OuvGxgzpjexsduwsbHir792G8u//34FdnY2XLq0gvXrp3D4cOZrVD/8sJotWw5z8uQSrlz5k8OHz7Nly+FMdcLCIhgyZCYzZgzm7Nnf+eijLsayuXPXsXfvac6d+x2D4SDBwcvx9/cyln/66U+EhNzh+PGFHDu2kMuXbzFq1Jw8x5/b6yPKFlkEWZRJzs7O3Lt3z9Rh5IuZmRkxN7bg4GALgMFg4NlWg1izYQ/Nmz3Fus3pj5vZt+VHrK2tADh8LD1BzJ81Cr9anflu0iBeaN6gQP37+Lhn+2+A/ftPk5ioJjU1Db3eQGKimt27T9K2bTNjnfHj+9G6dVMA2rZtxqlTV4xla9fuZcaMIdSoUQmAkSN7cubMNWP5smXbaNSoBrdupb9nTz1VhTVr9tCly4uZ4li27Es6dGiRJXZ3dyfCw6PYvPkQHTq0yJTUdDodixZtYtmyL2ncuBYAo0a9zTvvTGL+/NGYm5vnGn9ur48oWySxiTLJysoKlUqFRqPBxsbG1OHk2aWrN/nlt42cC77OrbD7RETGUqNaAAD161YF4J0PvqZT+xY826QuzzapWyJxrVu3Dy8vV77/fgUA/v5erF27J1Nie/ipCo6OdhgMBgBiYhIIC4ugXr2gbOsC3LhxF2dnezZuTD+F6uLiiLu7c5Y4KlXyyTa+Pn3akZysYdasVfTv/w29e7fh558/xdHRnqio9JF7w4Y1jPUbNaoJQHR0PF5ebo+NX5Q/cipSlFnOzs4kJCTkXrGUOHjkHM+1HkR0TDxDP3yT1Usm8VKLp43lr7d5jt/njyciKpZ+H31DjcZv8+n4OZnaKI7HJ+p0On77bQtz545i37657Ns3l59//pSVK3eQlqbLdX83NyeqVPHj4sWbxm2PTuAIDPSlQYPq/PrrZ8b/pk79KM8xqlQqPv64K2fOLOX48YUcOnSeOXPWAuDhkZ4gz5x5cFtFxr/d3Jzy3IcoPySxiTLLycmpTF1n2/zvIbw8XVn922Te6vIKzzapi7vbg1GLmZkZb3V5hT2bfiTu5j9MGNOPH+b/xd17UVhYpJ9Oy0uiya/Dh8+TmKimVatnjNteeaUxiYlq9u07nac22rZtyo8/rubu3UhOnbrCDz+szlT+7rvtWbJkM+vX70On05GUpCY6Ou/vXVxcIpGRsQBUqxaAjY2VccRlYWFBjx6vMnv2ai5dusnFi6HMmLGSt99ujYWFnJR6EkliE2WWk5NTmRqx1akZSERkLJv/PczFKzf5ccEa/vp7j7H8qymLmfnzKq5dv0Nikhq1WoOjgx1Wlpa4ujjyVJ0g/vp7D7fC7htnSxaFv//eT+fOL+DoaG/cZmdnQ7duL/P33/uN21SqB38uzMzMMv08bNhbnD9/HT+/jnToMJrmzeuhUj049ffxx10ZNKgLnTuPxc2tLY6Or7J48eZMcTg62uX4ENnt24/j5dUeb+/2BAR0omHD6gwb9paxfObMoVhamlOrVk9q134be3tbZswYkqmNx8UvyhczpTjObQhRQq5evYq3tzdOTsV7yqmgT9Ae9tkPXLwcyra1M1CrNbw94Cu2bD8CQOOna5Ks1lC/bhBL543nt+X/MGLcTyQmqQF4rmldPh3ck9fbPAfA6vW7GfPlXMLuRtK0cW32/5P5NKWpn6Ct1+u5fz+GChU8ckxQWm0q4eHR+Pt75ns0pdWmcvt2BJUr++S4b1RUHCqVykSnIOUJ2qWFJDZRpkVERKDVagkICCjWfgqa2LITfj8avd6Av69nljKDwcD9yFhsrK1wdXHMtjwiMg4Pd2fj6ckMpk5sQhJbaSEnoEWZ5uTkREhI0Z2WKwkVvHOeSq5SqXIt9/F2K46whCg35CSzKNNsbGzQ6/WkpqbmXlkI8USQxCbKPHd3d5KSkkwdhhCilJDEJso8Ozs74uLiTB2GEKKUkMQmyryyNu1fCFG8JLGJMs/c3Bxra2vUarWpQxFClAKS2ES5UNZWIRFCFB9JbKJckNORQogMch+bKBccHR1JTk5GUZQcV70ojBkLjxZ5m0VtzJgXAZg6dZ9pA3lCjRkjN2iXFrLyiCg3QkNDcXNzK/bltYQQpZucihTlhp2dnVxnE0JIYhPlh6Ojo1xnE0JIYhPlh62tLTqdDp2u6J9ZJoQoOySxiXJFZkcKISSxiXJFEpsQQhKbKFccHR1JTEw0dRhCCBOSxCbKFSsrK8zMzNBqtaYORQhhIpLYRLnj5uYmj7ER4gkmiU2UO7a2tnI/mxBPMElsotyRCSRCPNkksYlyx9zcHCsrK1JSUkwdihDCBCSxiXJJViER4skliU2US05OTjLtX4gnlCQ2US7JiE2IJ5ckNlEuqVQq7OzsSE5ONnUoQogSJolNlFuurq6S2IR4AkliE+WWnZ0dcXFxpg5DCFHCJLGJckvWjRTiySSJTZRrDg4OktyEeMJIYhPlmozahHjySGIT5ZrczybEk0cSmyjXHBwcZKV/IZ4wkthEuSc3awvxZJHEJso9FxcX1Gq1qcMQQpQQSWyi3LO3t5f72YR4gliYOgAhipu9vT1qtRpFUTAzM8v3/nq9nvfeew9IX6qrYsWK9OvXj8qVKxdxpAWzY8cOtm7dyvTp0/O9r0ajYd68eQwZMgSVSr7nivJBPsniiVCYaf+KoqBWqxk+fDgTJkzAzc2NcePGYTAYjHU0Gg2KouTalsFgQKPRZLs9p+fH6fV6UlNTc2yzSZMmDB48OMv27PoBMvWTmprKoUOHMh0LgE6ne+ykm5zaTktLQ6/XZ9qmKEqO9YUoDjJiE0+EjMTm5ORU4Da8vb3x8fGhb9++HDhwgIiICGxsbPjmm2+4desWNjY2dOjQgS5dunDo0CFWrVpFpUqV+O+//3jvvfe4evUqO3fuRKVSYWNjw5QpU/Dx8WHt2rWsXLkSAF9fX2PyHDJkCG5ubgQHB6NSqejatSvdunXLEldwcDAbNmzgm2++4dChQyxduhQLCwsiIiLw8fFh/PjxeHl5sXv3bubPn2/cb8iQIWzduhWA3r17A7BkyRK+++47zp8/j0qlwsrKijFjxlCnTp3Hth0XF8fUqVMJCQkBoFmzZowYMYJt27axePFiAKpXr86HH36Ir69vgd8DIfJCRmziiVBUN2orimJMTh4eHmzevBlfX1+WLl3K9OnTWbVqFYmJiaSmpnLv3j0CAwOZPHkyPj4+7Ny5k59//pkVK1YwfPhwLC0tSU5OZuXKlXz11VcsWrQINzc3tmzZAoBarcbLy4tFixYxceJE1qxZk2U0BOmjpIwRUWpqKmq1mkGDBrF8+XKcnZ3Zv38/AL/++isffvghK1euZPr06bi5uTFy5EgAli5dyvLly7GxsaFPnz788ccfrFy5ktatW7NixYpc2960aRPm5ubMmzePRYsWUbt2bTQaDUuXLmXKlCksX74cf39/Nm3aVOj3QIjcyIhNPBEyrrMZDIYCX0saOXIkaWlpODg48Nlnn2FhYcHevXtxcHBgypQpxnonT54EICAggE6dOgGg1WqxtLRk6tSpNG3alJYtW+Lu7s7u3bupUKECtWrVAqB169YsWbLEOIJq0aIFDg4O1KxZE4PBQGRkJD4+Po+N09vbmzp16gBQp04drl+/DkBgYCBLly7l1q1bNGnShJo1axpvg1CpVMbXJTY2lgULFnD37l00Gg1eXl65tr1nzx4GDhyIm5sbAG3btmX//v3o9XqWLl0KQExMDElJSQwcOLAgL78QeSaJTTwxMkZtzs7OBdp//PjxVKxYEXt7e+O2hIQEevbsScWKFY3bPD09jcktg7W1NXPmzGHXrl2cPn2aVatWMX36dPR6Pebm5sZ6KpUKnU5XoPiy83DbEydOZM+ePZw5c4aJEyfSt29fmjdvDmC8PhgXF8e3337LBx98QJMmTQgODuaPP/7Ite2kpCQsLDL/OYmMjMTf359evXoZtz1aR4jiIKcixROjsMtrubq6ZkpqANWqVeP48eNUqlSJoKAgUlNTs510ce/ePUJDQ+nSpQtfffUVDg4OXLt2jaZNmxIWFkZoaCharZYdO3YYk01R27lzJy+99BIjR46kadOmXLp0CXt7e1QqFffv38dgMBhHcI0bN8bW1pazZ8/mqe3AwEA2b95MUlISaWlpHDp0iLp163Lr1i0URSEoKAhfX1/CwsKK5diEeJh8fRJPDEdHR8LDw/O93+NuERg6dCjLly9nwIABaDQazM3NmTRpUpZ6qampTJs2DUgf6VSrVo2WLVtiYWHBG2+8wejRo1GpVDg5OTFgwIA89Z3f2NetW8fChQuxs7PDxcWF0aNHY25uTrt27fj000+B9MkjDRs25P3330elUmU6Dfm4tgcPHszXX39N//79UalU1KtXj88//5wPPviAefPmERERgUaj4bnnniu2xC1EBjMlL3OUhSgnTp06Rf369Yv8ni29Xk9iYiIuLi6PrRcbG4uDgwOW/9fenUdFXe9/HH/OsAoIsgiIKO4L6E3UcinTzNKu/SxLSy2zzbW0rIxb6pU0b1BX1NTKkrLUFjEzc0lbRLiYS+WG+8LFDAVZBQcQHX5/kGNz3ZElZ16PczwH5v2d7/c9nqOv8/l8vvP5OjlZvV5UVITJZLKsUVWWc6NJDw+PC64P4OrqCpRNSTo5OV0wQr2S/Px8HBwccHNzs3r95MmTuLq64uzsXN7WRa6agk3sysGDB6ldu3a519lE5K9Pa2xiV/R8NhHbp2ATu6JgE7F9CjaxK25ubhQVFV2whZSI2A7dFSl2pzzfZyvJjK+8hiqIk183oqOjiYi4vbpbuUF1qu4GpIJoxCZ2R9ORIrZNwSZ2R8EmYtsUbGJ3tM4mYtsUbGKXfH19OXXqVHW3ISKVQMEmdsnFxYW8vLzqbkNEKoGCTeyS1tlEbJeCTeyS1tlEbJeCTeyWPY7azp49e8Uwv9hTukVuJAo2sVv2FGwzZy4mLOwRHB27UKfO/zF6dAxbt+63OiY5+RC33TYCR8cuBAT05rXXYjWilRuSgk3slj0F2+rVP9G7d2dWrHiLqKiRrF27ma5dR1FQYALAZCqic+fhuLm58sMPbxMZ+RSRkbG8887Sau5c5NppSy2xW25ubhQWFmI2myv8+WznLP7qRw4cPkpubgE+Pp7cd8+thLZoaKmXlpby1YpENm5JxsO9Bje1borJVMTAfj0sx+xIPsjq7zeRnXOSNq2b0v/+O3B0dLimPr755i2cnM7/c/fwcOOhhyawe/d/ueWWUL755j/k55uYP388QUG16d69Pdu2HWDWrCU8+2y/6/+LEKlCGrGJXavMUVtpaSmPDptCfOJWsnNPsmxFIm26PEnSxp2WY4aMnMqAJyexPmk7O3Ydov+QiTw7brqlvmjxWtrfMZSvV/2HlNRjDBk5ledfefuae/lzqAGcOJELgJdX2YNEd+1KITjYn6Cg2pZjbrvtJvbvP0JRUfE1X0+kOmnEJnatPBsiXy2DwUB2yio8PGoAYDab6XTXSL5cHs+tHVvzw/pf+PzLH5j3dgSPDewFwHsfLmP8lA8AyMnNZ0zETKaMf5qI5x8BYNV3Gxk8bArTXn8GF5fyPY06NzefmTMXc/PNLWnePASA48ez8Pf3tjquVq2yp2xnZuYRHOxfrmuJVAcFm9g1T09PMjIyKu38ew+k8sHH37Bz92GOHE0n40QOzZvWA2DTL7sB6Hdft4u+N3nPYfILTOzam8JLE+YAcMpURH6Bif9s3MmdXdtdcz/Fxad58MFXOXYsk+XLoy2vl5ScxcHBegLHaDQA6AYSueFoKlLsmpubG9nZ2ZSWllb4uZM27qTz3SPJys7juRH9iJs/mTu6hFvqp4tLCA6qjZub60Xfn5lVtjNK08b1CKrjR1AdP5o2DiYqcgTBdWtf9D2XYzIV0b//BLZs2UN8/BzLaA0gMNCHvDzrLcZOniy7scTXt+JHsyKVSSM2sXvnpiM9PT0r9Lwr127Av7Y3cR9PwWAoG/34+pwPiTtub8u/YhaQdjyToEA/AErOnP8OWcOQOgB0u60NXTrddF29ZGbmcv/9/yA19TibN8fSokWIVb1Jk2D27z9CXl4BXl5lU5C//LIXf39v3N1rXNe1RaqaRmxi9yrrBpKwFg3JOJHDyrU/sWd/KrPe/5IlX8db6p1uDgPgtp6jiJqxkGfHTefF8bMt9dahjejQPpShY97kx4RfSTueSdLGnTw9Jprk3Yevuo8zZ87QocNQkpJ28NZbz3DiRA6JidtITNzG7t0pAPTt2xWAceNmc/RoBuvW/cK0aZ8xYkTfCvibEKlaGrGJ3atZsya//fZbhZ+37723E7dsHQ88Oh6A9uEtaNm8gaXu7OxE4uo5THlrPp8t+YG2NzVj2ON9WLX2JwAcHBz4/MNIxr4yi14Pvmh5X/vwFnh6ul91H2ZzKYcP/w7AwIGTrGqDBt3NokWR+Ph4smrVNB5+eCIffLAcgP79uxMR8Wi5PrtIdTKUVsbigsgN5tdffyU8PNwyZfi/SjLjy33uY+lZnD1rJjjoyutiTzzzBllZeSz/PMrq9eLi0xxLz6a2r9clpwad/LoRHR1NRMTt5e7VbDaTkpKGn18ty5Sk/ehU3Q1IBdGITYTKW2cDqBPge8lazwdeoF5wAPWC/Nm5+xDLVyexcvGbFxzn4uJMg/qBFd7b/zIajTRuHFzp1xGpTFpjE6H6tte6v/ftmExFbN2xn+C6/iSunsNdd9xc5X2I2BKN2ESovHW2Kxn51P2MfOr+Kr+uiC3TiE0EcHd359SpU5XyfTYRqVoKNpE/2NNu/yK2TMEm8gdvb28KCwuruw0RuU4KNpE/1KhRg9zcXMvve/fuJS8vr/oaEpFyUbCJ3SsuLnssi4eHBwUFBQAUFBRgMplwdi7fDvoiUn10V6TYteLiYpKTkwkJCcHPz8+yzpaeng6Ak5MTADGxm6qzzasSEdENgOjohOpt5AYVEaEvaNsK7Twidi8tLY309HS8vb1xdnbGbDaTkZFBaWkp7dpd+6NhRKR6acQmdi8oKIisrCxycnJwcHAAyp5+bTSen6m/ni21qkpFbKll3zRisxVaYxMBmjRpgsFgoKSkhNOnTwPnpyFF5MaiYBOh7I5IPz8/DAaDZSPkc6M3EbmxKNhE/hAcHGwVZi4uLtXYjYiUl4JN5E+aNGliWVtTsIncmBRsIn/i7u6Ot7c3oDU2kRuVgk3kfzRo0ACDwaANkUVuULrdX+Qi2rZtW90tiEg5KdhEKonJVETSpp3UqOHCbR3/Vt3tsGHDTurXD8BsNpOWlknHjq0stY0bk8nIyAGgUaMgwsIaWe4OvRo//7yHWrVq0qTJpZ++fbnri1QkTUWKVIK4ZeuoF/YgvR96mQFPRrJo8VqCQx8gO+dkuc5XWFhM1IyFpKQeK3dPkZGxxMf/SkLCNiIjY61qUVELGDv2bWbP/pLOnYcTGHgv+/alXvW5p0//gq++Wl/u64tUJAWbSCWYM28pgwf0xHTse1J3xtGyeQijhz2Iq0v5NlUuOFXIP6fGcuRoerl7cnZ2xMmp7I+z84U3xgwd2oe1a2eQm7uWDh3CmDFj8QXHnD5dwunTJZfvtcBUruuLVBRNRYpUsE/jvmPDpmT+FtaYBV+sod1NzfDy9CDA35saNcq+QhC3bB0tmtantp+3Zbry73d1JPW34yxbmUh6RjYB/j5079KW1mGNWfpN2Who5ZoNHP5vGr4+XvS559Zr6qthwyBCQgIBaNCgziWPMxqNGI0GzGaz5bWcnJMMH/4mcXE/AtC/f3fmzn0Zb29PyzE//ZRM8+YD2L//CM2a1Wf58miaNw+55uuLXC8Fm0gFW7FmAwBJm5I5ePh3anq4YTAYGPbcWzz6UE8cHR2YOHUeXp4ebN2xH4D24S0ICQ4g/PYnCf9bM1qHNWLNj1uYHD2frJSVrPlhMwDrk7aTvCeFZk3qXXOwjR8/BG/vmsDFg2XBgm/5+ec9JCZuJzS0IbNnv2ipvfTSbA4d+p0tW2IpLYWnn36DcePmMG/eK5ZjkpJ28O230/Hycufxx19n2rTPeP/9f1z19UUqioJNpIK9P+Nllnwdz9QJQ+nVowMAXy6/cP2pqPg061fO4pZ2LSkthagZCwFIWDULlz+mLH/anAzA3BnjqNuyL29OHknXW9uUq6/AQN+L/nxOWFhDevS4GRcXZxIStrFp0y6Cg/05c+YMH364goULJ9G+fUsAxo0bxODBk5k792XLbi0vvDCA8PBmAIwdO4ARI960CrYrXV+komiNTaSaPNL/Ljrd0goHBwccHR24qVUTAAYPf51P474jJfUYnW6pujsH27ZtzrBh97FoUSQvvjiQUaP+zdmzZ8nMzLPUz2nXrgUAWVnnnzD+56chhIY2ICMjh5xy3iwjcj0UbCJ/Eff27MyCuRPIyMzh8VH/onn7Qbw0YY7VMVX1pfFGjYLIyMghKysPPz8vALZvP2Cpn/vZx+f8GltJyRnLzzt2HKJZs/pWa3AiVUXBJvIXYTAYePiBO4lfMYvc1NX8M+Jx3p67hLTjmTg6lk33/Tk8KprJVERa2gmWLo3nlVfeY8iQv+Pv74OjoyMDBvRg5sw49u5NZc+e/xIT8zmDBt2No+P51YyoqAVs3bqflJQ0Zs5cTO/enSutV5HLUbCJ/EW8FvUR099ZzMHDv5NfYMJkKqKmhxvOTk5416pJ67DGLPk6niNH09m561CFX3/KlI+oW/c+Jk78gMGDezFt2mhLbfr053BycqBly4GEhg7C3b0GMTFjrN7fo8fN9Oo1lkaN+nHsWBZjxvSv8B5FroZuHhGpYNewYYeVBvUDeWH8bCImvQtA5w6t+Pi98fj5lk0F/uP5R4iY9C4fLVpFh/ahJK6ec7nTXZNly6IvWw8M9CUh4V0yM3MxGo1WU5AAixZFAmA2m/n99xMEB/tf084lIhXJUKqdXkWuqCQzvkquYzabST+Rg6uLM961al60nnEiFz9fL8v05DlOft2Ijo4mIuL2KunV9nSq7gakgmjEJvIXYjQaqRNw6VvhjUYjgQE+VdiRyI1Ha2wiImJTFGwiImJTFGwiImJTFGwiImJTFGwiImJTFGwiImJTFGwiImJT9D02kasQE7upulu4ooiIbgBERydUbyM3qIgIfUHbVmjnERERsSkasYlcharaUut6aEut66URm63QGpuIiNgUBZuIiNgUBZuIiNgUBZuIiNgUBZuIiNgUBZuIiNgUBZuIiNgUfY9NpBLtO3iEwsJi2rRuWt2tsGHDTurXD8BsNpOWlknHjq0stY0bk8nIyAGgUaMgwsIaYTAYqqvVcrnc5xP7ohGbSCV6N3YZEZPeve7zFBYWEzVjISmpx8p9jsjIWOLjfyUhYRuRkbFWtaioBYwd+zazZ39J587DCQy8l337Uq+37Sp1uc8n9kXBJnIDKDhVyD+nxnLkaHq5z+Hs7IiTU9kfZ2enC+pDh/Zh7doZ5OaupUOHMGbMWHzJc5lMReXu4+TJU5esnT5dwunTJZd9/6WufaXPJ/ZDwSZShRZ/9SNTp33CuInv8Mb0hezem2JVT/3tODPfi+PVyXOZ+V4cO3cdAmDpN+sBWLlmAx8tWsXy1UnXfO2GDYMICQkkJCSQBg3qXPI4o9GI0WjAbDZbvV6v3v3Mn7+Sxo374+7eneeemw5AdvZJPD17sHXrfsuxCxd+S7t2T1h+N5mKGDYsioCA3nh53YWnZw+OHs2w1HNyTvLQQxNwcemKi0tXHnpoAjk5Jy314cOjeeGFt7nzztG4u3fnllue4sCB38r1+cT2KdhEqkhpaSmPDptCfOJWsnNPsmxFIm26PEnSxp0A7NqTQtO2A/k07nsyMnP55PM1dLt3DABrftgMwPqk7cQtW8ePCb9c8/XHjx9CeHgzwsOb8eqrj11QX7DgW/r1e5WAgN7k5Z1i4sQnrOpHj2YwZsx0YmJGs2PHAkaNegAAHx9PundvxxdffG859qOPVtK3b1fL7++++xXr129j584FmM1J7N79KcHB/pb6Sy/N5tCh39myJZbNm2PZt+8I48bNsdQLCgqZN285ERGPkpOzBldXZ5YsWXdNn0/sh24eEakiBoOB7JRVeHjUAMBsNtPprpF8uTyeWzu25quVZY+bSVg1CxcXZwB+2pwMwNwZ46jbsi9vTh5J11vblOv6gYG+F/35nLCwhvTocTMuLs4kJGxj06ZdVuEDsHDhJPr06XLBe594ojfDhkUzdepwjh/P5scff2HevFcsdV9fT44dy2Tlyg306dPF6rxnzpzhww9XsHDhJNq3bwnAuHGDGDx4MnPnvoyDgwMAEyY8zt13dwCgV6+OViPEq/l8Yj80YhOpQnsPpDL8+bfofPdI6rfqx9Yd+8nMzgPgplZNABg8/HU+jfuOlNRjdLql6u7sa9u2OcOG3ceiRZG8+OJARo36N2fPnrU6JiQk8KLv7dWrI4WFxSQkbGPJknV0796Ohg2DLPXHHruHN94YyYwZi/Hzu4fBg18jP79srS0zM89y/XPatWsBQFZWnuW1P9+lWbOm2wVTpSLnKNhEqkjSxp10vnskWdl5PDeiH3HzJ3NHl3BL/d6enVkwdwIZmTk8PupfNG8/iJcmzLE6R1U9PrFRoyAyMnKsguVyXFycGTq0D5999h2ffLKap5/uY1U3Go0888yDbN/+CVu2xLJhQzJz5iwFwM/PC4Dt2w9Yjj/3s4+PZ0V8HLEzmooUqSIr127Av7Y3cR9PsYw+fH28LHWDwcDDD9zJww/ciclURMw7XzA5ej4vPPswNVxdACgpOVNp/ZlMRaSlnWDjxl1MnPgBQ4b8HX9/n6t+/6OP9qJt28cB6NPnNqtabm4+JSVnqF3bm6ZN6+Hq6mwZcTk6OjJgQA9mzoyjTZtmlJaWEhPzOYMG3Y2jo/6LkmunEZtIFQlr0ZCMEzmsXPsTe/anMuv9L1nydbyl/lrUR0x/ZzEHD/9OfoEJk6mImh5uODs54V2rJq3DGrPk63iOHE233C1ZkaZM+Yi6de9j4sQPGDy4F9Omjbaq16zpdtkvbYeHNyM0tCEjRvTF3b2GVe2777bg79+bgIDe1Kt3P23bNuP55x+21KdPfw4nJwdathxIaOgg3N1rEBMzxuocRuP5/64MBoPV7yJ/ZiitqrkNkRtYeZ+g/fwrb7Nn339ZszQGk6mIQU+/xqrvNgLQPrwFp0xF3NSqMZ+8N4GPP13NC+Nnk19gAqBzh1a8NHog9/bsDEDcsnVETHqXo2kn6NA+lMTV1tOU1f0E7fz8U9Stex/x8XOs1svOKS4+zW+/ZdCgQeAlR2KZmbkYjcZqmoLUE7RthYJN5CqUN9gu5lh6FmfPmgkOqn1BzWw2k34iB1cXZ7xr1bxoPeNELn6+Xjg6OljVqivY0tOzWbo0nq+/TsTV1Zlly6Kr9PoVR8FmKzSBLVLF6gRc+lZ0o9F4xXpgwNWve1WFwsJi9u5NpWfPDgwd2ufKbxCpZAo2EbkuDRrUYebMsdXdhoiFVl9FRMSmKNhERMSmKNhERMSmKNhERMSmKNhERMSmKNhERMSm6HZ/kasQE7upulu4ooiIbgBERydUbyM3qIgIfUHbVmjnERERsSmaihQREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZuiYBMREZvy/5PWT2igDI0PAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"methods2.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Constructors\n", + "\n", + "We've been creating new instances of our `Person` type with `Person()`. If we like, we can pass in arguments when we create a new object, like `Person(\"Alice\", \"Anderson\", 24)`. When we do, the new object as well as those arguments get passed to the parameters of a special methods called the *constructor*. In Python, constructors must be named `__init__`.\n", + "\n", + "Let's create a construction for `Person`." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#constructor.png 5 2\n", + "class Person:\n", + " def __init__(self, first, last, age):\n", + " self.first = first\n", + " self.last = last\n", + " self.age = age\n", + " \n", + " def birthday(self):\n", + " self.age += 1\n", + "\n", + " def full(self):\n", + " return self.first + \" \" + self.last\n", + "\n", + "p1 = Person(\"Alice\", \"Anderson\", 24)\n", + "p2 = Person(\"Bob\", \"Bryson\", 25)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"constructor.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In constructors, lines like `self.something = something` are common. The idea is to copy the values passed to the parameters over to attributes, to initialize the object. In the above diagram, `Person(\"Bob\", \"Bryson\", 25)` is currently executing. You can see that only the `first` attribute has been created so far, and the `p2` variable doesn't even exist yet. As the code continues to run, `last` and `age` will also be initialized for the new object, and then `p2` will refer to it (much like has already been done for `p1` and the object to which it refers). " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "When we have many dictionaries with the same keys representing the same kind of entity, it often makes sense to create a *class* for entity. Attributes for *objects* created from the new class can replace keys and values in our previous dictionaries. If we like, we can create functions inside our class, called methods. If `obj` is of type `myclass`, `obj.meth()` calls the `meth` method in the `myclass` class. Surprisingly, the method has one parameter, to which `obj` is automatically passed. If we like, we can create a special `__init__` method, the constructor. This method will be called whenever a new instance of a class is created, and it will often be used to populate the attributes for the new object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/06-oop2/reading1.ipynb b/lecture_material/06-oop2/reading1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..da0a000859f3f6cd827e5289bff6bfd079a70d7b --- /dev/null +++ b/lecture_material/06-oop2/reading1.ipynb @@ -0,0 +1,884 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Special Methods\n", + "\n", + "\"Special methods\" is a technical term referring to methods that get called automatically. In Python, they usually begin and end with double underscores.\n", + "\n", + "We've already seen one special method, the constructor: `__init__`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "class C:\n", + " def __init__(self):\n", + " print(\"I'm inside __init__\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's special, because it will run whenever an object is created, even though it is never explicitly called (note that `__init__` doesn't appear in the following snippet, even though clearly it runs):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I'm inside __init__\n" + ] + } + ], + "source": [ + "obj = C()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll cover the following special methods here:\n", + "\n", + "* for strings: `__str__`, `__repr__`, `_repr_html_`\n", + "* for comparison: `__eq__`, `__lt__`\n", + "* for sequences: `__len__`, `__getitem__`\n", + "* for context managers: `__enter__`, `__exit__`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Strings\n", + "\n", + "When we print or view an object, it must be automatically converted to a string first. There are two ways.\n", + "\n", + "For example, let's create a datetime object." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import datetime \n", + "today = datetime.datetime.now()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`print` automatically converts it to a string, as you can see:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2021-01-25 15:23:02.067837\n", + "2021-01-25 15:23:02.067837\n" + ] + } + ], + "source": [ + "print(today)\n", + "print(str(today))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we make it the last line in a cell, it gets converted to a string too, but differently:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "datetime.datetime(2021, 1, 25, 15, 23, 2, 67837)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "today" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The idea behind two styles is that there are both non-programmers (who probably prefer the former) and programmers (who might prefer the latter) in the world. Programmers like the latter format because it can be copy/pasted to create new objects:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "obj = datetime.datetime(2021, 1, 25, 14, 15, 50, 951625)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Python deals with these two styles by giving every object two special methods: `__repr__` and `__str__`:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "For coders: datetime.datetime(2021, 1, 25, 15, 23, 2, 67837)\n", + "For others: 2021-01-25 15:23:02.067837\n" + ] + } + ], + "source": [ + "print(\"For coders:\", today.__repr__())\n", + "print(\"For others:\", today.__str__())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Immediately above, we're calling the special methods explicitly; they're still special because sometimes they get called explicitly (e.g., `print(today)` earlier called `__str__`).\n", + "\n", + "Let's say we have a class for email messages. We can implement the special methods ourselves." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING: did you forgot to attach a file?\n" + ] + } + ], + "source": [ + "class Email:\n", + " def __init__(self, to, frm, subject, message, attachment=None):\n", + " self.to = to\n", + " self.frm = frm\n", + " self.subject = subject\n", + " self.message = message\n", + " self.attachment = attachment\n", + " if self.attachment == None and \"attached\" in message:\n", + " print(\"WARNING: did you forgot to attach a file?\")\n", + " \n", + " def __str__(self):\n", + " return f\"TO: {self.to}\\nFROM: {self.frm}\\nSUBJECT: {self.subject}\\n\\n{self.message}\\n\\nATTACHMENT: {self.attachment}\"\n", + " \n", + " def __repr__(self):\n", + " return f\"Email({repr(self.to)}, {repr(self.frm)}, {repr(self.subject)}, {repr(self.message)}, {repr(self.attachment)})\"\n", + "\n", + "em = Email(\"jobs@example.com\", \"somebody@gmail.com\", \"please hire me!\", \"Please see attached resume\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'Please see attached resume', None)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# implicit call to __repr__\n", + "em" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TO: jobs@example.com\n", + "FROM: somebody@gmail.com\n", + "SUBJECT: please hire me!\n", + "\n", + "Please see attached resume\n", + "\n", + "ATTACHMENT: None\n" + ] + } + ], + "source": [ + "# implicit call to __str__\n", + "print(em)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Comparison\n", + "\n", + "We normally use `==` to tell if two objects are the same. We need to do a little more work for this to work with our own types:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s1 = \"hi\"\n", + "s2 = \"hi\"\n", + "s1 == s2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e1 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'Thanks!', None)\n", + "e2 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'Thanks!', None)\n", + "e1 == e2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to implement `__eq__`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "class Email:\n", + " def __init__(self, to, frm, subject, message, attachment=None):\n", + " self.to = to\n", + " self.frm = frm\n", + " self.subject = subject\n", + " self.message = message\n", + " self.attachment = attachment\n", + " if self.attachment == None and \"attached\" in message:\n", + " print(\"WARNING: did you forgot to attach a file?\")\n", + "\n", + " def __str__(self):\n", + " return f\"TO: {self.to}\\nFROM: {self.frm}\\nSUBJECT: {self.subject}\\n\\n{self.message}\\n\\nATTACHMENT: {self.attachment}\"\n", + "\n", + " def __repr__(self):\n", + " return f\"Email({repr(self.to)}, {repr(self.frm)}, {repr(self.subject)}, {repr(self.message)}, {repr(self.attachment)})\"\n", + "\n", + " def __eq__(self, other):\n", + " if self.to == other.to and self.frm == self.frm and self.subject == other.subject:\n", + " return True\n", + " return False" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" + ] + } + ], + "source": [ + "e1 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'Thanks!', None)\n", + "e2 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'Thanks!', None)\n", + "e3 = Email('returns@example.com', 'somebody@gmail.com', 'refund please?', 'Thanks!', None)\n", + "print(e1 == e2)\n", + "print(e1 == e3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `__eq__` should check all the important attributes and return True when they are all equivalent (and False otherwise). The above `__eq__` is not very complete. It doesn't check `message` for example, which leads to strange behavior:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "e1 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'I will work hard', None)\n", + "e2 = Email('jobs@example.com', 'somebody@gmail.com', 'please hire me!', 'I promise', None)\n", + "e1 == e2 # should be False, but won't be because our __eq__ doesn't check message" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's say you have a class for grocery inventory, and you want to sort a list of inventory objects based on value." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "class Inventory:\n", + " def __init__(self, item, amount, price):\n", + " self.item = item\n", + " self.amount = amount\n", + " self.price = price\n", + " \n", + " def __repr__(self):\n", + " return f\"Inventory({repr(self.item)}, {self.amount}, {self.price})\"\n", + " \n", + "grocery = [Inventory(\"apples\", 10, 0.3), Inventory(\"oranges\", 2, 0.5), Inventory(\"kiwis\", 9, 0.2)]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'<' not supported between instances of 'Inventory' and 'Inventory'\n" + ] + } + ], + "source": [ + "try:\n", + " grocery.sort()\n", + "except Exception as e:\n", + " print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As the above error suggests, we need to implement \"<\" (less-than, or lt for short) to do sorting:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Inventory('oranges', 2, 0.5),\n", + " Inventory('kiwis', 9, 0.2),\n", + " Inventory('apples', 10, 0.3)]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Inventory:\n", + " def __init__(self, item, amount, price):\n", + " self.item = item\n", + " self.amount = amount\n", + " self.price = price\n", + " \n", + " def __repr__(self):\n", + " return f\"Inventory({repr(self.item)}, {self.amount}, {self.price})\" \n", + "\n", + " def __lt__(self, other):\n", + " return self.amount*self.price < other.amount*other.price\n", + "\n", + "grocery = [Inventory(\"apples\", 10, 0.3), Inventory(\"oranges\", 2, 0.5), Inventory(\"kiwis\", 9, 0.2)]\n", + "grocery.sort()\n", + "grocery" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The items are sorted from least valuable (1 dollar) to most valuable (3 dollars)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sequences\n", + "\n", + "How do brackets work? `obj[lookup]` is backed by a special function (called `__getitem__`) that takes `lookup` and returns a value. Let's create a Sentence class that lets you grab a word in a sentence." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "class Sentence:\n", + " def __init__(self, s):\n", + " self.s = s\n", + "\n", + " def __getitem__(self, lookup):\n", + " print(\"calling __getitem__ with \" + str(lookup))\n", + " return self.s.split()[lookup]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling __getitem__ with 3\n" + ] + }, + { + "data": { + "text/plain": [ + "'fox'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = Sentence(\"The quick brown fox jumps over the lazy dog\")\n", + "s[3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want, we can get clever and take other types. For example, we could interpret the float 3.2 to mean we want the 2nd letter from the 3rd word (counting both from the 0th position, of course)." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "class Sentence:\n", + " def __init__(self, s):\n", + " self.s = s\n", + " \n", + " def __getitem__(self, lookup):\n", + " print(\"calling __getitem__ with \" + str(lookup))\n", + " word_idx = int(lookup)\n", + " word = self.s.split()[word_idx]\n", + " if type(lookup) == int:\n", + " return word\n", + " letter_idx = int(round(10*(lookup - word_idx)))\n", + " return word[letter_idx]\n", + " \n", + " def __len__(self):\n", + " return len(self.s.split())" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling __getitem__ with 3.2\n" + ] + }, + { + "data": { + "text/plain": [ + "'x'" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s = Sentence(\"The quick brown fox jumps over the lazy dog\")\n", + "s[3.2]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The type checks means the old behavior works too:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling __getitem__ with 3\n" + ] + }, + { + "data": { + "text/plain": [ + "'fox'" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s[3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You might have noticed we implemented `__len__` above too. It does what you might guess:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(s)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "One last thing: for loops work. Python starts at index 0, then keeps counting up until there is an exception (which is hidden. Check it out (noticing that no word was returned when index 9 was attempted):" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling __getitem__ with 0\n", + "The\n", + "calling __getitem__ with 1\n", + "quick\n", + "calling __getitem__ with 2\n", + "brown\n", + "calling __getitem__ with 3\n", + "fox\n", + "calling __getitem__ with 4\n", + "jumps\n", + "calling __getitem__ with 5\n", + "over\n", + "calling __getitem__ with 6\n", + "the\n", + "calling __getitem__ with 7\n", + "lazy\n", + "calling __getitem__ with 8\n", + "dog\n", + "calling __getitem__ with 9\n" + ] + } + ], + "source": [ + "for w in s:\n", + " print(w)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Context Managers\n", + "\n", + "Context managers work with the \"with\" statement in Python. They're useful for making sure some code runs before and after a block, even if there is an exception." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "class TimeMe:\n", + " def __enter__(self):\n", + " print(\"start timer\")\n", + " self.t0 = time.time()\n", + " \n", + " def __exit__(self, exc_type, exc_value, traceback):\n", + " print(\"stop timer\")\n", + " self.t1 = time.time()\n", + " \n", + " def total(self):\n", + " return self.t1 - self.t0" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start timer\n", + "stop timer\n" + ] + }, + { + "data": { + "text/plain": [ + "0.0012068748474121094" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tm = TimeMe()\n", + "\n", + "with tm:\n", + " total = 1\n", + " for i in range(1000):\n", + " total *= (i+1)\n", + " \n", + "tm.total()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "start timer\n", + "stop timer\n" + ] + }, + { + "data": { + "text/plain": [ + "2.6177990436553955" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with tm:\n", + " total = 1\n", + " for i in range(100000):\n", + " total *= (i+1)\n", + " \n", + "tm.total()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "file objects are context managers. This is very useful, as `__exit__` automatically closes files. Without context managers:" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "f = open(\"hi.txt\", \"w\")\n", + "f.write(\"hello\")\n", + "f.close() # don't forget to close it!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With context managers:" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"hi.txt\", \"w\") as f:\n", + " f.write(\"hello\")\n", + "# f is closed for us!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another advantage. Even if the code inside the `with` fails (for example, maybe there's not enough drive space to write \"hello\" to the file), the context manager will close the file in the last example. Not so with the prior example." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion\n", + "\n", + "Special functions are crucial to making new types that are nice to use. For example, pandas Series and DataFrames make heavy use of special methods. For example, that's why we can filter rows in a DataFrame using `df[bool_series]` -- the `__getitem__` is smart enough to do something useful with `lookup`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/06-oop2/reading2.ipynb b/lecture_material/06-oop2/reading2.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c17a70f16498705ad4c4c45dcf2399e408b1e0e5 --- /dev/null +++ b/lecture_material/06-oop2/reading2.ipynb @@ -0,0 +1,351 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Inheritance\n", + "\n", + "If we're writing a new class that needs similar methods as another class, we could copy/paste those. A better way is inheritance. `class Child(Parent):` means that the new class named `Child` inherits methods from the previous class named `Parent`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parent: f\n", + "Parent: g\n", + "Child: h\n" + ] + } + ], + "source": [ + "class Parent:\n", + " def f(self):\n", + " print(\"Parent: f\")\n", + "\n", + " def g(self):\n", + " print(\"Parent: g\")\n", + "\n", + " def h(self):\n", + " print(\"Parent: h\")\n", + "\n", + "class Child(Parent):\n", + " def h(self):\n", + " print(\"Child: h\")\n", + " \n", + "youngster = Child()\n", + "youngster.f()\n", + "youngster.g()\n", + "youngster.h()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In your mental model, you should imagine the `f` and `g` methods being copied to the `Child` class, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parent: f\n", + "Parent: g\n", + "Child: h\n" + ] + } + ], + "source": [ + "class Child(Parent):\n", + " def f(self):\n", + " print(\"Parent: f\")\n", + "\n", + " def g(self):\n", + " print(\"Parent: g\")\n", + " \n", + " def h(self):\n", + " print(\"Child: h\")\n", + "\n", + "youngster = Child()\n", + "youngster.f()\n", + "youngster.g()\n", + "youngster.h()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `h` method doesn't get \"copied\" from `Parent` because `Child` already has a method called that. The technical way to describe this situation is to say that `Child` *overrides* the `h` method of the *base class* `Parent`.\n", + "\n", + "Every class we create has a parent. If we don't specify, its parent is a class named `object` (yes, it is confusing that a class is named `object`, since we create objects from classes; in Python code, `object` isn't an object, it's a class).\n", + "\n", + "This means we always inherit some special methods, like `__str__`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'<__main__.C object at 0x7f908edd48d0>'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class C:\n", + " pass\n", + "\n", + "obj = C()\n", + "\n", + "obj.__str__() # inherited from the class named \"object\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is very convenient; otherwise, we wouldn't be able to print `obj` because doing so implicitly calls `__str__`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<__main__.C object at 0x7f908edd48d0>\n" + ] + } + ], + "source": [ + "print(obj)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Multiple Inheritance\n", + "\n", + "Every class we create has at least one parent (`object` at a minimum), but we're allowed to have 2, 3, or more parents. This capability is called *multiple inheritance* -- it's a capability that many other programming languages lack." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "class Parent1:\n", + " def f(self):\n", + " print(\"Parent1: f\")\n", + " \n", + "class Parent2:\n", + " def f(self):\n", + " print(\"Parent2: f\")\n", + " \n", + " def g(self):\n", + " print(\"Parent2: g\")\n", + " \n", + "class Parent3:\n", + " def g(self):\n", + " print(\"Parent3: g\")\n", + "\n", + "class Child(Parent1, Parent2, Parent3):\n", + " pass\n", + " \n", + "youngster = Child()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is a confusing situation! For `f`, which method do we inherit? Both `Parent1` and `Parent2` have an `f` method, after all. Similarly, both `Parent2` and `Parent3` have a `g` method.\n", + "\n", + "Fortunately, the `Child.__mro__` tuple will tell us Python's preferences in terms of where to find methods." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(__main__.Child, __main__.Parent1, __main__.Parent2, __main__.Parent3, object)" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Child.__mro__" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<class '__main__.Child'>\n", + "<class '__main__.Parent1'>\n", + "<class '__main__.Parent2'>\n", + "<class '__main__.Parent3'>\n", + "<class 'object'>\n" + ] + } + ], + "source": [ + "for cls in Child.__mro__:\n", + " print(cls)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This means we'll use the `f` method from `Parent1` instead of the `f` method from `Parent2`, as `Parent1` is higher priority (earlier in the tuple). Similarly, we'll use `g` from `Parent2` instead of `Parent3`. This means we can predict what the following will print:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parent1: f\n", + "Parent2: g\n" + ] + } + ], + "source": [ + "youngster.f()\n", + "youngster.g()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`__mro__` stands for \"Method Resolution Order\", and it's a *special attribute* that every class has. Don't confuse this with the *special methods* that we've called on our objects. Contrast `youngster.__str__()` (parentheses are necessary for method calls, special or not) with `Child.__mro__` (just an attribute, so no parentheses; also, it's a class attribute, in contrast to object attributes we more frequently encounter).\n", + "\n", + "Python has some rules for determining the method-resolution order:\n", + "\n", + "1. **prefer closer**: if both a parent class and grandparent class have the same method, take the version from the parent (which is closer to the child)\n", + "2. **prefer left**: in `class SomeClass(Parent1, Parent2, Parent3)`, `Parent1` appears first (most to the left) in the list, so that is the highest priority; similarly, `Parent2` is higher priority than `Parent3`\n", + "3. **prefer descendants**: if both A and B are ancestors of our class C via separate paths, and A is an ascestor of B, then B will have priority over A\n", + "\n", + "Situations often arise where the above rules contradict each other. The above rules are from weakest (1) to strongest (3); this allows us to resolve contradictions. Let's see an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Level_1B\n" + ] + } + ], + "source": [ + "class Top:\n", + " def f(self):\n", + " print(\"Top\")\n", + "\n", + "class Level_1A(Top):\n", + " pass\n", + " \n", + "class Level_1B(Top):\n", + " def f(self):\n", + " print(\"Level_1B\")\n", + " \n", + "class Level_2(Level_1B):\n", + " pass\n", + "\n", + "class Level_3(Level_2):\n", + " pass\n", + "\n", + "class Bottom(Level_1A, Level_3):\n", + " pass\n", + "\n", + "b = Bottom()\n", + "b.f()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, `Bottom` could inherit `f` from either `Top` or `Level_1B`. `Level_1B` is a descendent of `Top`, so the `Level_1B` version is chosen, according to rule 3.\n", + "\n", + "This shows the strength of rule 3. Rule 1 would have preferred taking `f` from `Top`, as *Bottom => Level_1A => Top* is shorter than *Bottom => Level_3 => Level_2 => Level_1B => Top*. Rule 2 would have also preferred taking `f` from `Top`, as the *Bottom => Level_1A => Top* path is follows the leftmost parents up. Yet Rule 3 wins and `f` is taken from `Level_1B`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/07-recursion-and-graphs/reading1.ipynb b/lecture_material/07-recursion-and-graphs/reading1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..4f4f55326f47072bb24c65c6dd562dcc8891d04d --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/reading1.ipynb @@ -0,0 +1,447 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Recursion\n", + "\n", + "*Recursive* functions are functions that call themselves. Anything you can do with recursion, you could instead do with a loop, but sometimes recursion is more convenient. This is because data structures are often recursive. Data structures are recursive when objects of a given type contain references to other objects of the same type. For example, you could have dicts containing other dicts (which in turn contain other dicts). It would be possible, but quite difficult to write code to search through the following structure " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'A': 10, 'B': {'C': {'F': 4, 'G': 55}, 'D': 3, 'E': {'H': 11, 'I': {}}}}" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d = {\"A\": 10, \"B\": {\"C\": {\"F\": 4, \"G\": 55}, \"D\": 3, \"E\": {\"H\": 11, \"I\": {}}}}\n", + "d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Spend a couple minutes thinking: how would you write some code to check if 5 is contained anywhere in that nested structure, using loops?\n", + "\n", + "It's actually quite tricky, and we won't attempt it here. Instead, we'll introduce a simple recursive solution later in this reading." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Loops vs. Recursion\n", + "\n", + "Recursion and iteration (loops) are equally powerful (you can solve the same problems with either one or the other). However, one approach is typically simpler or more efficient, so it's useful to know both.\n", + "\n", + "Let's look at the following code using a loop, and think about how we could make it recursive." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$\n", + "$$\n", + "$$$\n", + "$$$$\n", + "$$$$$\n" + ] + } + ], + "source": [ + "for i in range(5):\n", + " print(\"$\" * (i+1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Printing a dollar triangle as above is well suited to loops. It's only two lines of code! The recursive solution in this case is more complicated, but let's try it as a mental exercise.\n", + "\n", + "Here's a key observation before we can develop a recursive approach: the problem of creating a triangle of width 5 characters (at the base) can be divided into two smaller problems:\n", + "\n", + "(1) Draw a triangle of size 4, like this:\n", + "\n", + "```\n", + "$\n", + "$$\n", + "$$$\n", + "$$$$\n", + "```\n", + "\n", + "(2) Draw a line of size 5, like this:\n", + "\n", + "```\n", + "$$$$$\n", + "```\n", + "\n", + "Note the recursive definition: to draw a triangle, we need to draw a triangle (albeit of a smaller size). Of course, we can skip drawing a smaller triangle if we're trying to draw a \"triangle\" of size one. The case where we can skip the recursive sub problem is called the *base case*.\n", + "\n", + "Let's create a recursive function that draws the triangle:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$\n", + "$$\n", + "$$$\n", + "$$$$\n", + "$$$$$\n" + ] + } + ], + "source": [ + "#dollars0.png 4 1 c,dollars1.png 2 3 c,dollars2.png 2 6 c,dollars3.png 5 2 c,dollars4.png 5 4 c\n", + "def dollar_triangle(width):\n", + " if width > 1:\n", + " dollar_triangle(width - 1) # problem 1\n", + " print(\"$\" * width) # problem 2\n", + "\n", + "dollar_triangle(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A moment before `dollar_triangle` calls itself for the first time, the process looks like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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xJBklC5d2vbHITEx0bBYLIavr68tOf/++++z/TCxdu1ao0ePIKNmzUOGxbLbkHYa0k7DYtltbNgQlelxhmEYgwYNMiQZy5YtMwyD5BwAbmdybpWQkGAEBQXl+fPIlStXskwckpOTjTNnztj+vt287+LFi3k67+1QEPHFxcUZp06dynUSh1snNDTU2LFjh7Fjxw5j165dxunTp42YmBizwwLuO6aOOb/Rxo0blZSUpIcffljOzs637DxTpkxR6dKlNXr06Exnl1y+fLkk6bHHHrNtc3JyUpcuXTRu3Dht2bKlwGcWXblypaKiojR9+vRsx+hIqZPI/P7777aucmPHjrVNPJMTTk5Otm5Arq6u8vPzy7RbkNWAAQM0dOhQSakzYH7yySeqWrVqjs8ppc5+W6dOHb322mvZlh0wYECaJWiscxDExsbKw8NDc+fOlSRNmDBBHh4euYrjZlu2bJEkNWnSRKtWrbJtr127tjZs2KDo6GhJss0wm93M/jNnlrd9f/FioiZMuKJPP72kRx89oeDgGipcOOOJhRo0aKAffvhBZ8+ezdf1AADyzsnJSeXLl8++YCas488zY29vrzJlymS6zzo53Z2oIOJzdnZWuXLlCiYgFIgiRYrIzc1NR44cUUpKiq5cuaKrV6/K3t5eJUuWlLe39x0z2S9wL7sjkvOQkBCFhobK19dXpUunn926oMTExGj79u3q27dvlv/BHDx4UBaLRYGBgWm2N2nSROPGjdOpU6cKPDZrcpjTSS369++fZjb7t956q8BjutmLL75o+75UqVIaOXJkro4/f/68QkJC1L9//xwtu/H888+n+dk6O6d1PPzGjRtlsVjytSat1e7duyVJM2bM0KJFi9Lss1gstiV2jP8ff56bcUwlSzrpk09K6fLlRE2adFVbt17PdKI4630xMpmlFAAA3PuSkpKUmJiopKQkJScnKyUlxfav9XvrV6FChWQYhlJSUmSk9opN8731M4X1M4adnV26760/e3t7KyIiwnaelJQUnTt3TufOnZOzs7OqVatmzg0B7hN3RHJuXes8Ny2/eWFtjbw5MVy7dm2an8uWLatNmzbp/PnzaR4WHDhwQJJuyRPtjCadiY6O1oYNGwr8XBnJbBmKghQUFCQp/f1fs2ZNnurbs2ePXF1d02w7e/asDh48mGmLRGYqVKggSZo7d666dOmS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2LFDv/76q6TUyZy2bt2q6OhoNWvWTOvWrdPly5fVp08flSlTJs3MzDNmzNDx48cVFhamIkWKqEuXLqpWrZok6fr165oxY4bat2+vtWvXat++fWrRooVat26dphV8y5YtWrRokWJjY/Xwww8rPDxcTz75pLy9vTOMee/evVq8eLGuXr2qBx98UE899VSBtKonJyfr7NmzCg8PV3JysooUKSI/Pz9dunRJV69eValSpQpkrW0AKEjM1g4AAHCTvXv3qnr16nrrrbcUFBSkzz77LM1+azL50ksv6dixY3r11VdVvXp1BQcH56j+jz76SDNnztTly5e1fft2tWnTJs053nnnHT3zzDMqWbKkunfvrg8++CDbOnfs2KGQkBDt3r1bM2fO1MyZM5WYmKjp06erf//+qlGjhh599FE988wziomJ0XvvvafFixdLSu3m3atXL61evVrXrl3T33//rerVq2vjxo2SpPDwcD333HMqXbq0hg4dqh07dqhDhw4aMmSI7fw//vijHn74Yf300086e/asBg8erOeee06XLl3KMN4pU6aodu3amjt3roKCgtS3b98CGx8aHBysq1evKjk5WVLq7+vAgQNKSkpS9erVScwB3JFIzgEAAG4ydOhQlSxZUpcuXdK8efN08OBBWSwW2/4vv/xSQUFBOn/+vBYuXKhr164pNjZWH330UY7q//vvv7Vz505NmTJFS5cu1dChQ9MtYxQXF6dNmzYpKSlJ//77b7Z1jhgxQoGBgXr++ee1fPlyLV++XG5ubpJS11T+5JNPFBMTo8TExHTjae3s7BQVFaU1a9bot99+0/bt21WnTh3Nnj07TbmPP/5YFy5c0KpVq/TVV19p1qxZSklJUVhYmAYNGqQXXnhB586d08yZM7VixYpMYw0LC9PLL7+sTz75RNu2bdPff/+thQsXatq0aYqPj8/RPcxKeHh4um12dnYqX7686ePdASAz/O8EAABwg6SkJK1evVqjRo1S8eLFMyyzYcMGtWnTxjbTsI+Pj7p06aK1a9fm6ByRkZEaM2aMNm7cqNOnT+vcuXNpkn9J6tevnxo1apSva7F66KGH9NRTT2VZ5vDhw/rxxx+1b98+nT59WiEhIapatWqaMs2bN7dNnFarVi2FhIQoJCREx44dkyT16dMnR8sd7d+/X1FRUTpw4ICt9f369euKiorShg0b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AID7Qq/HOpgdAgAAmaLlHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJSM4BAAAAADAZyTkAAAAAACYjOQcAAAAAwGQk5wAAAAAAmIzkHAAAAAAAk5GcAwAAAABgMpJzAAAAAABMRnIOAAAAAIDJHM0O4Fa6fPmy2SEAAIA8KF68uNkhAABwW93TyXnhwoXNDgEAAAAAgGzRrR0AAAAAAJORnAMAAFOFhISoatWqZocBAICp7ulu7TcLCwvThQsXFBMTo6SkJLPDAQCgwDk6OsrNzU2lSpWSj4+P2eFkKyQkRM2aNdP69evNDgUAAFPdNy3n165d05EjRxQZGUliDgC4ZyUlJSkyMlJHjhzRtWvXzA4nSzcm5s2aNTM7HAAATHXfJOcXLlwwOwQAAG6rO/lv382JOS3nAID73X2TnMfGxpodAgAAt9Wd+rcvo8SclnMAwP3uvknOAQCA+TJLzI8cOWJ2aAAAmOq+Sc5dXV3NDgEAgNvqTvzbR2IOAEDG7pvZ2kuVKqWjR4+aHQYAALdNqVKlzA4hHWsifvO/AADc7+6blvPChQuratWq8vT0lKPjffNMAgBwn3F0dJSnp6eqVq2qwoULmx0OAADIofsqS/Xx8bkr1nwFAAAAANxf7puWcwAAAAAA7lT3dMt5VFSU2SEAAIA8oEs+AOB+ky45DwoKMiMOAAAAm/DwcLNDAADgtrIzDMMwOwgAAAAAAO5njDkHAAAAAMBkJOcAAAAAAJiM5BwAAAAAAJORnAMAAAAAYDKScwAAAAAATEZyDgAAAACAyUjOAQAAAAAwGck5AAAAAAAmIzkHAAAAAMBk+UrOg8JP5bjswYMHdebMGUlSUlKS4uPj83PqHDt37pz2799/y+o/cOCA7bpupcTERCUmJt7y89xLwsPD9e+//5odBgAAAABkK1/JeWhsqA5fPaJkIznbsvPnz9eWLVskSbNmzdJ//vOf/Jw6Q5cuXdIXX3yh5OT/xbNjxw7NnTs3T/X99ddf2rhxY5Zl5s+fr23btuWp/twYP368xo8fn686duzYoenTpxdQRLdeRr/P3Dh79qx+//33Ao4KAAAAAAqeY34riEqI0uHQI/L3KS83R7ccHdOuXTs1adIkv6dOJyYmRidOnJBhGAVS34kTJ+6Y1uq+ffvm+7ouXbqkw4cPF1BEt15B/z4BAAAA4E6VJjnfdnF7niqJSYrR4dAjqly4kiyFLNmWP3DggA4fPqxBgwbpzJkz+v777/Xwww9r7dq1kqT27durffv2kiTDMLR06VKtWLFC8fHxatiwoR599FEVLVo0Xb0//vijJOndd9+Vvb29BgwYIEm6fv26fvzxR+3Zs0dFixZV9+7dVbNmTUnS119/rRMnTigpKUkWi0Vdu3ZV48aNtXHjRgUHB+vMmTPau3ev/Pz89Morr2R4PWfPntXHH3+sc+fOqXLlyurVq5dKlCihyMhIjR07VmFhYZIkX19fDRgwQOXLl5ckLVq0SKtWrVJsbKw8PT315JNPqkGDBunqf+edd2QYhurWratu3brp+PHj+uOPP/TRRx/ZyowZM0Zdu3ZVtWrVtGfPHs2cOVPh4eFydXVVo0aN9PDDD2vJkiVKSkrSyJEjJUmjR4+Ws7NzmnNldr8tFos+//xzVa1aVd27d5ckbdu2Tf/884+GDRsmHx8fHThwQNOmTVN4eLgCAgLUoUMHVapUSZJ06NAh/fnnnwoNDZXFYlGbNm3UokUL/ec//9Err7wiPz8/SdKff/4pd3d3de7cOcPfZ+XKlTN9PRiGofnz52v16tWKj4+Xl5dXpq9BAAAAALiTFNiEcMlGsg5fPaLQ2NBsy0ZEROjSpUuSpLi4OIWHh+vIkSPq16+f2rRpo7lz5yoqKkqStH79ev3zzz/q2rWrhg0bposXL2rGjBkZ1tumTRtJUq9evdSnTx+VKlVKUurYY2dnZ7300ksqVaqUpk2bZjumUqVKevHFF/Xuu+/q4Ycf1h9//KHIyEgFBASoSJEiqlKlivr06aMOHTpkej3Hjh1TrVq1NHjwYIWEhGjZsmWSJHt7ezVs2FBDhgzRm2++KW9vb/3www+SpCNHjuiff/7Rk08+qbffflstWrTQlStXMqy/b9++slgsCg1NvbexsbEKCQlJU+bixYu6fv264uPjNXHiRFWrVk0jR45U9+7dde3aNRUpUkS1atWSxWJRnz591KdPHzk5OaU7V2b329nZWY8++qhWrlypPXv26MqVK5o8ebJatmwpHx8fXbx4URMmTFD9+vU1cuRIFStWTBMmTJBhGLpw4YLGjx+vEiVK6LXXXlO7du107NgxGYaha9eupZl/4MqVK7p27Vqmv8+sXg8bNmzQkiVL1KhRIw0fPlzVq1fP9HcGAAAAAHeSfHdrLyhvvfWW7OzsJEmLFy/W4cOH1aBBA61YsUIBAQEqVaqUDMNQnTp19Pfffys5OVkODg5p6vD395ckVa9eXY6O/7s0Pz8/Wyt64cKF9dFHHykqKkoWi0UdOnTQqVOndPToUSUlJUmSLl++rEqVKsliscjX1zfbJK9Vq1Z67LHHJEktW7bUihUrJEkeHh5q3769jh49qvPnz8vBwUHh4eGSUh9KSJKzs7P8/PxUtmzZTOsPDAzUhg0bctS92zo+u1ChQipatKgeeOABPfzww5KkUqVK6ezZs1leT1b3u27dumratKl+/vlneXp6qnbt2mrZsqUkae3atXJ3d1etWrWUmJioOnXqaO3atTp16pQ2b94sR0dHDR48WHZ2dgoICFCrVq2yHTKQ0e8zq/hWr16twMBA9ezZ03aPN23alO09AwAAAACzFVhy7mDnkONu7dlxdna2taaGhYUpOjpakydPtu0vUqSIoqKi5O3tneu63dxSx8XHx8fLwcFBn3zyia5evaqqVauqSJEikqSUlJQ8x+7q6qqEhARJ0pkzZ/TZZ5/J2dnZ1r3bqnr16qpbt65+/vlnSVLFihXVr18/lShRIs/nllKvr3Pnzvrnn3+0atUqFSlSRL169VKNGjVydHx297tXr17avHmzrl27ptGjR9vKhISEKD4+Ps1xxYoVU2RkpEJCQlSxYkXbw5f8yCq+K1euqFGjRvk+BwAAAADcbmmS8wYl6+fqYOsYdTdHV/n7+Od4Qrjc8PDwUOPGjdW5c+ccH5PT5Hrv3r26cuWKvvrqK3l4eEhK7Rp9o/xMRrZixQoVK1ZMo0aNkr29vY4ePaqDBw9KkhwdHfXCCy8oOjpaR48e1axZszRz5ky9/vrr2dZ7c4+Bm3Xs2FFt2rTRqVOntGjRIv3www+aMGGC7Ozssr2e7O73unXrlJKSInt7e82bN09PPfWUJMnb21t+fn5655130h2zZ88e7du3L912a7KeXQv6jb/PrOLz8/PLdGgAAAAAANzJ8j3m3FLIooCiAbckMZek+vXra8mSJTp69KiSk5N14cIF/fbbbxmWtU4qdujQIcXGxio2NjbLut3d3SWltvpGRERo4cKFafb7+/vr+PHjio+Pt3VHzw03NzfFxMQoLCxMly5dso1Fl1KXNVuzZo0cHR1Vo0YNFS9eXC4uLjmqt0KFCpKkrVu3Kjw8XAsXLrR1yQ8JCdGMGTMUExOjSpUqqXLlykpJSVFKSorKly+vq1ev6tq1awoPD88wUc/qfp86dUozZ87UCy+8oBdeeEGrV6/Wnj17bMedPn1aq1evVlJSksLCwrRo0SKdOXNGderU0fXr17V48WLFxsbqzJkzmj9/vhwdHeXr66stW7YoKipKW7du1dGjR22xZPT7zCq+WrVqafv27Tp48KAuXLiglStX5ur3BQAAAABmyVe39qKuReXvXT5HZe3t7TPs1pxdV+fHH39cERERGjdunG1bZl2/nZ2d9cgjj2jixImSpJdeeinTc9jZ2alGjRqqUKGCPvvsM0myzaJuLd+oUSNt375dr732mooVK6YxY8ZkeN4b67/x+9atW2vPnj221uQyZcrY9jk6OmrWrFm2ycxKly6tvn37ZnofbkykXVxc1Lx5c02aNEmSbOPV7ezs5OjoqG3btmnNmjWSUlu0Bw4cKEdHR1WpUkV+fn622dq//fbbdLO1Z3a/Y2NjNX78eDVq1EgPPvig7f78+OOP+uSTTxQYGKhu3bpp9uzZmjlzpqTUhx8PPvigatasqUcffVTz58/X/PnzJUnNmjWTJD322GP6448/9O+//8rd3V0eHh62e5jR7zOr10Pjxo21bt06ffvtt7Z7CgAAAAB3AzvjLllEOjk5WeHh4fLw8EiXUN4sPj5eiYmJtq7q2QkPD5ednV2mS29Zz3vjJHO5ERISIk9Pz3Qt44ZhKCIiQi4uLtm2mn/yySeqUqWKnnzySdu2mJgYJScny2JJP84/OjpaycnJGV5TdHS0nJycsryPubnfN19TeHi4nJyc0t3/lJQUhYWFydPTM81M8dZzWcf83yyj32dm8RmGodDQUHl6euYqbgAAAAAw012TnN+vPv74Y0mpk8uNGjXK1tUbAAAAAHDvIDm/w23YsEFxcXGqX79+nmanBwAAAADc+UjOAQAAAAAwWb5nawcAAAAAAPlDcg4AAAAAgMlIzgEAAAAAMBnJOQAAAAAAJiM5BwAAAADAZPlKziM/HV1AYdxamzZtUnh4uCQpPj5eSUlJ5gYEAAAAAMAN8pWcxy1bpLA3BsmIjiqoeHLt66+/1unTp7Ms88cff+j8+fOSpI8++kh//PFHgcexY8cOTZ8+vcDrNUtO7isAAAAAoGDku1t74p6dCntjkJJOHC2IeHLtyJEjioyMzHH5QYMGqVOnTgUex6VLl3T48OECr9csub2vAAAAAIC8c7zxh5Dm9fNUSdKJYwp7Y5C8P/pSTg/WzbDMr7/+KgcHB50/f17nzp1T5cqV1atXL5UoUUKSdODAAU2bNk3h4eEKCAhQhw4dVKlSJa1du1bLly/X0KFDVbRoUSUlJemrr75SlSpVFBERYavb1dVVzZo1U4cOHbKMdfny5SpTpozatGmjtWvXateuXXJ3d9eePXtUtGhRde/eXTVr1pSU2gV+6tSp2rVrl5ydndWyZUu1adNGzs7Oaeo8f/68lixZoqSkJI0cOVKSNHr0aCUmJmrSpEk6fPiwnJyc1KhRI3Xv3l0ODg4ZxpaXe9ClSxeFhIRo0qRJOn36tEqWLKlWrVqpcePGtmuYMWOGdu/ercTERJUrV04DBw7U9u3bdenSJfXv31+SdOXKFY0bN07/+c9/NHv27Azva2bxAQAAAADyp8AmhDOioxU2ZJDilizIcP+lS5e0detW1apVS4MHD1ZISIiWLVsmSbp48aImTJig+vXra+TIkSpWrJgmTJggwzDUtGlT2dvba/z48UpOTta0adN05coVtWvXTi1atJAktWjRQn369NGDDz6YbZyXLl1SWFiYJCk8PFxHjx6Vs7OzXnrpJZUqVUrTpk2zlZ00aZJOnjypF198UQMGDNDq1au1efPmdHUWKVJEtWrVksViUZ8+fdSnTx85OTnpp59+0pkzZ/TMM8+oU6dOWrdunZYsWZJhXHm9B0lJSRo7dqzc3Nz05ptvqkWLFvrjjz90+fJlSdLPP/+s3bt3q1OnTnr55Zfl7Oys0NBQhYWF6dKlS7bzJyYm6tq1a0pOTs7wvmYVHwAAAAAgf27rbO2tWrXSY489pho1aqhly5Y6ePCgJGnt2rVyd3dXrVq1lJiYqDp16ig+Pl6nTp2Sg4ODhgwZotDQUI0dO1ZbtmzRkCFD5OrqqgceeECS5O/vr+rVq9ta4XPDz89PAwYMUM2aNdWpUyeFh4crKipK8fHx2rNnjxo1aiR3d3e5u7uratWq2rp1a7o6XFxcVKpUKbm6uqp69eqqXr264uPjdfToUT3++ONq0KCB2rRpo3r16mn9+vUZxpHXe3Do0CFdv35dLVq0kGEYKlWqlAoXLqzt27crLi5O+/fv12OPPaZWrVopMDBQr732mipXrpzlPcnovmYVHwAAAAAgfxyzL5Izdu7u8h7zVabd2m/m6uqqhIQESVJISIji4+M1efJk2/5ixYrZxjwXKVJETzzxhObMmaO2bdvKz8+voMJOw83NTVJqV3DruTdt2qQtW7bYynh7e+eormvXrklKTXCtKlSooB07dmRYPq/3wNpCPnPmTNtxDg4OSkhIUGhoqCSpatWqOYo5K9nFBwAAAADIuzTJue/a7bk62DpG3bFCJXmOfF+OFavkKQhvb2/5+fnpnXfeyXB/XFycli1bJnd3d61evVotW7aUj4+Pbf+t6Frt5eUlSRo4cKAqVqyYbXk7O7s0cXh6ekpKHY9uTaTPnz8vV1fXDI/P6z3w9vaWvb29Ro8eLUfHtM9aoqJSZ9E/e/asSpcunWafvb29EhMTs7ymG68nu/gAAAAAAHmX727tTrXqyGf8j3lOzCWpfv36On36tFavXq2kpCSFhYVp0aJFOnPmjCTpxx9/lKurq8aOHavChQvbxl5LUsmSJXXo0CElJCQUaCuuh4eH/Pz89Pvvv+vy5ctKSkrS0aNHNW/evAzLly9fXlevXtW1a9cUHh4uDw8PFStWTMuWLdPly5d1/Phxbd++XbVq1SrQe2BtFZ80aZKuX7+umJgYbd26Vf/++68sFouKFSumRYsW6eTJk4qPj9eyZct05swZBQQE6Pz58zp//rwuXbqkuXPnponn5vuaXXwAAAAAgLzLV7d2l3Yd5TlydI7L29nZZfh9YGCgunXrptmzZ9u6Z7u7u+vBBx/U8uXLdeTIEX344YcqVKiQXnvtNY0aNUqzZ89Wz5491a5dO02dOlVr1qzRI488ot69e2d5bnt7+0zjuHnbyy+/rB9++EGjRo2y7WvatGmG9VepUkV+fn622dq//fZbvfTSS/r6669tx5cvX17dunXL8Pj83IPXX39dv/zyi4YOHWq7xqefftp2Dd9//70+//xzSanDCWrWrKmAgACVKVNGH374oSTZZl23XntG9zWz+AAAAAAA+WNn3EHTbRuGofDwcDk5OcnDwyPHx6WkpCgyMlJeXl4ZJtv5FR8fr+joaHl7e2e6DJpVdHS0nJyc0iy3dvXqVRUqVEgWiyXbc+X1HljPnZSUlOF9iImJUWJioq27vlV4eLhcXV3TLQ8nZXxf8xMfAAAAACBjd1RyDgAAAADA/ei2LqUGAAAAAADSIzkHAAAAAMBkJOcAAAAAAJiM5BwAAAAAAJORnAMAAAAAYDKScwAAAAAATEZyDgAAAACAyUjOAQAAAAAwGck5AAAAAAAmIzkHAAAAAMBkjmYHcK9ITExUaGiorl69qvj4+DT7nJ2dVaRIERUtWlROTk4mRQgAAAAAuFPZGYZhmB3E3S4hIUEnTpyQxWKRj4+PnJ2d0+yPj49XWFiYoqOjVaFCBRUqVMikSAEAAAAAdyKS8wJw4cIFJScnq0SJElmWu3z5suzs7OTn53ebIgMAAAAA3A3SdWtPSkpSRESErl+/rqSkJDNiuutERUXJ398/23JeXl4KCgpK1+0dAABIjo6Ocnd3l5eXlxwdGXkHALi/pPnLl5SUpIsXL8rFxUVFihRhfHQO7d+/Xy4uLtmWc3FxUVJSkkqXLn0bogIA4O6SmJiomJgYXbx4USVLliRBBwDcV9LM1h4RESEXFxd5eXmRmAMAgNvKyclJXl5ecnV1VXh4uNnhAABwW6VJzq9fvy43NzezYgEAAJCrq6tiYmLMDgMAgNsqTXKelJREizkAADCVk5MT894AAO479tkXAQAAAAAAtxIzrRSQlJQUs0MAAAAAANylSM4LCMk5AAAAACCv0iTnjo6OSkxMZNx5HtjZ2ZkdAgAA94TExESWUQMA3HfSjDl3d3dndlQAAGCq2NhYVo8BANx30iTnXl5eiouLU2RkpBITE82KCQAA3IcSExMVGRmp2NhYeXt7mx0OAAC3Vbpu7SVLllR4eLiuXr3KMia5kJtu7efOnbuFkQAAcHdydHSUm5ubSpYsSbd2AMB9J91fPkdHRxUtWtSMWO5aBw4cUFxcnFxcXLIsFxcXJ2dnZ/n7+9+myAAAAAAAdwPWOS8AhQsXVmRkpOzs7LL8ioyMlI+Pj9nhAgAAAADuMCTnBaBo0aKKjo7W5cuXFRcXl25/XFycLl++rOjoaBUrVsyECAEAAAAAdzI7wzAMs4O4FyQkJOjKlSsKCwtTfHx8mn3Ozs7y8fFRsWLFVKhQIZMiBAAAAADcqUjOAQAAAAAwGd3aAQAAAAAwGck5AAAAAAAmIzkHAAAAAMBkJOcAAAAAAJiM5BwAAAAAAJORnAMAAAAAYDKScwAAAAAATEZyDgAAAACAyUjOAQAAAAAwGck5AAAAAAAmczQ7gPvJlClTFBMTo6CgILNDuWX8/f3l5uamfv365aj8vXpPcnsfYK6xY8cqIiJChw8fNjuUO1JAQIC8vLz09ttv5/iYe/W9bcV7HAAAFDQ7wzAMs4O4H0yZMkVubm5q1aqV2aHccqtWrVJMTEy2H1rv9XuS0/sAc40dO1bu7u568sknzQ7ljvbXX3/p+vXrOUrQ7/X3thXvcQAAUJDo1n6bXL9+/Z7/oGrVqlUrXb9+Pdty9/o9yel9gLkiIiJIzHPgySefVERERI7K3uvvbSve4wAAoCCRnN8mp06dMjuE2yon13s/3JP74RrvdnRlz7mc3qv76XV/P10rAAC4tUjOgTvUvTziJCYmRsuXL9eGDRuyLZuUlJSjOnNaDgAAALgTMSHcPSg4OFgffPBBhvsGDx6sEiVKaNSoUfryyy9VpEiRXNV98eJFJSUlqUyZMgURaoGKiIjQG2+8YfvZzs5ORYsWVZcuXdSoUaN81X327Nk837PcmjdvnhYsWKDZs2crKipKgYGBateund58802VLFlSx48f1+zZszVixAg5Ot7at/DDDz+syMjIdNt37twpFxeXPNU5c+ZMPf/884qKipKvr68uX76crszKlSs1evRobdq0SZLUo0cP9e3bV506dUpT7syZMxo1apQ2bNigoKAgvfbaaxo/fnye4srM6dOn9cknn2S474UXXlDdunUL9HwFZf78+Tpx4oSGDRtmdijpWN+rb7zxhmrVqlVg9RqGoW3btqlhw4YFVicAAMDtQsv5HS45OTnX+69du6Z58+bJ1dVVpUuXTvPl6uqq5ORknTlzJk8tjQ0bNtSBAwdyfVxBy+i6ExISNG/ePCUkJKh06dLy8fHR/v371bFjRy1dujRf54uKitK8efMUExOTr3qyM3PmTHXt2lV2dnb67bffNGPGDHXq1Elff/21jhw5Ikk6ePCg3n33XaWkpNzSWKznCggI0CuvvJLmKz8PBSZMmKD+/fsrMTFRFy5cyLDMv//+Kz8/P82aNUt///23oqKi1LlzZ23dutVWZvfu3apevbpOnDihjz/+WCtWrFDHjh3zHFdmwsLCtHDhQrm6usrPzy/NV14fUNwOJ06csD3cuFl2/6/catb3akhISIHWO3ny5EwfRuTl/1IAAIDbiZbzO9TWrVv1yy+/yMfHR59//nmu90vSa6+9pqpVq6bbnpycrL///lteXl5KTk5WdHS03N3ddfr0afn7+8vOzk7R0dE6c+aMfH19VbRoUUlSdHS0oqKiFB0drcTERDk5ORXsRedATq57wIABatOmjaTUlrTOnTtr2rRpat++va1MRESEzp07J09Pzwx7AZw7d04eHh7y9vbO8BxJSUm6fv263N3dC7T1etSoUWrcuLF++eUX27annnpKw4cPl5SaKC5fvlySNGnSJDk5OalGjRpq0KCBJGnJkiX6999/JUktW7ZUixYtJKUmahs2bFC7du30119/6fTp03rkkUfStURn5JFHHtFLL72U42tISUnRX3/9pR07dsjb21udOnVS9erVJUlTp07Vpk2bVKtWLf3++++qV69ehi2nI0eOTPP6atiwofz8/LRx40Zbq+hbb72lYsWKae3atbe8B4GU2uukcuXKWZYJDg6Wp6enChcubNsWGxsre3t7hYWFydHRUYUKFZLFYpGdnZ1SUlIUHR0tNzc32zVERUXJzc1NDg4OkqTLly8rNDRUpUqVko+Pj6TU9/D169fl5uamM2fOqHz58rKzs5NhGAoKClKpUqWyjLNLly6qX7+++vbtK39///zcllsmKSlJ586d0/Xr11W+fHm5ubnZ9iUmJurUqVO2Byb29vZKSkpSWFiY4uPjFRUVJYvFkqa+0aNH6/z583r++ef10EMPyc7OLs3+Dh06qGHDhhowYIAqVKhwW64RAADgRrSc30FiYmI0ffp0NWnSRO3bt1dycrJ69+6d4/05dfToUZUrV07nzp3TwYMHVa5cOT355JOqV6+ePvzwQ82ZM0dlypRR48aNValSJfXo0UMxMTG25PaFF17Qd999V2DXnZ38XHdycrLi4+Pl6+srSYqMjFSPHj1Urlw5NWnSRDVr1lSfPn1srWanTp1S/fr1VaNGDZUvX149evRQbGxsunh69Oih5s2b68qVKwV6rfXq1dPp06fTrQ1dtGhRFS1aVNHR0Vq3bp0kafbs2Zo5c6b2798vSXrxxRf16KOPavfu3Vq3bp1atmypGTNmSErthv7ss8+qatWq+u233zRlyhR17txZv/76a7YxhYSE6MiRIxl2P89It27d1KNHD23btk3ffPONatSooUWLFkmSFixYIEnauHGjZs6cqWPHjmVYx80PfkJDQyXJ9rDk+PHjWrFihZ5//nnt2LFDCxcutPUsMMNff/2lNm3aqHHjxqpRo4YGDRpkm8X71Vdf1VNPPaW6deuqVq1aCggI0N69eyVJO3bsUEBAgObPny9JunTpkqpWrarDhw/ryJEjatq0qerUqaO2bduqevXqmjhxoqTUidkCAgLUu3dvNW3aVJ9++qn27Nmj2rVrq1mzZqpYsWKWvUVefvll7dmzR02bNlW/fv20evXqO6rleP78+fL399eDDz6oJk2aqGrVqlq/fr0k6dChQ6pWrZoaNmyomjVrqm7dujp+/LhWrVqlMWPG6MSJE3rggQfSXU/37t3l4OCgRx99VI0aNdKUKVPSzLT++uuva+fOnapXr5569OihFStW3FH3BAAA3PtIzu8QX3/9tapWrarRo0friSee0KFDhzRp0iTVrl07R/sz8tlnn2nEiBG2r+nTp6fZf+OEY4ULF9bSpUv1zDPP6J133tGIESMUGhqqjRs3asWKFdqwYYM2btwoSZo+fbqGDBlS4PcgI3m57nHjxum5555Tnz59VL9+fV25csXW1XXGjBlasWKFtm3bpitXruj777/X4sWLtWfPHhmGoR49eqhs2bLau3evDhw4oD179ujnn3+21R0bG6unn35aZ8+e1ZIlS1SyZMkCvd6XXnpJERERqlChgh5++GG9/PLLmj17tm0IQpkyZfTxxx9LSm0lX758uQYOHKh169bpp59+0saNG7Vw4UKtX79eI0aM0NSpU9PUv3LlSu3cuVPBwcF6/PHHNXv27GxjGjNmjAICAlSiRAk9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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import Image\n", + "Image(\"dollars0.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that there is one stack frame for `dollar_triangle` on the right (the blue box with `width=5`). A moment after that first call to itself, the process looks like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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F198gV27diEhIQEBAQHo37+/2jE++ugjTJ8+HY0aNcLYsWPxn//8p9w2b9y4gcTERNy+fRu7du3Crl27UFBQgO3bt2Pq1Klo2bIlXnvtNUyfPh1yuRyffPIJjhw5AqB4mPf48eNx+vRppKamYt++ffD29sbFixcBAOnp6Xjrrbfg5OSEBQsW4MaNGxg8eDDmz5+vOv7PP/+MLl26YMOGDXjy5Almz56Nt956C/Hx8Rrj3bJlC1q3bo39+/cjPDwckyZN0tr80MjISKSkpKCwsBBA8c/rwYMHUCgU8Pb2ZmJORHUSk3MiIiKi5yxYsACNGjVCfHw8/P398fDhQ0ilUlX5d999h/DwcDx9+hSHDh1CamoqcnJy8MUXX1So/X379uHmzZvYsmULjh07hgULFpR4jFFubi4uXboEhUKBy5cvl9vmkiVL4OXlhbfffhvHjx/H8ePHYWxsDKD4mcorVqyAXC5HQUFBifm0EokEMpkMZ86cwebNmxEQEIC2bdtiz549avW++uorxMbG4tSpU/j++++xe/duFBUVIS0tDTNnzsQ777yDmJgY7Nq1CydOnCg11rS0NLz33ntYsWIFrl+/jn379uHQoUPYtm0b8vLyKnQNy5Kenl5im0QigYuLi+jz3YmISsP/nYiIiIieoVAocPr0aXz66ado2LChxjoXLlxA//79VSsNW1paYuTIkTh79myFjpGZmYkvv/wSFy9eRFRUFGJiYtSSfwCYPHkyunbtWq1zUercuTPeeOONMusEBQXh559/xr179xAVFYXExER4eHio1enVq5dq4TQfHx8kJiYiMTERjx49AgBMnDixQo87un//PmQyGR48eKDqfc/OzoZMJsOFCxfQr1+/qpwmEdELjT3nRERERM9Qzi339PQstU5SUhLc3NzUtrm4uCApKanc9tPS0uDh4YGDBw9i6tSp2LJlC5YsWVK9oKvp4sWL6NixI5KTkzF//nzs378fffr0KXOfBg0aACgeEp+bmwsAcHZ2rtDxkpOTAQDNmzeHo6MjHB0d0bx5c/z3v/+tcBtl0TTHvbR570REdQV7zomIiIieYWlpibZt2+L27dsYN26cxjru7u44fvy42rYzZ86U6GnW5PLly5DJZDhw4IDqmcEhISHVDxyAoaEhCgoKKr3fwYMHYWdnh/3796sWpavM86m7desGoHjeu4uLC4DiEQilUdbp3bt3hVaWr6wmTZogMjISMplMtSCcNpJ+IqKaxOSciIiI6DmvvfYaVq9ejWbNmsHHxwd//PGH2mrtU6dOxZgxY/D5559jwoQJOHjwIC5cuID169eX27Yygd+5cyfGjh2Le/fuae15vL1798Zff/2FqVOnIjMzEz4+PhXaz9vbG4mJiTh06BCaNm2K48ePY/fu3ZgwYUKF9jcxMcHgwYMxY8YMXLt2DcbGxvjhhx9Krd+qVSt07twZ06dPx4YNG+Dp6Ynw8HD89ttvWLBgAVq2bFmh45ZGV1e3xMgGIqK6jsPaiYiIiJ7zzjvvwNnZGW+//TY6duyIxMREtfLRo0fjiy++wGeffYZmzZphwYIFWLhwId56661y23Zzc8NHH32E//u//4OHhwfef/99NGvWTCtxT5kyBXp6emjWrBnatWuH3NxcVU+4Jsqy119/HUOGDMHw4cPh5eWFbdu2wcvLq0S9str49ddfMWLECBw8eBC3bt3CsmXLAEC1KN2zdHV1sXfvXvj4+KBfv35wdHREjx498PDhwxKL1RER1RcSQRAE5Tfh4eFwdXUVMx6tyMjIAAD+505ERPSC0+Znkx2HjmL80MEVri8IAiIjI2FpaVnqfOXc3Fw8efIEjo6OGpPQsshkMiQkJKBJkyZaX0E8OTkZxsbGlY4pLi4OhYWFcHJyqnYMmzZtwptvvomCgoIyzy8vLw9xcXGwtbWFiYlJpY6xZ88ejB07trqhEhHVCRzWTkRERKSB8tFbZTE0NKxyr7dUKi2xQntpli1bhnXr1pVZ58mTJ6qOicrMF39Wo0aNqrQfAHz44Yd49OgRPD09kZycjA0bNuCTTz4p98aDgYEBmjRpUuXjEhG9LJicExEREdVxX3/9Nb7++muxwyhTr169kJCQgLt378Le3h47duwo9/FtRET0LybnRERERFRtgwYNwqBBg8QOg4johcUF4YiIiIiIiIhExuSciIiIiIiISGQc1k5EREREL6w9e/aUW4cruhPRi4DJORERERG9kJh0E9HLhMPaiYiIiIiIiETG5JyIiIiIiIhIZEzOiYiIiIiIiETG5JyIiIiIiIhIZEzOiYiIiIiIiETG5JyIiIjqhfFDB4sdAhERUamYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkciYnBMREVG9sOPQUbFDICIiKhWTcyIiIiIiIiKRMTknIiIiIiIiEhmTcyIiIiIiIiKRMTknIiIiIiIiEhmTcyIiIiIiIiKRMTknIiIiIiIiEhmTcyIiIiIiIiKR6YkdABEREVFdFBoaiszMTLRr167C9YOCggAArVq1QpMmTSpV/qLIzs7G7t27MXnyZOjp1d5HyZfl+hERlYY950REREQa+Pv7w8/Pr8L1AwMDsW3bNrz99ts4cuRIpctrQ0hICIYPH16tNsLCwvDmm28iMTFRS1FVTF24fkRENYnJOREREdEzZDJZmeX5+fnIz88vsX3EiBHYtWsXunTponG/8sqfJZfLtVJH0z5nz56tcF1NfHx8oFAo4ODgUOXYyirPzc3V+HVFr19BQQFycnLKrENEVBcxOSciIiICEB0dDR8fH5iZmcHNzQ2XLl1SK09LS4Ovry8MDAxgYGAAX19fpKWlae34kZGRmD17NpydnWFiYoIxY8aU6J12dnbG5s2b4ebmBhMTE8ybN6/C7fv5+eHVV1+FTCaDmZkZzMzMcPfu3Qq3HxERodrP0tISRUVFlYr/3XffxYIFC9C3b1+YmJigY8eOCA0NVZXLZDJMmTIFdnZ2aNiwIZydnWFkZIS8vLwKnV9eXh7mzJmDBg0awNjYGNOmTVNL7omI6jom50REREQAvv/+exgbGyM4OBj+/v64cuWKWvmiRYvw+PFjBAQE4Pr16wgJCcHixYu1dnwzMzMMGTIEoaGhCA8Px/379+Hv769WJyYmBnPnzoWfnx/u3buH2bNnV7j9mTNnYt++fZBKpXj8+DEeP36MFi1aVLj9Jk2a4PHjxzh27JjG0QXlxZ+VlYVff/0VS5cuRVpaGgwNDbF3715V+R9//IHIyEjEx8fjs88+Q35+PrKzs2FgYFCh81uzZg2OHDmCW7du4dGjR7hy5QqHvxPRC4XJORERERGAffv2YcGCBXB3d0fLli2xcOFCVZlCocDGjRuxYMECtG/fHh06dMDixYvx22+/obCwUCvHt7KywpAhQ2BoaAgrKysMHDgQZ86cKVFv69atGDFiBFq2bAl3d/cKt29sbAxra2sAgK2tLWxtbTUu6FZa+xKJBLa2trCzs6ty/J988gkGDBgACwsLDBo0CLdv31aVPXr0CJ6enjA2NoaXlxcAwNDQsMLnt3XrVrRr1w7R0dEIDAxEy5Yt8eeff1Z4fyIisXG1diIiIqr3UlNTERMTg1atWqm2SSQS1dfJyckAgLZt26q2KVdxT0lJKTVhrYycnBx8+OGH2LRpE8zNzZGfn48ePXqUqNe4ceNqH6ssVW2/IvE/e02lUqna0PiJEyeiX79+KCwsxJkzZ7BkyRLo6FS8HykiIgLm5uY4ePAgAMDCwkJ1M4KI6EXA5JyIiIjqPSsrK7i6uiIoKEjVW/zsom82NjYAgLt378LT01P1tXJfbfjuu+9w7Ngx3L9/H40bN4afnx8uX76slbZrQ3XjNzAwgIuLCzw9PbF06VI0a9asUsd3cXFB69atsWbNmsqGTkRUJ3BYOxERERGAQYMGYe3atYiNjcXt27fVkjw9PT2MGzcOq1evRnBwMIKCguDn54cJEyZoHBqen59f5kJmmspzcnLg4OAACwsLHD9+HMuXL9f6gmZ2dnaQyWQICQmBXC7HkydPtNZ2deP/4YcfIJVK0aBBAxw4cAA//vgjAgMDNdbVdP2mT5+OzZs3w9/fHwqFAllZWUhJSanWORER1SYm50REREQAPvjgAzx48ACOjo4YPnw4unXrpjasetWqVdDX14enpye8vLxgYmJS6nPQ58+fD0NDQ9y7d6/C5TNmzEB0dDQsLCwwa9YsLFy4EHFxcWr7SaVStaHhleXo6AhfX194eHjA3t4e69atq3T7pZVXJP5nr6dEIlH7fsaMGbh06RKOHj2KgIAAbNu2DS1atNC4+Jym6/fee+9h1qxZGDVqFKysrCCVSrFp06Yyz4WIqC6RCIIgKL8JDw+Hq6urmPFoRUZGBgDA3Nxc5EiIiIioOrT52WTHoaMYP3RwmXUKCwuRkJCARo0alZqEJicnQ0dHR2vD2Z9VVFSExMRE2Nvba73tZyUlJcHCwgL6+vpabbc68Xfv3h1vvfUWpk2bBgAICgqCl5cXIiMjKzUPPi8vD3FxcXByctI4qoGIqK7i/1hERERE/9DV1YWDg0OZdZTzz2uCjo5OpRNbQRBKPA/9eba2tmq91La2tlWKrzxViV/Jx8cHO3fuhJmZGSIiIrBhwwZMnTq10gvUGRgYoEmTJlWKgYhITEzOiYiIiF5gMplMbZV5TR49elTnRxSuXLkSf/31F06ePImmTZti79698Pb2FjssIqJaw+SciIiI6AVmZmaGhIQEscOoNqlUiokTJ2LixIlih0JEJAouCEdEREREREQkMibnRERERERERCJjck5EREREREQkMibnRERERERERCJjck5EREREREQkMibnRERERERERCJjck5EREREREQkMibnRERERPRC2LNnj9ghEBHVGCbnRERERERERCJjck5EREREREQkMibnRERERERERCJjck5EREREREQkMibnRERERFRlWVlZOHPmDORyeal14uPjcf78+VqMiojoxcPknIiIiIhKNWvWLPTt27fU8vDwcPTp0wfR0dEAgJMnT2LLli1qdc6dO4dXX30VgiBoPb6dO3eiRYsWJV7r1q3T+rGIiGqSntgBEBEREVHd1b9/f7Rr167C9Y8cOYIbN25g8uTJNRjVv9LT0xEYGIj//e9/atvbtGlTK8cnItIWJudERERE9czGjRvRoUMHtGzZEgBw9uxZ6OjooGfPngCA27dvIyQkBOPGjUPDhg1hYGCgtv+1a9dw+PBh5Ofnw8bGRrU9KCgId+/exdOnT/Hbb78BAAYMGKAqT05Oxu7duxEbGwtfX1/4+Pho7ZxmzZqltbaIiMTA5JyIiIionvnpp58QEBCA9evXQxAETJ48GQ0aNMDjx48BAKtWrUJ6ejrGjRuHnTt3IjAwEEOGDAEAbN68GdOnT4dUKsWgQYOwadMmVbvh4eF48OABcnJysGvXLgBAq1atVOVubm5wcXGBgYEBVqxYgT179mDMmDFaOaeQkBDo6urCyckJhoaGWmmTiKg2cc45ERERUT0zcOBAHD9+HABw584dxMTEIDw8HHfv3gUAnDlzBv379y+xX2ZmJubOnYvJkycjISEBu3fvxokTJ1TlQ4YMwcSJE9G6dWscP34cx48fR4cOHVTlBw8exN27d3H9+nUMGzYMf/31l9bOycPDA82aNYORkRG+/fZbrbVLRFRbmJwTERER1TO9e/dGeHg44uPj8ddff2Hy5Mno378/9u/fj9jYWMTExODVV18tsd+DBw8gk8kwZcoUGBkZVfq4ymHzANC2bVtcu3atWucBAMOHD0dwcDCSkpIQHByM999/H0uXLsWxY8eq3TYRUW1ick5ERERUz3Tu3BlA8dzx7du3Y+zYsRg3bhy2bNmCgIAASKVSeHt7l9gvLS0NAODu7l7tGPT19avdBgA4ODjA3d0dNjY2cHd3x+rVqyGVSnH16lWttE9EVFuYnBMRERHVM8bGxujTpw/WrVuHR48eoW/fvhg6dCjCw8OxZs0aDBkyBDo6JT8mdunSBQBw7969UtvW19dHQUFBjcVenry8PMhkMhgbG4sWAxFRVXBBOCIiIqJ6aODAgVi6dCkmTZoEY2NjGBsbo3///jhx4gR+/fVXjftYWVmhc+fO+PTTT6Gjo4MGDRpgxYoVanW6d++Ob7/9FlevXoWlpSWsra1r9DymTJmC/v37o2PHjhAEAZ999hkAYNiwYTV6XCIibWNyTkRERFQP9erVCwDUVkt/4403cOLECY3zzZVWrFiBESNG4LXXXgMA+Pr6qpX37t0bw4YNU/WynzhxQmMvvDZNmTJF9bWdnR32798PT0/PGj0mEZG2SQRBEJTfhIeHw9XVVcx4tCIjIwMAYG5uLnIkREREVB3a/Gyy49BRjB86WCtt1XcFBQWIiooq87FlmZmZKCwshKWlpdaOu2fPHowdO7bEdrlcjtjYWBgYGMDJyQkSiURrxyQiqi3sOSciIiKiStHX10fTpk3LrGNmZlZL0RTPoS8vHiKiuo4LwhERERERERGJjMk5ERERERERkciYnBMRERERERGJjMk5ERERERERkci4IBwRERERvTD27NlT6X00rfBORFTXMDknIiIiohcCk2wieplxWDsRERERERGRyJicExEREREREYmMyTkRERERERGRyJicExEREREREYmMyTkRERERERGRyJicExERUb0wfuhgsUMgIiIqFZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISGZNzIiIiIiIiIpExOSciIiIiIiISmZ7YARARERHVhh2HjqJ7515ih0F1kLONkdghEBGx55yIiIiIiIhIbEzOiYiIiIiIiETG5JyIiIiIiIhIZEzOiYiIiIiIiETG5JyIiIiIiIhIZEzOiYiI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cRARERGppKenix0CERFRrZIIgiCIHQQRERERERFRfcY550REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiq1ZyHp4eUeG6Dx8+RHR0NABAoVAgLy+vOoeusJiYGNy/f7/G2n/w4IHqvGpSQUEBCgoKavw4L5P09HRcvnxZ7DCIiIiIiIjKVa3kPDknGUEpwSgUCsute+DAAVy9ehUAsHv3bvzf//1fdQ6tUXx8PP773/+isPDfeG7cuIH9+/dXqb0///wTFy9eLLPOgQMHcP369Sq1XxmrV6/G6tWrq9XGjRs3sH37di1FVPM0/Twr48mTJ/j999+1HBUREREREZH26VW3AVm+DEHJwXC1dIGxnnGF9hk4cCC6d+9e3UOXIJfLERYWBkEQtNJeWFhYnemtnjRpUrXPKz4+HkFBQVqKqOZp++dJRERERERUV6kl59fjAqrUiFwhR1ByMJpbNYO0gbTc+g8ePEBQUBBmzpyJ6OhorFu3Dl26dMHZs2cBAIMGDcKgQYMAAIIg4NixYzhx4gTy8vLQqVMnvPbaa7CxsSnR7s8//wwA+Pjjj6Gjo4Np06YBALKzs/Hzzz/jzp07sLGxwdixY9GqVSsAwKpVqxAWFgaFQgGpVIpRo0ahW7duuHjxIiIjIxEdHY27d+/C0dER77//vsbzefLkCb766ivExMSgefPmGD9+POzt7ZGZmYmVK1ciLS0NAGBnZ4dp06bBxcUFAHD48GGcOnUKOTk5MDMzw+uvv46OHTuWaP+jjz6CIAho164dxowZg9DQUPzxxx/44osvVHW+/PJLjBo1Ci1atMCdO3ewa9cupKenw8jICF27dkWXLl1w9OhRKBQKLFu2DACwfPlyGBgYqB2rtOstlUrx7bffwsPDA2PHjgUAXL9+HX/99RcWLlwIS0tLPHjwANu2bUN6ejo8PT0xePBgNGvWDAAQGBiIHTt2IDk5GVKpFP3790fv3r3xf//3f3j//ffh6OgIANixYwdMTEwwfPhwjT/P5s2bl/p+EAQBBw4cwOnTp5GXlwdzc/NS34NERERERER1idYWhCsUChGUEozknORy62ZkZCA+Ph4AkJubi/T0dAQHB2Py5Mno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PO6zi8xVRmJiIszMzEr0jAuCgIyMDBgaGpbba75ixQq4u7vj9ddfV22Ty+UoLCyEVFpynn9WVhYKCws1nlNWVhb09fXLvI6Vud7Pn1N6ejr09fVLXP+ioiKkpaXBzMxMbaV45bGUc/6fp+nnWVp8giAgOTkZZmZmlYqbiIiIiIhITC9Mcl5fffXVVwCKF5f79NNPVUO9iYiIiIiI6OXB5LyOu3DhAnJzc9GhQ4cqrU5PREREREREdR+TcyIiIiIiIiKRVXu1diIiIiIiIiKqHibnRERERERERCJjck5EREREREQkMibnRERERERERCJjck5EREREREQksmol55lfL9dSGDXr0qVLSE9PBwDk5eVBoVCIGxARERERERHRM6qVnOf+fRhpH8yEkCXTVjyVtmrVKkRFRZVZ548//sDTp08BAF988QX++OMPrcdx48YNbN++XevtiqUi15WIiIiIiIi0o9rD2gvu3ETaBzOhCAvRRjyVFhwcjMzMzArXnzlzJoYNG6b1OOLj4xEUFKT1dsVS2etKREREREREVaf37DeJvTpUqRFF2COkfTATFl98B/027TTW+e2336Crq4unT58iJiYGzZs3x/jx42Fvbw8AePDgAbZt24b09HR4enpi8ODBaNasGc6ePYvjx49jwYIFsLGxgUKhwPfffw93d3dkZGSo2jYyMkLPnj0xePDgMmM9fvw4nJ2d0b9/f5w9exa3bt2CiYkJ7ty5AxsbG4wdOxatWrUCUDwEfuvWrbh16xYMDAzQp08f9O/fHwYGBmptPn36FEePHoVCocCyZcsAAMuXL0dBQQE2btyIoKAg6Ovro2vXrhg7dix0dXU1xlaVazBy5EgkJiZi48aNiIqKQqNGjdC3b19069ZNdQ47d+7E7du3UVBQgCZNmmDGjBkICAhAfHw8pk6dCgBISkqCn58f/u///g979uzReF1Li4+IiIiIiIiqR2sLwglZWUibPxO5Rw9qLI+Pj8e1a9fg4+OD2bNnIzExEX///TcAIC4uDmvXrkWHDh2wbNky2NraYu3atRAEAT169ICOjg5Wr16NwsJCbNu2DUlJSRg4cCB69+4NAOjduzcmTpyINm3alBtnfHw80tLSAADp6ekICQmBgYEBZs2aBQcHB2zbtk1Vd+PGjXj8+DHeffddTJs2DadPn8aVK1dKtGltbQ0fHx9IpVJMnDgREydOhL6+PjZs2IDo6GhMnz4dw4YNw7lz53D06FGNcVX1GigUCqxcuRLGxsZYvHgxevfujT/++AMJCQkAgF9++QW3b9/GsGHD8N5778HAwADJyclIS0tDfHy86vgFBQVITU1FYWGhxutaVnxERERERERUPbW6Wnvfvn0xdOhQtGzZEn369MHDhw8BAGfPnoWJiQl8fHxQUFCAtm3bIi8vDxEREdDV1cX8+fORnJyMlStX4urVq5g/fz6MjIzwyiuvAABcXV3h7e2t6oWvDEdHR0ybNg2tWrXCsGHDkJ6eDplMhry8PNy5cwddu3aFiYkJTExM4OHhgWvXrpVow9DQEA4ODjAyMoK3tze8vb2Rl5eHkJAQjBgxAh07dkT//v3Rvn17nD9/XmMcVb0GgYGByM7ORu/evSEIAhwcHGBlZYWAgADk5ubi/v37GDp0KPr27QsvLy/MnTsXzZs3L/OaaLquZcVHRERERERE1aNXfpWKkZiYwOLL70sd1v48IyMj5OfnAwASExORl5eHTZs2qcptbW1Vc56tra0xevRo7N27FwMGDICjo6O2wlZjbGwMoHgouPLYly5dwtWrV1V1LCwsKtRWamoqgOIEV8nNzQ03btzQWL+q10DZQ75r1y7Vfrq6usjPz0dycjIAwMPDo0Ixl6W8+IiIiIiIiKjq1JJzu7MBldpZOUddz60ZzJZ9Br2m7lUKwsLCAo6Ojvjoo480lufm5uLvv/+GiYkJTp8+jT59+sDS0lJVXhNDq83NzQEAM2bMQNOmTcutL5FI1OIwMzMDUDwfXZlIP336FEZGRhr3r+o1sLCwgI6ODpYvXw49PfV7LTJZ8Sr6T548gZOTk1qZjo4OCgoKyjynZ8+nvPiIiIiIiIio6qo9rF3fpy0sV/9c5cQcADp06ICoqCicPn0aCoUCaWlpOHz4MKKjowEAP//8M4yMjLBy5UpYWVmp5l4DQKNGjRAYGIj8/Hyt9uKamprC0dERv//+OxISEqBQKBASEgJ/f3+N9V1cXJCSkoLU1FSkp6fD1NQUtra2+Pvvv5GQkIDQ0FAEBATAx8dHq9dA2Su+ceNGZGdnQy6X49q1a7h8+TKkUilsbW1x+PBhPH78GHl5efj7778RHR0NT09PPH36FE+fPkV8fDz279+vFs/z17W8+IiIiIiIiKjqqjWs3XDgEJgtW17h+hKJROPXXl5eGDNmDPbs2aManm1iYoI2bdrg+PHjCA4Oxueff44GDRpg7ty5+PTTT7Fnzx6MGzcOAwcOxNatW3HmzBm8+uqrmDBhQpnH1tHRKTWO57e99957+Omnn/Dpp5+qynr06KGxfXd3dzg6OqpWa1+zZg1mzZqFVatWqfZ3cXHBmDFjNO5fnWswb948/Prrr1iwYIHqHKdMmaI6h3Xr1uHbb78FUDydoFWrVvD09ISzszM+//xzAFCtuq48d03XtbT4iIiIiIiIqHokQh1ablsQBKSnp0NfXx+mpqYV3q+oqAiZmZkwNzfXmGxXV15eHrKysmBhYVHqY9CUsrKyoK+vr/a4tZSUFDRo0ABSqbTcY1X1GiiPrVAoNF4HuVyOgoIC1XB9pfT0dBgZGZV4PByg+bpWJz4iIiIiIiLSrE4l50RERERERET1Ua0+So2IiIiIiIiISmJyTkRERERERCQyJudEREREREREImNyTkRERERERCQyJudEREREREREImNyTkRERERERCQyJudEREREREREImNyTkRERERERCQyJudEREREREREImNyTkRERERERCQyPbEDoNIVFBQgOTkZKSkpyMvLUyszMDCAtbU1bGxsoK+vL1KEREREREREpA0SQRAEsYOgkvLz8xEWFgapVApLS0sYGBiolefl5SEtLQ1ZWVlwc3NDgwYNRIqUiIiIiIiIqovJeR0VGxuLwsJC2Nvbl1kvISEBEokEjo6OtRQZERERERERaVuJYe0KhQIZGRnIzs6GQqEQIyYCIJPJ4OrqWm49c3NzhIeHlxj2TkRE9KLR09ODiYkJzM3NoafHmXdERFS/qP3lUygUiIuLg6GhIaytrTmXWUT379+HoaFhufUMDQ2hUCjg5ORUC1ERERHVnIKCAsjlcsTFxaFRo0ZM0ImIqF5RW609IyMDhoaGMDc3Z2JOREREtUpfXx/m5uYwMjJCenq62OEQERHVKrXkPDs7G8bGxmLFQkRERAQjIyPI5XKxwyAiIqpVasm5QqFgjzkRERGJSl9fn+veEBFRvaNTfhUiIiIiIiIiqklcaaUOKyoqEjsEIiIiIiIiqgVMzuswJudERERERET1g1pyrqenh4KCAs47ryMkEonYIRAREdW6goICPkaNiIjqHbU55yYmJlwdlYiIiESVk5PDp8cQEVG9o5acm5ubIzc3F5mZmSgoKBArJiIiIqqHCgoKkJmZiZycHFhYWIgdDhERUa0qMay9UaNGSE9PR0pKCh9jIrLKDGuPiYmpwUiIiIhqnp6eHoyNjdGoUSMOaycionqnxF8+PT092NjYiBELPePBgwfIzc2FoaFhmfVyc3NhYGAAV1fXWoqMiIiIiIiItI3POa+jrKyskJmZCYlEUuYrMzMTlpaWYodLRERERERE1cDkvI6ysbFBVlYWEhISkJubW6I8NzcXCQkJyMrKgq2trQgREhERERERkbZIBEEQxA6CNMvPz0dSUhLS0tKQl5enVmZgYABLS0vY2tqiQYMGIkVIRERERERE2sDknIiIiIiIiEhkHNZOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQiY3JOREREREREJDIm50REREREREQi0xM7gPpky5YtkMvlCA8PFzuUGuPq6gpjY2NMnjy5QvVf1mtS2etA4lq5ciUyMjIQFBQkdih1kqenJ8zNzfHhhx9WeJ+X9Xdbib/jREREpG0SQRAEsYOoD7Zs2QJjY2P07dtX7FBq3KlTpyCXy8v90PqyX5OKXgcS18qVK2FiYoLXX39d7FDqtD///BPZ2dkVStBf9t9tJf6OExERkTZxWHstyc7Ofuk/qCr17dsX2dnZ5dZ72a9JRa8DiSsjI4OJeQW8/vrryMjIqFDdl/13W4m/40RERKRNTM5rSUREhNgh1KqKnG99uCb14RxfdBzKXnEVvVb16X1fn86ViIiIahaTc6I6qi7OOFEoFFppRy6X4/jx47hw4YLWjqmt2IiIiIiIxMDk/CUUGRmJ6dOna3wFBATgyZMnmD59OlJSUirddlxcHJ48eVIDUVdfRkaG2rm++eabWLJkCS5fvlzttqtzzSrL398fM2bMgLm5OSQSCVq0aIEFCxYgLi4OABAaGooVK1bUWjJ67tw5DB8+HA0bNoS+vj7+/PPParW3a9cu2NvbY+DAgRgzZozGOidPnkT37t0hkUigr6+PN954AwcPHixRLzo6GtOmTYObmxv09fUxb968asWmSVRUFN59912Nr5s3b2r9eNpy4MABfP/992KHoZHyd/Xu3btabVcQBFy7dk2rbRIRERHV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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"dollars1.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note now how there are two stack frames for `dollar_triangle`. The blue one (that was called with width=4) is active, meaning that as the instruction pointer (the red arrow on the left) runs over code, any reference to the variable `width` will find 4 in the active frame (in contrast to 5 in the inactive frame).\n", + "\n", + "The fact that the width=4 frame is currently active means we're currently drawing a triangle of size 4. However, the other frame (the one that was called with width=5) is waiting for it's turn to run again. We'll need to go back to that eventually. After we draw a triangle of size 4, we need to draw a `$$$$$` at the bottom to make it a triangle of size 5.\n", + "\n", + "Drawing a triangle of size 4 involves drawing a triangle of size 3, before completing the job by drawing `$$$$`. Thus, the width=4 frame will need to wait too (as will the other frames). Eventually, it looks like this, with five frames for the same function:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Urr6rE/dr18/AJXPvTs5OQGoHIFQE3mdIUOGqDWzfH117NgRiYmJkEqlignhNJH0ExE1JSbnRERERE946aWXsG7dOnTu3Bne3t7Yvn270mztM2fOxKRJk/DPf/4T06ZNw7Fjx3DhwgV89913dbYtT+D37t2LyZMn49atWxpbj3fIkCE4evQoZs6cifz8fHh7e6u1n6enJzIyMnD8+HF06tQJwcHB2L9/P6ZNm6bW/qamphg9ejTmzJmDK1euQCQS4Ztvvqmxfrdu3dCnTx/Mnj0bmzZtgru7O+Lj47F582YsXrwYXl5eah23Jnp6etVGNhARtXQc1k5ERET0hDfffBOOjo5444030Lt3b2RkZCiVv/zyy/jss8/wySefoHPnzli8eDGWLFmC119/vc62XVxc8MEHH+Af//gH3Nzc8M4776Bz584aiXvGjBnQ19dH586d0bNnTxQXFyt6wlWRl73yyivw9fXFuHHj4OHhgV27dsHDw6Navdra+OmnnzB+/HgcO3YM169fx8qVKwFAMSldVXp6ejh48CC8vb0xfPhw2NvbY8CAAbhz5061yeqIiFoLHUEQBPmb+Ph4ODs7azMejXj06BEA8Jc7ERHRU06Tn032HD+FqWNGq11fEAQkJibCwsKixueVi4uL8eDBA9jb26tMQmsjlUqRnp6Ojh07anwG8aysLIhEonrHlJqaivLycjg4ODQ6hq1bt+K1115DWVlZredXUlKC1NRUWFtbw9TUtF7HOHDgACZPntzYUImIWgQOayciIiJSQb70Vm2MjY0b3OstFourzdBek5UrV2Ljxo211nnw4IGiY6I+z4tX1b59+wbtBwDvv/8+YmJi4O7ujqysLGzatAkfffRRnTcejIyM0LFjxwYfl4joWcHknIiIiKiF+/e//41///vf2g6jVoMHD0Z6ejrCw8Nha2uLPXv21Ll8GxER/Q+TcyIiIiJqtFGjRmHUqFHaDoOI6KnFCeGIiIiIiIiItIzJOREREREREZGWcVg7ERERET21Dhw4UGcdzuhORE8DJudERERE9FRi0k1EzxIOayciIiIiIiLSMibnRERERERERFrG5JyIiIiIiIhIy5icExEREREREWkZk3MiIiIiIiIiLWNyTkRERK3C1DGjtR0CERFRjZicExEREREREWkZk3MiIiIiIiIiLWNyTkRERERERKRlTM6JiIiIiIiItIzJOREREREREZGWMTknIiIiIiIi0jIm50RERERERERaxuSciIiIiIiISMuYnBMRERERERFpGZNzIiIiIiIiIi1jck5ERERERESkZUzOiYiIiIiIiLSMyTkRERERERGRljE5JyIiIiIiItIyJudERETUKuw5fkrbIRAREdWIyTkRERERERGRljE5JyIiIiIiItIyJudEREREREREWsbknIiIiIiIiEjLmJwTERERERERaRmTcyIiIiIiIiItY3JOREREREREpGX62g6AiIiIqCWKjY1Ffn4+evbsqXb9qKgoAEC3bt3QsWPHepU/LR4/foz9+/cjICAA+vrN91HyWbl+REQ1Yc85ERERkQpBQUEIDAxUu35kZCR27dqFN954AydPnqx3eXOIjo7GuHHjGtXGvXv38NprryEjI0NDUamnJVw/IqKmxOSciIiIqAqpVFpreWlpKUpLS6ttHz9+PPbt24e+ffuq3K+u8qoKCws1UkfVPqGhoWrXVcXb2xsymQx2dnYNjq228uLiYpWv1b1+ZWVlKCoqqrUOEVFLxOSciIiICEBSUhK8vb0hkUjg4uKCixcvKpXn5ubCz88PRkZGMDIygp+fH3JzczV2/MTERMyfPx+Ojo4wNTXFpEmTqvVOOzo6Ytu2bXBxcYGpqSnee+89tdsPDAzEoEGDIJVKIZFIIJFIEB4ernb7CQkJiv0sLCxQUVFRr/jfeustLF68GMOGDYOpqSl69+6N2NhYRblUKsWMGTNgY2ODdu3awdHRESYmJigpKVHr/EpKSvDuu+/C0NAQIpEIs2bNUkruiYhaOibnRERERAC+/vpriEQi3L17F0FBQbh06ZJS+dKlSxEXF4ewsDBcvXoV0dHRWLZsmcaOL5FI4Ovri9jYWMTHx+P27dsICgpSqpOcnIwFCxYgMDAQt27dwvz589Vuf+7cuTh06BDEYjHi4uIQFxeHrl27qt1+x44dERcXh9OnT6scXVBX/AUFBfjpp5+wYsUK5ObmwtjYGAcPHlSUb9++HYmJiUhLS8Mnn3yC0tJSPH78GEZGRmqd3/r163Hy5Elcv34dMTExuHTpEoe/E9FThck5EREREYBDhw5h8eLFcHV1hZeXF5YsWaIok8lk2LJlCxYvXoznn38evXr1wrJly7B582aUl5dr5PiWlpbw9fWFsbExLC0t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4PTp041um4ioOTE5JyIiImpl+vTpA6Dy2fHdu3dj8uTJmDJlCnbs2IGwsDCIxWJ4enpW2y83NxcA4Orq2ugYDAwMGt0GANjZ2cHV1RVt27aFq6sr1q1bB7FYjMuXL2ukfSKi5sLknIiIiKiVEYlEGDp0KDZu3IiYmBgMGzYMY8aMQXx8PNavXw9fX1/o6lb/mNi3b18AwK1bt2ps28DAAGVlZU0We11KSkoglUohEom0FgMRUUNwQjgiIiKiVmjkyJFYsWIFpk+fDpFIBJFIBB8fH5w5cwY//fSTyn0sLS3Rp08ffPzxx9DV1YWhoSFWr16tVKd///748ssvcfnyZVhYWMDKyqpJz2PGjBnw8fFB7969IQgCPvnkEwDA2LFjm/S4RESaxuSciIiIqBUaPHgwACjNlv7qq6/izJkzKp83l1u9ejXGjx+Pl156CQDg5+enVD5kyBCMHTtW0ct+5swZlb3wmjRjxgzFaxsbGxw+fBju7u5NekwiIk3TEQRBkL+Jj4+Hs7OzNuPRiEePHgEAzMzMtBwJERERNYYmP5vsOX4KU8eM1khbrV1ZWRnu379f67Jl+fn5KC8vh4WFhcaOe+DAAUyePLna9sLCQqSkpMDIyAgODg7Q0dHR2DGJiJoLe86JiIiIqF4MDAzQqVOnWutIJJJmiqbyGfq64iEiauk4IRwRERERERGRljE5JyIiIiIiItIyJudEREREREREWsbknIiIiIiIiEjLOCEcERERET01Dhw4UO99VM3wTkTU0jA5JyIiIqKnApNsInqWcVg7ERERERERkZYxOSciIiIiIiLSMibnRERERERERFrG5JyIiIiIiIhIy5icExEREREREWkZk3MiIiJqFaaOGa3tEIiIiGrE5JyIiIiIiIhIy5icExEREREREWkZk3MiIiIiIiIiLWNyTkRERERERKRlTM6JiIiIiIiItIzJOREREREREZGWMTknIiIiIiIi0jIm50RERERERERaxuSciIiIiIiISMuYnBMRERERERFpGZNzIiIiIiIiIi1jck5ERERERESkZUzOiYiIiIiIiLSMyTkRERERERGRljE5JyIiolZhz/FT2g6BiIioRkzOiYiIiIiIiLSMyTkRERERERGRljE5JyIiIiIiItIyJudEREREREREWsbknIiIiIiIiEjLmJwTERERERERaRmTcyIi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c+YMfvrpJ5X7WFpaok+fPvj444+hq6sLQ0NDrF69WqlO//798eWXX+Ly5cuwsLCAlZVVk51Dp06d0KlTJ5XbX3jhhSY7LhFRU+CwdiIiIqJWaPDgwQCASZMmKba9+uqrAKDyeXO51atXIzY2Fi+99BKGDx+utJQaUPk8+9ixY9G3b1+4ubnh5s2bKnvhiYhImY4gCIL8TXx8PJydnbUZj0Y8evQIAGBmZqblSIiIiKgxNPnZZM/xU5g6ZrRG2mrtysrKcP/+fTg4OMDY2Fhlnfz8fJSXl8PCwkJjxz1w4AAmT56ssfaIiFoSDmsnIiIionoxMDBQOZy8KolE0kzREBE9GzjGiIiIiIiIiEjLmJwTERERERERaRmTcyIiIiIiIiItY3JOREREREREpGWcEI6IiIiInhoHDhyo9z6c4Z2IngZMzomIiIjoqcAkm4ieZRzWTkRERERERKRlTM6JiIiIiIiItIzJOREREREREZGWMTknIiIiIiIi0jIm50RERERERERaxuSciIiIWoWpY0ZrOwQiIqIaMTknIiIiIiIi0jIm50RERERERERaxuSciIiIiIiISMuYnBMRERERERFpGZNzIiIiIiIiIi1jck5ERERERESkZUzOiYiIiIiIiLSMyTkRERERERGRljE5JyIiIiIiItIyJudEREREREREWsbknIiIiIiIiEjLmJwTERERERERaRmTcyIiIiIiIiItY3JOREREREREpGVMzomIiKhV2HP8lLZDICIiqhGTcyIiIiIiIiItY3JOREREREREpGVMzomIiIiIiIi0jMk5ERERERERkZYxOSciIiIiIiLSMibnRERERERERFrG5JyIiIiIiIhIy/S1HQARERFRSxQbG4v8/Hz07NlT7fpRUVEAgG7duqFjx471Kn9aPH78GPv370dAQAD09Zvvo+Szcv2IiGrCnnMiIiIiFYKCghAYGKh2/cjISOzatQtvvPEGTp48We/y5hAdHY1x48Y1qo179+7htddeQ0ZGhoaiUk9LuH5ERE2JyTkRERFRFVKptNby0tJSlJaWVts+fvx47Nu3D3379lW5X13lVRUWFmqkjqp9QkND1a6rire3N2QyGezs7BocW23lxcXFKl+re/3KyspQVFRUax0iopaIyTkRERERgKSkJHh7e0MikcDFxQUXL15UKs/NzYWfnx+MjIxg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VdbJz89HeXk5LCwsNHbcAwcOYPLkydW2FxcX4+HDhzA0NIS9vX2T3gwgImoq7DknIiIionoxMDBAp06daq0jkUiaKRrA2NgYLi4uzXY8IqKmwNuKRERERERERFrG5JyIiIiIiIhIy5icExEREREREWkZk3MiIiIiIiIiLeOEcERERET01Dhw4EC991E1wzsRUUvD5JyIiIiIngpMsonoWcZh7URERERERERaxuSciIiIiIiISMuYnBMRERERERFpGZNzIiIiIiIiIi1jck5ERERERESkZUzOiYiIqFWYOma0tkMgIiKqEZNzIiIiIiIiIi1jck5ERERERESkZUzOiYiIiIiIiLSMyTkRERERERGRljE5JyIiIiIiItIyJudEREREREREWsbknIiIiIiIiEjLmJwTERERERERaRmTcyIiIiIiIiItY3JOREREREREpGX62g6gKaWnp2s7BCIiImqAdu3aaTsEIiKiZvVMJ+eWlpbaDoGIiIiIiIioThzWTkRERERERKRlTM6JiIhIqzIyMuDm5qbtMIiIiLTqmR7W/qTc3FykpKSgsLAQMplM2+EQERFpnL6+PkQiEezs7GBhYaHtcOqUkZGBgQMH4vfff2/yY+05fgpTx4xu8uMQERE1RKvpOc/JycHdu3eRn5/PxJyIiJ5ZMpkM+fn5uHv3LnJycrQdTq2qJuYDBw7UdjhERERa1WqS85SUFG2HQERE1Kxa8t++JxPz5ug5JyIiaslaTXJeVFSk7RCIiIiaVUv926cqMWfPORERtXatJjknIiIi7aspMb979662QyMiItKqVpOcm5iYaDsEIiKiZtUS//YxMSciIlKt1czWbmdnh+joaG2HQURE1Gzs7Oy0HUI18kT8yX+JiIhau1bTc25paQk3NzdIJBLo67eaexJERNTK6OvrQyKRwM3NDZaWltoOh4iIiNTUqrJUCwuLp2LNVyIiItK+2NhY5Ofno2fPnmrXj4qKAgB069YNHTt2rFf50+Lx48fYv38/AgICmrXD41m5fkRENWk1PedERERE9REUFITAwEC160dGRmLXrl144403cPLkyXqXN4fo6GiMGzeuUW3cu3cPr732GjIyMjQUlXpawvUjImpKz3TPuVQq1XYIRERE1ADaHJIvlUohFotrLC8tLQUAGBoaKm0fP348xo8fjwkTJqjcr67yqgoL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RERExMiUnIuIiIiIiIgYmZJzERERERERESNTci4iIiIiIiJiZErORURERERERIxMybmIiIiIiIiIkSk5FxERERERETEyJeciIiIiIiIiRqbkXERERERERMTIlJyLiIiIiIiIGJmScxEREREREREjU3IuIiIiIiIiYmRKzkVERERERESMTMm5iIiIiIiIiJEpORcRERERERExMiXnIiIiIiIiIkam5FxERERERETEyJSci4iIiIiIiBiZknMRERERERERI1NyLiIiIiIiImJkSs5FREREREREjEzJuYiIiIiIiIiRKTkXERERERERMTIl5yIiIiIiIiJGpuRcRERERERExMiUnIuIiIiIiIgYmZJzERERERERESNTci4iIiIiIiJiZErORURERERERIxMybmIiIiIiIiIkSk5FxERERERETEyJeciIiIiIiIiRqbkXERERERERMTIlJyLiIiIiIiIGJmScxEREREREREjU3IuIiIiIiIiYmRKzkVERERERESMTMm5iIiIiIiIiJEpORcRERERERExMiXnIiIiIiIiIkam5FxERERERETEyJSci4iIiIiIiBiZknMRERERERERI1NyLiIiIiIiImJkSs5FREREREREjEzJuYiIiIiIiIiR/R+lPc6Lv3CZewAAAABJRU5ErkJggg==\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"dollars2.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "At this point, we've hit the base case. It's no longer true that `width > 1`, so we won't make recursive calls. We'll just print our own line, then return, giving the function invocation that called us a chance to run again and wrap up its own work." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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NB+5jwtgb2ENQ73aiygKEFBYUqTWaxaXleJ+VirM2klgKTFvVMJNDav52YSI2rZdu3ahqKgIgYGBsLS0VFidnYgaVmfPueuRX+oqUkqWzOvb2sPmg5UwUnFBOC0tLZiamj7388tl2rWrvTJ7W6KjU52U18XAwABHjhzBiBEjsHjxYixevBhz5szBjh07mnzN3XP+C1PR0/OipSXo6uo2av94IyMjeHp6NulaUqkU06dPlw+b9/b2xpYtW5iYk9rpaGtDbNjwy6bGsBCbwqKe+dha0FL7NY30DeBi+3xOxSIiqklPTw8xMTGYMGFCg9u6ElFtah3WbtjVBX/75B/QMebCGs8za2trhIWF4ciRIzhz5kyz98buatVFTZGRKoqLixEXF4dVq1Zh7ty5HMpOREREKpk+fXqdi9YSUcPUlpy3GzAE9ks+argiKTV2LNCxY/Vc82eBrq4upk2bhmnTpmk6FGokKysrxMTEaDoMesb5DvJGYUmRpsMgIiIiajPqnHP+NHsa55wTERFRbc/KZxMiIqKGaHj3bCIiIiIiIiJick5ERERERESkYUzOiYiIiIiIiDRMrau1N5UgCEhKSkJGRgaKioogFothbW0Ne3t7TYdGRERERERE1OI0npxXVFTg119/RUFBAQBAR0cHOTk5yMrKYnJOREREREREzwWNJ+e//fYbCgoKYG9vj5deeglaWlooLCyUJ+tEREREREREzzqNJudSqRQ5OTlo164d+vXrJz/erl07tGvXToOREREREREREbUejS4IFxsbCwBwcXHRZBhEREREREREGqXRnnPZ0HU7OzukpaUhOTkZVVVVsLW1xd/+9jdNhkZERERERETUajSanBcVFQEAbty4gdTUVOjq6qKiogIpKSlISkrC4MGDNRkeERERERERUavQaHIuCAIAIDU1Fb169YKTkxNKSkrw22+/ISMjA/fv30enTp00GSIRERERERFRi9PonHNDQ0MAgJ6eHpycnOTH3N3dAQBpaWkai42IiIiIiIiotWg0OZetyG5hYaFwXCKRAADKy8tbPSYiIiJ6Nu0/dVbTIRAREdVJo8l5ly5dAACZmZkKxx88eAAAaN++favHRERERERERNTaNJqct2/fHiKRCFVVVQgKCkJ2djbu3buHiIgI6OjooFu3bpoMj4iIiIiIiKhVaDQ5BwAvLy8YGBggOzsbQUFBCA0NhZ6eHoYNGwYdHR1Nh0dERERERETU4jS6WjsA6OvrY8KECcjPz0dOTg4kEgksLCygra3x9wZERERERERErULjybmMqakpTE1NNR0GERERERERUatj9zQRERERERGRhjE5JyIiIiIiItKwNjOsnaitS0lJQVpaGoqKipSWi0QidOzYEXZ2dq0cGRERqUt+fj4uXbqEe/fuwdraGqNGjYKlpSUAIC4uDlFRUQCAHj16oHPnzo1q++bNmzA1NZVvJdtYzb2+TFlZGX799VckJSWhb9++6N27d5PaIcrOzkZaWhpcXFygp6en6XCInnrsOSdSQUpKCvLz8+Hm5oYhQ4Yo/ePm5ob8/HykpKSo7bo3b97EzZs31dYeERHV7d69e+jduzc+/fRTRERE4O9//ztee+01eXlkZCT27t2Lt956C2fOnGl0++vXr8exY8eaHF9zry/z4YcfYvHixYiIiMC1a9ea3A4933bu3IkPPvgAO3bsQF5entravXfvHo4cOSL/Pj09HdOmTUNhYaHarkHUVrHnnEgFaWlpcHNzg7GxcZ11jI2N4eDggMjISPaeExE9hT7++GN0794dR48eha5u9UekkpISefnEiRMxceJETJo0qd52ysrKAFTvSFOXwsJCtGvXrs7yoqIiiEQihWOqXr8hv/76K7788ssG21EWgyplJSUlMDQ0RHl5OXR0dGrtwFNeXo6KigoYGRk1KX7SvKqqKpw/fx7r1q2Dvb29yufJfjbqO56eno7ff/8dU6ZMAQC0b98ef//73xV+XqqqqlBaWlrnz1Bd1yFq69hzTmpXVVWl6RDUrqioqN7EHAAEQYCxsXGdw96V1Sciorbh8ePHOHToEJYsWSJPzAE06gN+Xl4efHx8YGBgAAMDA/j4+NTqUbx69SqcnZ0hFovh7OyMmJgYeVlSUhIWLlwIe3t7GBsbY8qUKcjMzGz+zf1l+fLlkEgkCA8Px+TJkyGRSPDvf/9boY69vT127twJJycnGBsb44MPPlApvj///BPOzs545ZVXYGRkhO3bt8PCwgJDhw6Vn19aWor3338f+vr6EIlEmDNnjsLLD3p6rF27FuXl5VixYgVWrlyJixcv4h//+Ie8/PDhw9i6dSsAYOvWrfjwww/h6+uLWbNm4R//+If8M1BMTAzefvttzJo1C9OmTcPZs2fx3Xff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ov9hck5EREREzTZmzBiMGTNG02EQET21uCAcERERERERkYYxOSciIiIiIiLSMA5rJyIiIqKn1uHDhxuswxXdiehpwOSciIiIiJ5KTLqJ6FnCYe1EREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiOi5MH3cWE2HQEREVCcm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiIiIiIg0jMk5ERERPRf2nzqr6RCIiIjqxOSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwXU0HQERERNQWxcXFoaCgAL1791a5flRUFACgR48e6Ny5c6PKnxaPHz/GoUOH4OfnB13d1vso+aw8PyKiurDnnIiIiEiJgIAA+Pv7q1w/MjISe/fuxVtvvYUzZ840urw1xMTEYMKECc1q4969e3jjjTeQmZmppqhU0xaeHxFRS2JyTkRERFSDVCqtt7ysrAxlZWW1jk+cOBEHDx5E//79lZ7XUHlNRUVFaqmj7Jzg4GCV6yrj6emJiooK2NjYNDm2+spLSkqUfq3q8ysvL0dxcXG9dYiI2iIm50REREQAkpOT4enpCYlEAicnJ1y5ckWhPC8vDz4+PjAwMICBgQF8fHyQl5entusnJSVh4cKFsLe3h7GxMaZMmVKrd9re3h47d+6Ek5MTjI2N8cEHH6jcvr+/P4YMGQKpVAqJRAKJRIKwsDCV209MTJSfZ2ZmhqqqqkbF/84772Dp0qUYMWIEjI2N0bdvX8TFxcnLpVIpZs2aBSsrK3To0AH29vYwMjJCaWmpSvdXWlqK999/H/r6+hCJRJgzZ45Cck9E1NYxOSciIiIC8M0330AkEiE6OhoBAQG4evWqQvny5csRHx+PkJAQ3LhxAzExMVixYoXari+RSODt7Y24uDgkJCTgzp07CAgIUKiTkpKCRYsWwd/fH+Hh4Vi4cKHK7c+fPx9Hjx6FWCxGfHw84uPj0b17d5Xb79y5M+Lj43Hu3Dmlowsair+wsBA//fQTVq1ahby8PBgaGuLIkSPy8l27diEpKQnp6en47LPPUFZWhsePH8PAwECl+9u4cSPOnDmDW7duITY2FlevXuXwdyJ6qjA5JyIiIgJw9OhRLF26FM7OzvDw8MCyZcvkZRUVFdi+fTuWLl2KF198EX369MGKFSuwbds2VFZWquX65ubm8Pb2hqGhIczNzTF69GgEBQXVqrdnzx5MnDgRHh4ecHZ2Vrl9kUgECwsLAIClpSUsLS2VLuhWV/taWlqwtLSElZVVk+P/5JNPMGrUKJiammLMmDEIDQ2Vl8XGxsLV1RUikQhubm4AAENDQ5Xvb8+ePejduzeSk5MRGRkJDw8P/PzzzyqfT0SkaVytnYiIiJ57ubm5SElJQY8ePeTHtLS05F9nZ2cDAHr16iU/JlvFPScnp86EtTGKi4vx4YcfYseOHTAxMUFZWRkGDRpUq16nTp2afa36NLV9VeKv+UzFYrHC0HhfX1+MHDkSlZWVCAoKwsqVK6GtrXo/UmJiIkxMTHDy5EkAgKmpqfxlBBHR04DJORERET33zM3N4ejoiKioKHlvcc1F39q3bw8ACAsLg6urq/xr2bnq8PXXX+PcuXO4c+cOOnXqBH9/f/zxxx9qabs1NDd+AwMDODg4wNXVFatWrULXrl0bdX0HBwf07NkTGzdubGzoRERtAoe1ExEREQEYM2YMNm3ahNTUVISGhiokebq6upg2bRo2bNiA6OhoREVFwd/fHzNmzFA6NLysrKzehcyUlRcXF8PGxgampqYIDAzEmjVr1L6gmZWVFaRSKWJiYlBUVIQHDx6ore3mxv/tt99CLBZDX18fx48fx3fffYfIyEildZU9v7lz52Lnzp0ICAhARUUFCgsLkZOT06x7IiJqTUzOiYiIiAAsXrwYERERsLW1xYQJEzBgwACFYdXr16+Hnp4eXF1d4ebmBmNj4zr3QV+yZAkMDQ0RHh6ucvm8efOQnJwMU1NTLFiwAMuWLUNaWprCeWKxWGFoeGPZ2trCx8cHLi4usLa2xubNmxvdfl3lqsRf83lqaWkpfD9v3jxcuXIFZ8+eRUhICPbu3Yvu3bsrXXxO2fN79913sWDBAkyePBnm5uYQi8XYsWNHvfdCRNSWaAmCIMi+SUhIgKOjoybjUYtHjx4BAExMTDQcCRERETWHOj+b7D91FtPHja23TmVlJTIyMtCxY8c6k9Ds7Gxoa2urbTh7TVVVVcjMzIS1tbXa264pKysLpqam0NPTU2u7zYl/4MCBePPNNzFnzhwAQFRUFNzc3JCUlNSoefClpaVIS0uDnZ2d0lENRERtFf/FIiIiIvqLjo4ObGxs6q0jm3/eErS1tRud2AqCUGs/9CdZWloq9FJbWlo2Kb6GNCV+GU9PTxw4cAASiQSJiYnYunUrZs+e3egF6gwMDNC5c+cmxUBEpElMzomIiIieYlKpVGGVeWViY2Pb/IjCdevW4cSJE7hw4QK6dOmCI0eOwN3dXdNhERG1GibnRERERE8xiUSCjIwMTYfRbGKxGL6+vvD19dV0KEREGsEF4YiIiIiIiIg0jMk5ERERERERkYYxOSciIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYk3MiIiIiIiIiDWNyTkRERERPhcOHD2s6BCKiFsPknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiIioyQoLCxEUFISioqI666Snp+O3335rxaiIiJ4+TM6JiIiIqE4LFizAiBEj6ixPSEjA8OHDkZycDAC4cOECdu/erVDn0qVLGDJkCARBUHt8Bw4cQPfu3Wv92bx5s9qvRUTUknQ1HQARERERtV1eXl7o3bu3yvXPnDmDmzdvws/PrwWj+p/8/HxERkbiP//5j8LxF154oVWuT0SkLkzOiYiIiJ4z27dvR58+feDh4QEACA4Ohra2NgYPHgwACA0NRUxMDKZNm4YOHTrAwMBA4fzr16/j9OnTKCsrQ/v27eXHo6KiEBYWhocPH2Lbtm0AgFGjRsnLs7OzcejQIaSmpsLHxweenp5qu6cFCxaorS0iIk1gck5ERET0nNmyZQtCQkLw/fffQxAE+Pn5QV9fH/Hx8QCA9evXIz8/H9OmTcOBAwcQGRkJb29vAMDOnTsxd+5ciMVijBkzBjt27JC3m5CQgIiICBQXF+PgwYMAgB49esjLnZyc4ODgAAMDA6xduxaHDx/GlClT1HJPMTEx0NHRgZ2dHQwNDdXSJhFRa+KccyIiIqLnzOjRoxEYGAgAuH37NlJSUpCQkICwsDAAQFBQELy8vGqdV1BQgEWLFsHPzw8ZGRk4dOgQzp8/Ly/39vaGr68vevbsicDAQAQGBqJPnz7y8pMnTyIsLAw3btzA+PHjceLECbXdk4uLC7p27QojIyN89dVXamuXiKi1MDknIiIies4MGzYMCQkJSE9Px4kTJ+Dn5wcvLy8cO3YMqampSElJwZAhQ2qdFxERAalUilmzZsHIyKjR15UNmweAXr164fr16826DwCYMGECoqOjkZWVhejoaLz33ntYtWoVzp071+y2iYhaE5NzIiIioudMv379AFTPHd+3bx+mTp2KadOmYffu3QgJCYFYLIa7u3ut8/Ly8gAAzs7OzY5BT0+v2W0AgI2NDZydndG+fXs4Oztjw4YNEIvFuHbtmlraJyJqLUzOiYiIiJ4zIpEIw4cPx+bNmxEbG4sRI0Zg3LhxSEhIwMaNG+Ht7Q1t7dofE/v37w8ACA8Pr7NtPT09lJeXt1jsDSktLYVUKoVIJNJYDERETcEF4YiIiIieQ6NHj8aqVaswc+ZMiEQiiEQieHl54fz58/jpp5+UnmNubo5+/frh008/hba2NvT19bF27VqFOgMHDsRXX32Fa9euwczMDBYWFi16H7NmzYKXlxf69u0LQRDw2WefAQDGjx/fotclIlI3JudEREREz6GhQ4cCgMJq6a+//jrOnz+vdL65zNq1azFx4kS88sorAAAfHx+F8mHDhmH8+PHyXvbz588r7YVXp1mzZsm/trKywrFjx+Dq6tqi1yQiUjctQRAE2TcJCQlwdHTUZDxq8ejRIwCAiYmJhiMhIiKi5lDnZ5P9p85i+rixamnreVdeXo779+/Xu21ZQUEBKisrYWZmprbrHj58GFOnTq11vKioCKmpqTAwMICdnR20tLTUdk0iotbCnnMiIiIiahQ9PT106dKl3joSiaSVoqmeQ99QPEREbR0XhCMiIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYF4QjIiIioqfG4cOHG32OshXeiYjaGibnRERERPRUYJJNRM8yDmsnIiIiIiIi0jAm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERETPhenjxmo6BCIiojoxOSciIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYk3MiIiIiIiIiDWNyTkRERERERKRhTM6JiIiIiIiINIzJOREREREREZGGMTknIiIiIiIi0jAm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiI6Lmw/9RZTYdARERUJybnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYk3MiIiIiIiIiDWNyTkRERERERKRhTM6JiIiIiIiINIzJOREREREREZGG6Wo6ACIiIqK2KC4uDgUFBejdu7fK9aOiogAAPXr0QOfOnRtV/rR4/PgxDh06BD8/P+jqtt5HyWfl+RER1YU950RERERKBAQEwN/fX+X6kZGR2Lt3L9566y2cOXOm0eWtISYmBhMmTGhWG/fu3cMbb7yBzMxMNUWlmrbw/IiIWhKTcyIiIqIapFJpveVlZWUoKyurdXzixIk4ePAg+vfvr/S8hsprKioqUksdZecEBwerXFcZT09PVFRUwMbGpsmx1VdeUlKi9GtVn195eTmKi4vrrUNE1BYxOSciIiICkJycDE9PT0gkEjg5OeHKlSsK5Xl5efDx8YGBgQEMDAzg4+ODvLw8tV0/KSkJCxcuhL29PYyNjTFlypRavdP29vbYuXMnnJycYGxsjA8++EDl9v39/TFkyBBIpVJIJBJIJBKEhYWp3H5iYqL8PDMzM1RVVTUq/nfeeQdLly7FiBEjYGxsjL59+yIuLk5eLpVKMWvWLFhZWaFDhw6wt7eHkZERSktLVbq/0tJSvP/++9DX14dIJMKcOXMUknsioraOyTkRERERgG+++QYikQjR0dEICAjA1atXFcqXL1+O+Ph4hISE4MaNG4iJicGKFSvUdn2JRAJvb2/ExcUhISEBd+7cQUBAgEKdlJQULFq0CP7+/ggPD8fChQtVbn/+/Pk4evQoxGIx4uPjER8fj+7du6vcfufOnREfH49z584pHV3QUPyFhYX46aefsGrVKuTl5cHQ0BBHjhyRl+/atQtJSUlIT0/HZ599hrKyMjx+/BgGBgYq3d/GjRtx5swZ3Lp1C7Gxsbh69SqHvxPRU4XJORERERGAo0ePYunSpXB2doaHhweWLVsmL6uoqMD27duxdOlSvPjii+jTpw9WrFiBbdu2obKyUi3XNzc3h7e3NwwNDWFubo7Ro0cjKCioVr09e/Zg4sSJ8PDwgLOzs8rti0QiWFhYAAAsLS1haWmpdEG3utrX0tKCpaUlrKysmhz/J598glGjRsHU1BRjxoxBaGiovCw2Nhaurq4QiURwc3MDABgaGqp8f3v27EHv3r2RnJyMyMhIeHh44Oeff1b5fCIiTeNq7URERPTcy83NRUpKCnr06CE/pqWlJf86OzsbANCrVy/5Mdkq7jk5OXUmrI1RXFyMDz/8EDt27ICJiQnKysowaNCgWvU6derU7GvVp6ntqxJ/zWcqFosVhsb7+vpi5MiRqKysRFBQEFauXAltbdX7kRITE2FiYoKTJ08CAExNTeUvI4iIngZMzomIiOi5Z25uDkdHR0RFRcl7i2su+ta+fXsAQFhYGFxdXeVfy85Vh6+//hrnzp3DnTt30KlTJ/j7++OPP/5QS9utobnxGxgYwMHBAa6urli1ahW6du3aqOs7ODigZ8+e2LhxY2NDJyJqEzisnYiIiAjAmDFjsGnTJqSmpiI0NFQhydPV1cW0adOwYcMGREdHIyoqCv7+/pgxY4bSoeFlZWX1LmSmrLy4uBg2NjYwNTVFYGAg1qxZo/YFzaysrCCVShETE4OioiI8ePBAbW03N/5vv/0WYrEY+vr6OH78OL777jtERkYqravs+c2dOxc7d+5EQEAAKioqUFhYiJycnGbdExFRa2JyTkRERARg8eLFiIiIgK2tLSZMmIABAwYoDKtev3499PT04OrqCjc3NxgbG9e5D/qSJUtgaGiI8PBwlcvnzZuH5ORkmJqaYsGCBVi2bBnS0tIUzhOLxQpDwxvL1tYWPj4+cHFxgbW1NTZv3tzo9usqVyX+ms9TS0tL4ft58+bhypUrOHv2LEJCQrB37150795d6eJzyp7fu+++iwULFmDy5MkwNzeHWCzGjh076r0XIqK2REsQBEH2TUJCAhwdHTUZj1o8evQIAGBiYqLhSIiIiKg51PnZZP+ps5g+bmy9dSorK5GRkYGOHTvWmYRmZ2dDW1tbbcPZa6qqqkJmZiasra3V3nZNWVlZMDU1hZ6enlrbbU78AwcOxJtvvok5c+YAAKKiouDm5oakpKRGzYMvLS1FWloa7OzslI5qICJqq/gvFhEREdFfdHR0YGNjU28d2fzzlqCtrd3oxFYQhFr7oT/J0tJSoZfa0tKySfE1pCnxy3h6euLAgQOQSCRITEzE1q1bMXv27EYvUGdgYIDOnTs3KQYiIk1ick5ERET0FJNKpQqrzCsTGxvb5kcUrlu3DidOnMCFCxfQpUsXHDlyBO7u7poOi4io1TA5JyIiInqKSSQSZGRkaDqMZhOLxfD19YWvr6+mQyEi0gguCEdERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiJ6Khw+fFjTIRARtRgm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERETVZYWIigoCAUFRXVWSc9PR2//fZbK0ZFRPT0YXJORERERHVasGABRowYUWd5QkIChg8fjuTkZADAhQsXsHv3boU6ly5dwpAhQyAIQovGGhoaCk9PT+zZs6dFr0NE1BJ0NR0AEREREbVdXl5e6N27t8r1z5w5g5s3b8LPz68Fo6otJSUFY8aMQWZmJnJyclr12kRE6sDknIiIiOg5s337dvTp0wceHh4AgODgYGhra2Pw4MEAqnugY2JiMG3aNHTo0AEGBgYK51+/fh2nT59GWVkZ2rdvLz8eFRWFsLAwPHz4ENu2bQMAjBo1Sl6enZ2NQ4cOITU1FT4+PvD09FTL/UilUnh7e2Ps2LE4evSoWtokImptHNZORERE9JzZsmUL/vOf/wAABEGAn58f5s6dKy9fv3499u3bBwA4cOAA/P395WU7d+5Ev3798O233yIhIQH//ve/5WUJCQmIiIhAVlYWDh48iIMHDyI9PV1e7uTkhK1bt+L8+fPo2bMnjhw50ux7qaiowPTp02Fubo4ffvih2e0REWkKk3MiIiKi58zo0aMRGBgIALh9+zZSUlKQkJCAsLAwAEBQUBC8vLxqnVdQUIBFixbBz88PGRkZOHToEM6fPy8v9/b2hq+vL3r27InAwEAEBgaiT58+8vKTJ08iLCwMN27cwPjx43HixIlm38uSJUsQFxeHn3/+uVYPPxHR04TJOREREdFzZtiwYUhISEB6ejpOnDgBPz8/eHl54dixY0hNTUVKSgqGDBlS67yIiAhIpVLMmjULRkZGjb6ubNg8APTq1QvXr19v1n3s3LkT//3vf3H69GmYm5s3qy0iIk1jck5ERET0nOnXrx+A6rnj+/btw9SpUzFt2jTs3r0bISEhEIvFcHd3r3VeXl4eAMDZ2bnZMejp6TW7jaioKEilUvTq1QsSiQQSiQRSqRSLFy9W23x2IqLWwgXhiIiIiJ4zIpEIw4cPx+bNmxEbG4sRI0agsLAQ8+bNw8aNG+Ht7Q1t7dp9OP379wcAhIeHw97eXmnbenp6KC8vb9H4Zd566y14e3srHBs3bhxmz56NmTNntkoMRETqwuSciIiI6Dk0evRorFq1CjNnzoRIJIJIJIKXlxfOnz+Pn376Sek55ubm6NevHz799FNoa2tDX18fa9euVagzcOBAfPXVV7h27RrMzMxgYWHRYvfQpUsXdOnSRenxl156qcWuS0TUEjisnYiIiOg5NHToUADAlClT5Mdef/11AFA631xm7dq1iIuLwyuvvIKRI0cqbKUGVM9nHz9+PPr37w8XFxfcvn1baS88EREp0hIEQZB9k5CQAEdHR03GoxaPHj0CAJiYmGg4EiIiImoOdX422X/qLKaPG6uWtp535eXluH//Puzs7GBoaKi0TkFBASorK2FmZqa26x4+fBhTp05VW3tERG0Jh7UTERERUaPo6ekpHU5ek0QiaaVoiIieDRxjRERERERERKRhTM6JiIiIiIiINIzJOREREREREZGGMTknIiIiIiIi0jAuCEdERERET43Dhw83+hyu8E5ETwMm50RERET0VGCSTUTPMg5rJyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREz4Xp48ZqOgQiIqI6MTknIiIiIiIi0jAm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiOi5sP/UWU2HQEREVCcm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhulqOgAiIiKitiguLg4FBQXo3bu3yvWjoqIAAD169EDnzp0bVf60ePz4MQ4dOgQ/Pz/o6rbeR8ln5fkREdWFPedERERESgQEBMDf31/l+pGRkdi7dy/eeustnDlzptHlrSEmJgYTJkxoVhv37t3DG2+8gczMTDVFpZq28PyIiFoSk3MiIiKiGqRSab3lZWVlKCsrq3V84sSJOHjwIPr376/0vIbKayoqKlJLHWXnBAcHq1xXGU9PT1RUVMDGxqbJsdVXXlJSovRrVZ9feXk5iouL661DRNQWMTknIiIiApCcnAxPT09IJBI4OTnhypUrCuV5eXnw8fGBgYEBDAwM4OPjg7y8PLVdPykpCQsXLoS9vT2MjY0xZcqUWr3T9vb22LlzJ5ycnGBsbIwPPvhA5fb9/f0xZMgQSKVSSCQSSCQShIWFqdx+YmKi/DwzMzNUVVU1Kv533nkHS5cuxYgRI2BsbIy+ffsiLi5OXi6VSjFr1ixYWVmhQ4cOsLe3h5GREUpLS1W6v9LSUrz//vvQ19eHSCTCnDlzFJJ7IqK2jsk5EREREYBvvvkGIpEI0dHRCAgIwNWrVxXKly9fjvj4eISEhODGjRuIiYnBihUr1HZ9iUQCb29vxMXFISEhAXfu3EFAQIBCnZSUFCxatAj+/v4IDw/HwoULVW5//vz5OHr0KMRiMeLj4xEfH4/u3bur3H7nzp0RHx+Pc+fOKR1d0FD8hYWF+Omnn7Bq1Srk5eXB0NAQR44ckZfv2rULSUlJSE9Px2effYaysjI8fvwYBgYGKt3fxo0bcebMGdy6dQuxsbG4evUqh78T0VOFyTkRERERgKNHj2Lp0qVwdnaGh4cHli1bJi+rqKjA9u3bsXTpUrz44ovo06cPVqxYgW3btqGyslIt1zc3N4e3tzcMDQ1hbm6O0aNHIygoqFa9PXv2YOLEifDw8ICzs7PK7YtEIlhYWAAALC0tYWlpqXRBt7ra19LSgqWlJaysrJoc/yeffIJRo0bB1NQUY8aMQWhoqLwsNjYWrq6uEIlEcHNzAwAYGhqqfH979uxB7969kZycjMjISHh4eODnn39W+XwiIk3jau1ERET03MvNzUVKSgp69OghP6alpSX/Ojs7GwDQq1cv+THZKu45OTl1JqyNUVxcjA8//BA7duyAiYkJysrKMGjQoFr1OnXq1Oxr1aep7asSf81nKhaLFYbG+/r6YuTIkaisrERQUBBWrlwJbW3V+5ESExNhYmKCkydPAgBMTU3lLyOIiJ4GTM6JiIjouWdubg5HR0dERUXJe4trLvrWvn17AEBYWBhcXV3lX8vOVYevv/4a586dw507d9CpUyf4+/vjjz/+UEvbraG58RsYGMDBwQGurq5YtWoVunbt2qjrOzg4oGfPnti4cWNjQyciahM4rJ2IiIgIwJgxY7Bp0yakpqYiNDRUIcnT1dXFtGnTsGHDBkRHRyMqKgr+/v6YMWOG0qHhZWVl9S5kpqy8uLgYNjY2MDU1RWBgINasWaP2Bc2srKwglUoRExODoqIiPHjwQG1tNzf+b7/9FmKxGPr6+jh+/Di+++47REZGKq2r7PnNnTsXO3fuREBAACoqKlBYWIicnJxm3RMRUWtick5EREQEYPHixYiIiICtrS0mTJiAAQMGKAyrXr9+PfT09ODq6go3NzcYGxvXuQ/6kiVLYGhoiPDwcJXL582bh+TkZJiammLBggVYtmwZ0tLSFM4Ti8UKQ8Mby9bWFj4+PnBxcYG1tTU2b97c6PbrKlcl/prPU0tLS+H7efPm4cqVKzh79ixCQkKwd+9edO/eXenic8qe37vvvosFCxZg8uTJMDc3h1gsxo4dO+q9FyKitkRLEARB9k1CQgIcHR01GY9aPHr0CABgYmKi4UiIiIioOdT52WT/qbOYPm5svXUqKyuRkZGBjh071pmEZmdnQ1tbW23D2WuqqqpCZmYmrK2t1d52TVlZWTA1NYWenp5a221O/AMHDsSbb76JOXPmAACioqLg5uaGpKSkRs2DLy0tRVpaGuzs7JSOaiAiaqv4LxYRERHRX3R0dGBjY1NvHdn885agra3d6MRWEIRa+6E/ydLSUqGX2tLSsknxNaQp8ct4enriwIEDkEgkSExMxNatWzF79uxGL1BnYGCAzp07NykGIiJNYnJORERE9BSTSqUKq8wrExsb2+ZHFK5btw4nTpzAhQsX0KVLFxw5cgTu7u6aDouIqNUwOSciIiJ6ikkkEmRkZGg6jGYTi8Xw9fWFr6+vpkMhItIILghHREREREREpGFMzomIiIiIiIg0jMk5ERERERERkYYxOSciIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYk3MiIiIieiocPnxY0yEQEbUYJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JORERERE1WWFiIoKAgFBUV1VknPT0d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f/01kZGRpKWlceLECVasWJHt8VWqVOHatWtcv36d6OhonJycKFeuHCEhIURGRnLq1Cn27t1LQEBAgd6DzF7x+fPnk5CQQGJiIrt372bHjh04OztTrlw5Vq9ezZkzZ0hOTiYkJITz58/j7+9PeHg44eHhREREsHz58izx/PO+3ik+ERERERERuXf5GtZu37kbpd5+L8/H37oIyK3f16pVi8cff5ylS5eah2eXLFmSBg0asH79eo4fP8748eOxs7NjxIgRjB07lqVLl/LUU0/RuXNnvv32WzZt2kSbNm14+umnc722lZVVjnH887UXX3yRzz//nLFjx5rLAgMDs62/Zs2aeHl5mVdrnzlzJkOHDiU4ONh8fpUqVbKsiHqr/NyDl19+mS+//JLXXnvN3Mb/+7//M7fh008/ZerUqUDGdIJ69erh7++Pj48P48ePBzCvup7Z9uzua07xiYiIiIiISP4YTMVouW2TyUR0dDS2trY4OTnl+Tyj0UhsbCwuLi7ZJtv5lZycTHx8PKVLl85xG7RM8fHx2NraZtlu7dq1a9jZ2eHs7HzHa93rPci8dlpaWrb3ITExkdTUVPNw/UzR0dE4ODhku/d7dvc1P/GJiIhY0uJVa+n7aO5brkrxlrnd69164oknCjgSEZGCV6yScxEREZHCouRcRESKsyLdSk1EREREREREbqfkXERERERERMTClJyLiIiIiIiIWJiScxERERERERELU3IuIiIiIiIiYmFarV1ERERERETEwtRzLiIiIiIiImJhSs5FRERERERELEzJuYiIiIiIiIiFKTkXERERERERsTAbSwcgIiIZUlNTuXr1KteuXSM5OTlLWYkSJShbtixubm7Y2tpaKEIRERERKSxarV1EpBhISUnh9OnTODs74+rqSokSJbKUJycnc+PGDeLj46lWrRp2dnYWilRERERECoOScxGRYuDSpUukp6dTvnz5XI+LjIzEYDDg5eVVRJGJiIiISFG4bVh7WloaMTExJCQkkJaWZomYREQeOHFxcVStWvWOx7m4uBAaGnrbsHeR+4GNjQ0lS5bExcUFGxvNvBMRkQdLlv/50tLSuHz5Mvb29pQtW1bzGkVEisjhw4ext7e/43H29vakpaXh7e1dBFGJFK3U1FQSExO5fPkynp6eStBFROSBkmW19piYGOzt7XFxcVFiLiIiIkXK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VZYOIUf/5sXqROTBoeRcRERERPJFya+ISP5pWLuIiIiIiIiIhSk5FxEREREREbEwJeciIiIiIiIiFqbkXERERERERMTClJyLiIiIiIiIWJjBZDKZLB2EiIiIiIiIyINMPeciIiIiIiIiFqbkXERERERERMTClJyLiIiIiIiIWJiScxERERERERELU3IuIiIiIiIiYmFKzkVEREREREQsTMm5iIiIiIiIiIUpORcRERERERGxMCXnIiIiIiIiIham5FxERERERETEwpSci4iIiIiIiFiYknMRERERERERC1NyLiIiIiIiImJhSs5FRERERERELEzJuYiIiIiIiIiFKTkXERERERERsTAl5yIiIiIiIiIWpuRcRERERERExMKUnIuIiIiIiIhYmJJzEREREREREQtTci4iIiIiIiJiYUrORURERERERCxMybmIiIiIiIiIhSk5FxEREREREbEwJeciIiIiIiIiFqbkXERERERERMTClJyLiIiIiIiIWJiScxERERERERELU3IuIiIiIiIiYmFKzkVEREREREQsTMm5iIiIiIiIiIUpORcRERERERGxMCXnIiIiIiIiIhb2/zqpBXoyH3z/AAAAAElFTkSuQmCC\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"dollars3.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Above, we see the invocation with width=1 return; that frame will go away, and the width=2 frame will become active again, as seen below:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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U7m+IAiIjY2FmZlZpc8r5+fn4+HDh7CxsVGahFZFKpUiOTkZrVq1UvsK4mlpaRCJRDWOKTExESUlJbC1ta1zDJs3b8abb76JoqKiKq+voKAAiYmJsLCwgLGxcY362LdvH8aNG1fXUImIGgVOayciIiJSQrb1VlUMDQ1rPeotFosrrNBemWXLlmHdunVV1nn48KF8YKImz4uX16JFi1qdBwBLly5FREQEXFxckJaWhg0bNuCTTz6p9oMHAwMDtGrVqtb9EhE9L5icExERETVyX3/9Nb7++mtNh1Glfv36ITk5GUFBQbCyssKuXbuq3b6NiIj+w+SciIiIiOps6NChGDp0qKbDICJ6ZnFBOCIiIiIiIiINY3JOREREREREpGGc1k5EREREz6x9+/ZVW4cruhPRs4DJORERERE9k5h0E9HzhNPaiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERHRC2HC8GGaDoGIiKhSTM6JiIiIiIiINIzJOREREREREZGGMTknIiIiIiIi0jAm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiInoh7Dp6QtMhEBERVYrJOREREREREZGGMTknIiIiIiIi0jAm50REREREREQaxuSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYbqaDoCIiIioMYqMjER2djY6d+6scv3Q0FAAQPv27dGqVasalT8rnjx5gr1792Ly5MnQ1W24t5LPy/0jIqoMR86JiIiIlPDz84Ovr6/K9UNCQrBjxw68/fbbOH78eI3LG0J4eDhGjhxZpzbu37+PN998EykpKWqKSjWN4f4REdUnJudERERE5Uil0irLCwsLUVhYWOH4qFGjsGfPHvTo0UPpedWVl5ebm6uWOsrOCQgIULmuMh4eHiguLoa1tXWtY6uqPD8/X+n3qt6/oqIi5OXlVVmHiKgxYnJOREREBCAuLg4eHh6QSCRwdHTEpUuXFMozMzPh7e0NAwMDGBgYwNvbG5mZmWrrPzY2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Cy0tLbX1SUTUUDhyTkREREQ1oqenh9atW1dZRyKRNFA0Zc/QVxcPEVFjxwXhiIiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsYF4YiIiIjombFv374an6NshXciosaGyTkRERERPROYZBPR84zT2omIiIiIiIg0jMk5ERERERERkYYxOSciIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExER0QthwvBhmg6BiIioUkzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiIiIiIg0jMk5ERERERERkYYxOSciIiIiIiLSMCbnRERERERERBrG5JyIiIiIiIhIw5icExEREREREWkYk3MiIiJ6Iew6ekLTIRAREVWKyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGG6mg6AiIiIqDGKjIxEdnY2OnfurHL90NBQAED79u3RqlWrGpU/K548eYK9e/di8uTJ0NVtuLeSz8v9IyKqDEfOiYiIiJTw8/ODr6+vyvVDQkKwY8cOvP322zh+/HiNyxtCeHg4Ro4cWac27t+/jzfffBMpKSlqiko1jeH+ERHVJybnREREROVIpdIqywsLC1FYWFjh+KhRo7Bnzx706NFD6XnVlZeXm5urljrKzgkICFC5rjIeHh4oLi6GtbV1rWOrqjw/P1/p96rev6KiIuTl5VVZh4ioMWJyTkRERAQgLi4OHh4ekEgkcHR0xKVLlxTKMzMz4e3tDQMDAxgYGMDb2xuZmZlq6z82NhazZ8+GnZ0djI2NMXbs2Aqj03Z2dtiyZQscHR1hbGyMDz/8UOX2fX190bdvX0ilUkgkEkgkEgQFBancfkxMjPw8MzMzlJaW1ij+d999F/Pnz8fAgQNhbGyMrl27IjIyUl4ulUoxZcoUWFpaonnz5rCzs4ORkREKCgpUur6CggJ88MEH0NfXh0gkwrRp0xSSeyKixo7JORERERGAH374ASKRCGFhYfDz88Ply5cVyhcuXIioqCgEBgbi2rVrCA8Px6JFi9TWv0Qi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888/x8GDB9G5c2f06tULjx49UlvbREQNgck5ERER0Qume/fuAMqeHd+5cyfGjRuH8ePHY9u2bQgMDIRYLIabm1uF8zIzMwEATk5OdY6h/HR0dejYsSNGjx6NvXv3QiqVcsV2InrmMDknIiIiesGIRCIMGDAA69atQ0REBAYOHIjhw4cjOjoaa9asgZeXF7S1K75N7NGjBwDgzp07lbatp6eHoqKieou9OrLt2oqLizUWAxFRbTA5JyIiInoBDRkyBKdOncKkSZMgEolgaWkJT09PnDlzBoMGDVJ6jrm5Obp3745PP/0UJ06cwN9//4158+Yp1OnVqxeuXLmCK1euIDw8HGlpafV6Hb169cLu3bsRGRmJ4OBgTJ06FYDiKvFERM8CrpRBRERE9ALq168fACislv7GG2/g1KlTSp83l1mxYgVGjRqFV199FQDg7e2tUN6/f3+MGDFCPsp+6tQppaPw6iISiRT2Ybe0tMTBgwfh6upab30SEdUHLUE29wdl2188D/tBPn78GABgYmKi4UiIiIioLtT53mTX0ROYMHyYWtp60RUVFeHBgwewtbWFoaGh0jrZ2dkoKSmBmZmZ2vrdt28fxo0bV+F4fn4+Hj16BH19fdjY2NTrhwFERPWFI+dEREREVCN6enpo3bp1lXUkEkkDRQMYGhrC0dGxwfojIqoP/FiRiIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYVwQjoiIiIieGfv27avxOcpWeCciamyYnBMRERHRM4FJNhE9zzitnYiIiIiIiEjDmJwTERERERERaRiTcyIiIiIiIiINY3JOREREREREpGFMzomIiIiIiIg0jMk5ERERvRAmDB+m6RCIiIgqxeSciIiIiIiISMOYnBMRERERERFpGJNzIiIiIiIiIg1jck5ERERERESkYUzOiYiIiIiIiDSMyTkRERERERGRhjE5JyIiIiIiItIwJudEREREREREGsbknIiIiIiIiEjDmJwTERERERERaZiupgOoT8nJyZoOgYiIiGqhefPmmg6BiIioQT3Xybm5ubmmQyAiIiIiIiKqFqe1ExEREREREWkYk3MiIiLSqJSUFDg7O2s6DCIiIo16rqe1Py0zMxMJCQnIzc1FcXGxpsMhIiJSO11dXYhEIlhbW8PMzEzT4VQrJSUFffr0wfnz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rRuQ0SNYsmRJTp48ydmzZxk4cCDjxo3DZrNx6tQp+vbty8CBAzl16hQrV65k1qxZDn/Enz59mu7du9O6dWs++uijmxLY/LBYLIwZM4Yvv/wSf39/OnXqxMiRI9m2bZuxT7du3ejXrx+NGzdm/fr1rF+/nhYtWjBr1iyjTosXL+bIkSM0bdqUVatWGcfWqlWLqKgotm3bRnR0NIGBgXkeqm+325kxYwaA0Ut+4cIF4I9k/cafL168mOV5YmJiGDZsGK+88gqHDx/ml19+YcqUKUycOJHjx4/z8ssv06JFC/r168f69et588038xTf//73PxISEujXrx+Q0dt88eJFvv76axo1akTfvn259957admyZb7nxGfn888/Z8yYMcZrypQpQEaCPWDAAFxcXNixYwffffcdLi4uDB061FhELzIyksGDB7Ns2TJ69uzJpk2bAPjll18A+Pbbb4GML4YiIyNp3749y5cvZ+PGjWzdupXTp08za9YswsPD2bdvnxFTTEwMX375JdOnT2fUqFEkJSWxefNm49nb2alfvz5z585l9+7d9O7dm7feeosmTZowa9asQmm7W5XTfbx27VoiIiI4fPgw0dHRhIWFMX36dPz9/XP8DAsKCuI///kPhw8f5o033iA8PJy6devyzDPPkJiYSMOGDVmwYAGHDx+mT58+TJ06lZCQEKZNm+aMJhAREZG7gJJzJ0hJSWHZsmX4+PgwZMgQevbsiZeXV57Ls5OcnEx8fLzxymnhp2HDhtGmTRtjKPKsWbNYvnw5DzzwAFeuXKFMmTL5r+gtut16BwYGEhQURLly5ahZsyZbtmxh69atAMycOZP/+7//IykpiZ9++snoZUxOTubnn38G4KWXXsLX15f777+fTZs2UbNmTQCioqLo1q0bQUFBvP/++wWamGd66aWXiIyMZNSoUUDG0Ow2bdrQs2fPHFdD37hxI2XKlGH8+PEMHz6c4cOHk5yczBdffGHsU7lyZePfNygoiE6dOhEeHp6nuMaOHcuiRYuM+eDwxxxcFxcXY7/Mob7Zxbp//34go2c2c9+ePXsCGO1/q9auXcvgwYN56aWXeOihhwCMHs8ZM2aQlpZGfHw8P/74IxEREXlO+G9VWloaCQkJxis5ORmAvXv3cunSJZ599lkqVqxISEgIAwYMYM+ePURHRxvHv/DCC7Rq1YquXbuy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03jucG7uxHa51TaQ4m/KlCnExcVx6NAhZ4dSLIWEhODr63tLjxa8E+/9P9NngYiIiOSHknMRERERERERJ9OwdhEREREREREnU3IuIiIiIiIi4mRKzkVEREREREScTMm5iIiIiIiIiJMpORcRERERERFxMiXnIiIiIiIiIk6m5FxERERERETEyZSci4iIiIiIiDiZknMRERERERERJ1NyLiIiIiIiIuJkSs5FREREREREnEzJuYiIiIiIiIiTKTkXERERERERcTIl5yIiIiIiIiJOpuRcRERERERExMmUnIuIiIiIiIg4mZJzERERERERESdTci4iIiIiIiLiZErORURERERERJxMybmIiIiIiIiIkyk5FxEREREREXEyJeciIiIiIiIiTqbkXERERERERMTJlJyLiIiIiIiIOJmScxEREREREREnU3IuIiIiIiIi4mRKzkVEREREREScTMm5iIiIiIiIiJMpORcRERERERFxMiXnIiIiIiIiIk6m5FxERERERETEyZSci4iIiIiIiDiZknMRERERERERJ1NyLiIiIiIiIuJkSs5FREREREREnEzJuYiIiIiIiIiTKTkXERERERERcTIl5yIiIiIiIiJOpuRcRERERERExMmUnIuIiIiIiIg4mZJzERERERERESdTci4iIiIiIiLiZErORURERERERJxMybmIiIiIiIiIkyk5FxEREREREXEyJeciIiIiIiIiTqbkXERERERERMTJlJyLiIiIiIiIOJmScxEREREREREnU3IuIiIiIiIi4mRKzkVEREREREScTMm5iIiIiIiIiJMpORcRERERERFxMiXnIiIiIiIiIk6m5FxERERERETEyZSci4iIiIiIiDiZknMRERERERERJ1NyLiIiIiIiIuJkSs5FREREREREnEzJuYiIiIiIiIiTKTkXERERERERcTIl5yIiIiIiIiJOpuRcRERERERExMn+H21Kb7ZnOJlaAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"dollars4.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The stack frames will continue to unwind, until we've printed the whole triangle." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Recursive Search\n", + "\n", + "Ok, although the above example was doable with recursion, that was only an academic exercises -- loops were the better option.\n", + "\n", + "Let's revisit our original motivation. How can we check if 5 is somewhere in the nested dictionary?" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'A': 10, 'B': {'C': {'F': 4, 'G': 55}, 'D': 3, 'E': {'H': 11, 'I': {}}}}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d = {\"A\": 10, \"B\": {\"C\": {\"F\": 4, \"G\": 55}, \"D\": 3, \"E\": {\"H\": 11, \"I\": {}}}}\n", + "d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, note that `d` has two values." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10\n", + "{'C': {'F': 4, 'G': 55}, 'D': 3, 'E': {'H': 11, 'I': {}}}\n" + ] + } + ], + "source": [ + "for v in d.values():\n", + " print(v)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Thus, the question \"does d contain a value x\" can be broken into two sub questions:\n", + "\n", + "1. is 10 equal to x?\n", + "2. does the following dictionary (the second value in d) contain x? `{'C': {'F': 4, 'G': 55}, 'D': 3, 'E': {'H': 11, 'I': {}}}`\n", + "\n", + "If the answer to either of those sub questions is \"yes\", then the answer to the original question is also \"yes\". And again we see the recursion. To see if x is in d, we need to determine if x is in the smaller dictionary, `{'C': {'F': 4, 'G': 55}, 'D': 3, 'E': {'H': 11, 'I': {}}}`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#contains.png 9 2 c\n", + "def contains(subdict, x):\n", + " for v in subdict.values():\n", + " if type(v) != dict:\n", + " if v == x:\n", + " return True\n", + " else:\n", + " if contains(v, x):\n", + " return True\n", + " return False\n", + "\n", + "d = {\"A\": 10, \"B\": {\"C\": {\"F\": 4, \"G\": 55}, \"D\": 3, \"E\": {\"H\": 11, \"I\": {}}}}\n", + "contains(d, 4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Take some time to study the below snapshot of the execution of the above code. Note how the first (inactive) frame has `subdict` pointing to the same dict as `d` (the A/B dict). The second (active) frame has `subdict` pointing to the dictionary nested inside the one `d` points to (the C/D/E dict).\n", + "\n", + "At this point in time, the `contains` call for C/D/E has already made recursive calls and discovered 4, so it is returning True on line 9. Although no arrow shows it, the `contains` call for A/B is waiting on line 8 for this return. Once that happens, the `contains` call for A/B will progress to line 9 as well, also returning True. If C/D/E contains 4, then A/B must as well, for A/B contains the C/D/E dict." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABEMAAAJ0CAYAAAD58+3NAAEAAElEQVR4nOzdd3xN5x/A8U92JG4SQqxYMUIQapfSVM2iRvFDaZXSoloxq60OOuhAjVYHVRSlVkVRrR3UnrGSWLGSyM7Nvs/vj9t75MqORKS+79frvpJ7znOe85xz7jj3e57zfSyUUgohhBBCCCGEEEKIx4RlUTdACCGEEEIIIYQQ4mGSYIgQQgghhBBCCCEeKxIMEUIIIYQQQgghxGNFgiFCCCGEEEIIIYR4rEgwRAghhBBCCCGEEI8VCYYIIYQQQgghhBDisSLBECGEEEIIIYQQQjxWJBgihBBCCCGEEEKIx4oEQ4QQQgghhBBCCPFYkWCIEEIIIYQQQgghHisSDBFCCCGEEKIYSk1NzXR6eHg4x44de8itEUKI4sW6qBsghBBCCCEKV2pqKgMGDMh03pQpU2jcuPFDbpHIrytXrjBv3jwOHz6MXq+nZs2adOvWjf79+2NtbTy1P3bsGO+88w6HDx/GwsIi03rOnz/PmDFj+OKLL2jUqNEDtemff/4hPDycrl27PlA9QgjxMEkw5BEwefLkom6CeAAzZ84s6iYIIYQQObp8+TKdO3fG29vbbHq5cuWKqEUir86ePcvLL79MnTp1ePfdd3FxceHIkSPMmTOHU6dO8fnnn+e6rtKlSzNgwADKli37wO3y9/cnICBAgiFCiGJFgiFFbPLkyfJjupiTYyiEEKK4aN68Oc8//3yG6devX+f48eN069aN06dPc+3aNVq2bEliYiL79+8nNDQUpRQ1a9akXbt22NvbA3DixAn0ej1ly5Zl9+7dKKXo0KEDVapUYefOnZw9exZvb2+eeuoprdcCwMWLF/H39yc6OhpPT086dOigzY+Pj2f79u1cv36dkiVL4uXlRZMmTcyWf1zNmjWLKlWq8OOPP2rHoEWLFlSpUoWPPvqIgwcP0rJlS618aGgoO3bs4M6dOzRp0oQ2bdoAcPjwYW7cuEHp0qVxdHTUyicnJ/Pnn38SGBiIk5MT7dq1o1q1atr8yMhIdu3axY0bN3Bzc6NVq1akpKRw8eJFwsLC2LBhAwAtW7akfPnynD59msOHDxMfH4+7uztPPfVUgQRfhBCiIMi3ihDiP+XWrVtYWVnh5uZmNt1gMHDlyhU8PDwKbd2mE8sSJUoU2joKQ1paGlevXi3UfSMevsJ8zRdG3UopLl++jJubGyVLliywekXunDt3jmnTpvHHH39w5MgRAL7++msuXbrE6tWrtd4kS5cuZfPmzSxYsACArVu38ttvvwHQqFEjrl69yrJly6hVqxaXLl3Cy8uLpUuX0qVLF6ZPnw7A5s2b+eCDD/Dy8sLNzY3ly5dz4sQJpkyZQkJCAoMHDyYxMZHmzZtz5swZFixYwK+//kqNGjWKYM88OsLDwzl58iRTp07VAiEmXbp0Ye7cuezdu9csGNK3b1+qVKnCnTt3WL58OZMnT6Zv376cPXuWHTt2EBAQQJ06dXBxcUGv1zN06FBu3rxJ27Zt2bNnD9988w0bNmzA3d2dS5cuMWzYMPR6PU8//TTbt2/nhx9+4IMPPiAoKIikpCS2b98OQK1atTh8+DAfffQRrVq1wsnJid9//51//vmHGTNmPNT9JoQQWVKPuVOnTqmzZ88W2fonTZpUZOsWBUOO4aPj9u3baubMmeratWsZ5kVERKgZM2YU6vpnzZqlzp07V6jryKsVK1aoDRs2ZFsmKioqy31z5coV9eeffxZG0wpVUbZ7//79av78+UWy7vQK8zWfvu7Q0FA1Y8YMFR8frxITE9WKFStUWlpavupdu3atWrhwYUE2VfwrJSVFNWnSJMPj888/V0optW3bNtWkSRP1ww8/qKioKGUwGFRqaqrS6/Vm9ezatUs1adJEhYWFKaWU+uyzz9Tzzz+vbt68qZQyvh6aNGmiPvjgA5WQkKCUUmr9+vWqTZs2KiUlRUVHR6s2bdqoxYsXa3Xu3btXtWnTRiUlJanDhw+rJk2aqFOnTmnzL1++rKKjowt1/xQHJ06cyLBv0hs9erQaPXq0Uure8Tx9+rRSSqmEhAQ1btw41aZNG+39ee3aNdWkSRPte+uHH35Qbdq0UbGxsVqdL774olq2bJlSSqmhQ4eqPn36qMjISKWUUqmpqWrnzp1KKaW++uorNWzYMLP2DBs2TGuPUkolJyergICAB9wLQghRcMx6hvj5+TF58mT27NmDq6srAAEBAfTt25f33nvPLPFWt27d8PHxYcKECZkGWS5cuEDbtm35+eef6dy5M5cuXWLNmjVMmjTpkermOH36dGxsbPjll1/ytfzIkSO5ePEif//9d4G264MPPuDcuXPac3t7e6pVq8aLL76Ip6dnjssfPXqU+vXrY2dnx1dffYVOp2PEiBEF2sb7paamsn37dtauXYuTkxMvvvgiTZo0ybL81atXWbhwIdeuXaNLly706NEDnU5XqG0U/23r1q2jefPmVK5c2Wx6fHx8rpZXSpGQkECJEiUyJJxLTk5GKYWdnV2e2qTX63FwcMjTMiZJSUl5Xt/9OnTokGFb9Ho9tra2mX4WJycnY2Njoy1z9+5dLly4QIcOHbJdj1KK1NRUbGxsMqwrt9tvMBhIS0vLUAfkfV9k1W6DwUBKSkq+9mtaWhoGgyFD+0yjOZj2Z4MGDahatWqu6sztdiUnJ2Nra2s2LSUlBSDT/ZXdaz6368yq3P11lypVin79+mFvb49er+fatWsYDAYsLc0HrMvNa6Fnz57MnTuXI0eO0LRp0xzbKPKuX79+Zj0HypcvbzZ/2LBh2vvfysoKS0tLli9fzsGDB7l58ybh4eEAxMbGUqZMGQDc3d2pUKECAGXLlsXBwYH69etrvReqV6+OXq8nLCyMW7duodfrCQoK4quvvgIgISEBvV7P8ePHqV27NmDMx9WzZ0/q1atH3bp1C3GPFB+mz5r731smlpaWJCUlmU2rV68eYDyPbNu2Lbt37yYyMlI7z0/v8OHDlCpViu+++06blpSUxM6dO+nTpw8nT55kxIgRuLi4AMbXh4+PT5btrVevHr/88gtffvklTZs2pXHjxnIshRCPFLMz4Tp16hAQEIC/v792P+muXbsICAjAz89PC4aEhYWxefNmhg0blmXFpUuX5q233qJ69eqAMeHTu+++m2XwpLjq0KFDtj/48+vPP/8kJiaGLl26AMaTz59++ok5c+Zw7NgxatasmeWyp06domnTpoSHh2NnZ8c///yT6ZdeQZszZw7Tpk1j7NixBAUF0bRpU/755x+aN2+eoey1a9do0KABrVq1onXr1owfP55du3bx448/Fno7xX9TSEgIsbGxtG3bVpt26dIlNmzYgMFgMCt74sQJ9u3bR+nSpQkJCeHpp58mLi5O6xoOxnuwfXx8SEtL45dffuHWrVuA8WSzUaNGOQYHzp8/z6ZNm7QfhT179qRatWrMnj2boUOHUqZMGRYvXkzFihXp3Lkzhw8f5sSJEwwfPpzg4GDWr19PamoqJUqU4Nlnn6VevXqZtrtFixbaOmNiYvj222/x9vYmICCASpUqYWdnh729PV26dCEyMpLly5ej1+sBsLCwoE+fPtrnw+LFiwkLC8PKyoouXbpQr149rcvzzJkzcXJyYuTIkWbbqZRi9erVXLlyBQA7OztGjhzJ5cuXM2x/rVq1Mt2Gf/75BwcHB+7evQvAE088QceOHQFjUr59+/YBxu+VHj164Obmxrp164iPjyc+Pp6YmBhtn5pk1u6//vqLo0ePAuDo6MjgwYNxdnbOcOzmzp1L5cqVuXr1KkopfH19WbVqFVevXsXCwoLKlSvTt29fUlNTWbJkCdHR0QCULFmS0aNHExQUxMGDB3nttdcy5BOqUqUKAwYMyPIY3+/y5cts2LCB5ORkAFq1akWrVq1YtmwZd+7cAaBSpUoMHDgQS0vLLF/z2e3L3JbLqu7ExERWr17NxIkTWblyJYD2I9fX15fg4OBMXwtZHcOnnnqKgwcPSjCkkNSpU8fsczIn48eP59SpUwwdOpTatWsTExPDe++9l6d1WllZAcbPi6ioKMD4Xkh/S+Fbb71FuXLlKFWqFEuWLGHRokXMnTsXvV5Pw4YNmTdvXr4Dy/8VlSpVAozfd5l9Xly9etUs0HU/Jycn4F4g9X5hYWGUKlXK7HPh+eefx8nJibi4OIAMFxuyM3LkSHQ6HX/88QerVq0CjBchTee2QghR1MyCITVr1sTd3Z1du3aZBUM8PDzYtGkTSiksLCzYv38/gJaEad++fcTFxWkR5zt37tCrVy/KlSuHs7MzkZGR/Pnnn4DxZNvGxoYGDRpoP5K3bNmi1dmuXTueeeaZbBudnJzMunXrOHv2LDqdjrZt22of/oGBgaxfv547d+7QsGFD+vfvb3bVTK/Xs2zZMgICAqhWrRq3b9/O8MGel/aUK1fO7MrZr7/+St26dbWEVbVr16ZPnz75uv/Zx8eHL7/8Uns+ffp0ypYty+rVq3nzzTextrY2u2dUr9djaWmpXbWJiooyO9FPTk4mKCiIKlWqmCXLAuMVz0uXLlGlShWzk42YmBhKlixJQkKCllPg/vtUTeueNm0aM2fO1H4sHTlyhF9//TXTYMicOXOoVasWGzduxM7OjqeffpoxY8YQFRWlXXEoKh9++CFjx47N0I6oqCi+/vprPvjgg6JpmMjWjRs3qFixonbFLC0tjQ0bNlC7dm06d+5MWFiY1gMsJSWF+Ph4vLy8aNOmDc7OziQlJdGyZUscHR25cOECGzZs4Omnn2b37t2EhYUxePBgypcvz5IlS7I8kUxv+/btPPHEEzz99NP8/fffbN++nVGjRuHo6EhgYCCOjo6EhYURHR1N586dCQoK0k50t23bxpNPPkmrVq04ceIEf/31F/Xq1cu03ekppQBj8LR37944Ojqyc+dOrcfC+vXrsbe3Z8iQIdja2jJ37lzS0tK05evVq0fjxo3ZsWMH+/fvp169erRv354DBw4wevToTIdnDAwM5Pr167z44otUqFCBgwcPZrn9tWrVynQb/P39cXZ2ZuDAgdy+fZs1a9bQvn17UlNT8ff3Z9CgQVSoUIH169ezb98+evfuTVJSEqGhofj4+ODm5pZhX9zf7oSEBI4ePUqfPn2oUKECq1atYt++fZmOfJCamsqdO3fo0qULjo6OXLp0iTt37jBq1ChsbW354YcfCAgIIDo6moSEBCZOnIjBYOD48ePa68t0Bdc0Wtjly5dZvXo1rVu3zvYY32/Lli3UqFGDzp07ExUVxa1btzh//jyRkZG8+uqrKKX4+eefCQwMpEaNGlm+5pOTk7Pcl+llVa5Hjx5Z1m163QH079+fb775hnHjxmFtbY2FhUWWr4WsjqG3t3eB97YU+RMTE8PBgwf54IMP6N69OwBBQUEPVGfFihUBtJ4Cmalfvz6zZ8/GYDBw4MAB3nrrLfbv30/79u0faN3FnZubG5UqVWLlypV07NjR7DP54MGD3LhxI9sLdMeOHQMwCxyn5+HhQWxsLIMHD84wz/Q+/+effzINZlhbW2ufeyb29va8+uqrvPrqq0RERDB9+nQWLlwowRAhxCMjQx/p5557jm3btgHG7sRbt27l+++/Z8CAAZw/f566deuye/duvL29tQ/TFStWsHbtWkqWLElwcDAATz75JK+++ip79uyhWrVq7N69G4A1a9ZoVwiaN2/Oa6+9xvfff0/Xrl2JiYnh448/ZuXKlfTv3z/TBsfGxuLj48OxY8do164dsbGxTJ48mUuXLhEaGkrr1q3R6XS0atWKr776ih9++IEdO3ZgbW1NXFwcLVq0ICAgAB8fH44fP87evXsZOHCgVn9e27Nq1SqzocTeeecdgoOD0el0tGzZkvnz5/PZZ59x4cKFfB2g9BwdHdHpdKSlpTFkyBBiYmK0IFNaWhqenp6MHj2aKVOmAMbg1t69ewHYv38/ZcqUITY2FoDvvvuOESNGkJqayrRp0/juu+8IDQ0F4NNPP9XqcHd3p3PnzqxZswYAnU7H1q1badWqlVnbTFd1TV/MN2/e5OLFi1q32ftt3LiR0aNHEx4eztmzZ6lTpw4nT5584H30oD788EM++ugjNm7cyM6dO7WASFRUFM888wwnTpxAKcWHH35YpO0UGd28edOsB1RoaCgGg4EOHTpgZ2eXIQCo0+lo166d9jwsLIw1a9YQERGhBTuSk5O5cuUKNWrU0E7gMwsG3i8yMhK9Xk+bNm2wsbGhTZs2nDx5ktjYWKpWrcrly5exsLCgSpUq3Lhxg9u3b3P79m2aNm1KdHQ0MTExnD9/nvPnz2MwGEhMTCQmJibTdmemT58+mU4PCwuja9eu2u1o93e1NvUyqVmzJqdOnQLQ3tOZBULAGPT08PDA3d0dgNatW2e7/VltQ8OGDXFwcNASckZERHDlyhWUUtp3kl6v13pIgPEKd1Yn/ve3+/Tp0zg4OGgJGJs0acLOnTszXRaMgXBTd/1ff/2VtLQ07XMwKSmJgIAAmjdvzv79+1m2bBk1atSgWbNmmdYVGxvLb7/9xtNPP02VKlWyPcamK7dg/NyJjY2lffv22Nra4ubmhpubGytXrsTDw0N7vVerVo2TJ0+i0+myfM2fOnUq232ZU7mc3k+Z7XcLC4scXwuZHUNbW1stsJ/VjzbxcDg6OuLm5oa/vz9169YlKiqKn3766YHqrFWrFvXr1+ejjz7i3XffpXr16ty4cYMNGzYwaNAgQkJCOHjwIL1796Z8+fIkJCQAyG20GD+zJ06cyNixY5k4cSJDhw7FycmJkydPMnPmTLy8vDIEjI4ePUrVqlXZt28fGzdupF+/flnert6rVy/eeust5s2bR69evUhNTeXUqVMEBgYybtw4+vfvz6pVq6hRowbPPvss169fZ82aNXz55Zc0atSIpUuXcvr0aXQ6HS4uLkyfPp1OnTrRuHFjkpKS0Ov18p4WQjxSMnwatm/fnu+//57Q0FDu3LlDbGwsPXr0oHbt2tqX4bZt27QrBCYJCQnMnTuX559/HhsbG8LCwrR5lStX5pNPPqFXr15s2bJFu+959+7dfP/99+zbt0+7WjZ58mSWL1+eZfDhq6++4tixY5w+fZr69esDsGfPHkqXLs3AgQNp2bIlO3bsoESJEuzfv5/WrVuzcuVKBg8ezNy5cwkICODYsWM88cQTgPHeWZP8tCczvXr14ueff0an03H48GGaN2/OhQsXcpXrI72oqCgCAwMB49XXX3/9ldjYWAYMGEDjxo3p1q0bN27coFKlSuzbt4+QkBCGDBnCs88+S/PmzQkPD8fV1ZW5c+dy6tQptm/fTosWLXjzzTeZMGECI0aMYOHChUyfPp01a9bQqVMnFi9ezNixY2nUqJEWuT958iQnTpygSpUqtG/fnhkzZvD7779naK+pB86QIUP4+eefadmyZYYu9WC8uhAcHMyGDRsYP368Nn3BggWMGjUqT/uooI0dO5YNGzZw4sQJnnnmGe3HkikQ0rBhQ8aOHVukbRSZs7S0NLtCbQq63p9nISvLly/H3d2dHj16YG9vz9y5c7GwsMDe3j7LQEBWTL0tTMuZgg4GgwFPT082bdqEXq+nVatW2Nvbc+DAAZKSkqhevTohISGA8bM4/XoLonu4tbV1lveap3d/mfT79X5xcXEZ2pbd9udFVFQUJUuWNLslyXRccyN9u9PS0sy2y9LSMtftiYmJoWrVqma93BwcHHB1dWXQoEGcOHGCY8eOceDAAbPPNDBu87Jly6hWrZrWg9F0m0BOx9h0+83923x/Pg4LCwvS0tKyfc3ndl9mVS6v7yeT/L4WTD1RxcOT2WeDlZUV48aNY+bMmfz1118A2o/tvByf9EEyKysrPv/8cz7//HOz73wvLy9KliyJm5sbBw4c0EaoqVKlCm+88YbZLYGPs6eeekq70PbSSy9p03v06IGvr692HE1/p0yZQmRkJGDscZx+n9//2d66dWs++OAD5s6dy88//wwYP5deffVVAEaNGkVSUhJff/01X3/9NWDMIQjGnj5t2rThlVdeAYzndGXLluWdd97R6m/Tpg1vvfVWwe0MIYR4QBmCIaZbX/z9/bl9+zY+Pj6UKFGCTp06sXPnTnr27ElAQIB2P7BJy5Yt+d///penlZt6Lfz222/al965c+fYtm0bsbGxmV4F2LFjB61bt9YCIQBt27YlISGBw4cP89lnn2n3oD755JO4ubmxf/9+Bg8ezJ49e2jdurUWCCmI9mSmefPmWllTO8+cOZPnYMiKFStYsWKF9lyn0zFnzhxq1qxJ1apV0el0rF69Gl9fX5YtW0b37t0pX748169fz1BX165dtROYF198UbvPfe3atbRp00a7kvzmm2/y6aef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l3oc0dHR7N69u9TbdZbi3lcREREREWdQzRARuRQ5aoac6dH2khqx7N9H7AN3EfjcK7i3apPnMZ988glubm6cOHGC48eP07BhQ0aMGEH16tUB2LFjB3PmzCEuLo4mTZowYMAAGjRowOrVq1m2bBn/93//R0hICBaLhVdffZVGjRoRHx/vaNvb25tu3boxYMCAAmNdtmwZNWvWpE+fPqxevZq//voLHx8ftm7dSkhICDfeeCMtWrQAsqbUfPnll/z11194enrSq1cv+vTpg6enZ442T5w4weLFi7FYLEyZMgWAqVOnkpmZyaxZs9i9ezfu7u506tSJG2+8Md8q35dyD4YOHcqZM2eYNWsWR44coUaNGvTu3ZvOnTs7ruGbb77h77//JjMzkzp16nD77bezefNmoqOjGTNmDAAxMTG89tprPPnkk8ybNy/P+5pffCIiIiIizuLlbiQtQ8kQESmeUlta156UROyDd5G2+Kc890dHR7Nx40ZatmzJhAkTOHPmDEuXLgXg1KlTzJw5k7Zt2zJlyhSqVq3KzJkzsdvtdO3aFaPRyJtvvonVamXOnDnExMTQr18/evbsCUDPnj0ZOXIkrVq1KjTO6OhoYmNjAYiLi2Pv3r14enpy9913ExYWxpw5cxzHzpo1iwMHDnDnnXcyduxYVq5cyfr163O1WaVKFVq2bImfnx8jR45k5MiRuLu78+GHH3L06FHGjRvH4MGD+e2331i8eHGecV3qPbBYLEyfPh2z2czDDz9Mz549mT17NqdPnwbgo48+4u+//2bw4MHcc889eHp6cvbsWWJjY4mOjnb0n5mZyfnz57FarXne14LiExERERFxFk93I+kW1QwRkeIp19VkevfuzTXXXANAr169WL58OQCrV6/Gx8eHli1bkpmZSevWrVm9ejWHDh0iMjKSBx98kCeeeILp06dz/PhxnnjiCby9valVqxYAkZGRXHHFFZcUU3h4OGPHjgUgODiY5557jsTERDw8PNi6dSuDBw/Gx8cHgMaNG7Nx40Z69OiRow0vLy/CwsI4duyYI47U1FT27t3LqFGjaNeuHQBHjx7l999/d9yDC13qPdi+fTvJycn07NkTu91OWFgYwcHBbN68mauvvpp//vmHG2+8kd69ewPQtGlTAP76669870le9/Xrr78uMD4RERERcS3uIT2cHUIBOpZaS17u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UO6Kcs2X+3253K+vstDUmKIr6r2qbM+Nyna9IiIiIhWRkiEiLsKVZqxZLJYS7S8um83GunXrWLJkCSkpKeXat4iIiIiIVD5KhlwGDh8+zLhx4/L82rx5M6tXr+aRRx65pLa3bt1Kenp6KUdcOjZv3pzjWm+77TaeffbZUvlUtiT3rDiSk5P5+OOPGTJkCEajEX9/f9q1a8cLL7yAzWYD4Ndff+WLL74o81h+/fVXunTpgsFgwN3dnZtuuomffvrJsd9isfC///2PmjVr4u7uTrNmzXjmmWc4ffp0ifrdvXs3tWvXpnPnzgwfPjzPApuHDh1iyJAh+Pv74+7uTu/evXnnnXfyTYz8/ffftGzZki+//LJEseVn4sSJ3Hnnnbm+vv766zLprzTs2rWLO++802WTSY8//jjffvttqbfryq9hIiIiIuI8Soa4GKvVWuz958+f54cffsDb25uIiIgcX97e3iQkJHDq1Klix7Jz50569uzpEvPf87ru06dP88MPP1C1alUiIiLw9fVlwYIFdO/enaNHj5aov4MHD/LLL7+UqI2iePjhhxk/fjytW7fm559/5s0336Rx48Y8/vjjZGZmAvDLL7/w0UcflXks69atIzw8nG+//Zbvv/+exMREhgwZwsaNG4GsZMhPP/3E/fffz9KlSxk3bhxTp07l9ttvL1G/3377LaGhoSQmJhIXF0ezZs1yHXPo0CGio6N58803Wbx4Mc2aNePee+/lzTffzHXs8ePH6d+/P9u3b+fcuXMlii0/8+fPJzY2lvDw8BxfAQEBZdJfaTh//jw///yzI8l2ocJed8rDypUrS32KUkGvYZfyWisiIiIilw8tresCMjMz+eWXX/jggw/43//+x/XXX1+s/dkmTpxI48aNc21v2LCho3hhRkYGFosFq9VKfHw8ERERAMTExBATE0OtWrXw9fXFbrc73kjGx8fj7++PyVS+Py5Fve7HH3/c8SY0KSmJmjVrsnTpUsaPH+84Jjo6mrNnzxIeHk5QUFCO8202GwcOHKBWrVp4enrm2UdaWhrp6eml+mY3Ojqa9957j6eeeoqpU6c6to8bN47HH38cd3d3du/ezbZt2zhx4gSffPIJAH379qVmzZqkp6czd+5ctm/fTnBwMDfccAONGjUCYM2aNSQlJVGtWjUWLVpERkYG1113Ha1atco3nilTpuDu7u543L59e8LDw1mzZg3t27fHy8uLEydOOH4O+vbty6FDh3j33Xex2WwYjfnnVtesWcOKFSvIyMige/fu9O3bF4Dff/+d2bNnU6dOHebOnUtYWBgDBgzIdX63bt3YtGmT43G/fv1YunQpq1at4qGHHnJsT0xMZNCgQQwYMIDvv/++oNtfYkOGDGHUqFEFHhMTE0NGRgZhYWEYDAYg6zlotVqxWq0kJCTg6+uL2Wx23Nfk5GRMJpPjZzE1NRWj0eh4HB8fz4kTJwgICCA8PNzRV2JiIt7e3hw7doywsDDH8SdPnsz35zrb888/z8mTJxk3bhzt2rVzxOpq8nse2+12jh07Rnp6OrVr18bDw6PQ17AlS5bw9ttvM378eAYNGpTrHk2dOpUTJ04wfvx4OnTo4LL3REREREQujUaGOFF0dDSvvvoqzZo147777qNVq1Z07NixyPuL6ssvv6RLly4AfP7553Tv3p02bdrQvHlzli5dyiOPPELDhg3p3LkzNWvW5MUXXyQuLo5rr70WgNatW7N58+bSuegiKMl1p6amAlClShUga2pA27ZtadKkCV27diUyMpK33nrLcfySJUuoU6cO7dq1o3r16jz77LO52jx06BAtWrTg3nvvdYzWKA0hISGEhoaybds24uLicuxr1KgRRqORgwcPsmPHDmJiYpg7dy5z584lOjqapKQk2rVrx7333supU6f4/PPPady4sWOKyVdffcWAAQNo3bo1S5Ys4bnnnqN169bs2LEj33guTIQAnD17FoDAwEDHtosTYjExMYSGhhaYCJk5cyZdu3blq6++YsmSJfTr148nn3wSyJrOcvDgQfbt28fcuXP5448/8mzj4n6tViunTp3K8YbYYrEwYsQIgoOD+eCDD/KNpzz89ddfjB49miuvvJJ27do5EkcAc+bMoW/fvnTu3Jm2bdvSvn17Zs2aBWT9/DZs2JDHH3/c0Vbfvn2ZM2cOiYmJjB49mqZNm9KnTx/atWvHbbfd5hjB0LhxY4YPH06XLl249tpriY2NZdCgQbRt25YWLVrw4osv5hvv9ddfj8lk4vrrr6dXr158/fXXhdZuKU8FPY8TEhLo168fLVu2pF27dlSrVo0lS5YU+hp21VVX0a5dOx544AGaN2/OSy+9lGME3Y033oibmxsDBw6kU6dOfPHFFy4xSk5ERERESoeSIU6QkpLCnXfeSZMmTfjpp5+YOnUqu3fv5vnnn6dGjRqF7s/PjBkzeOSRRxxfX331lWPfhW/i9+/fz913382PP/5IrVq1+Oijj5g/fz7nzp1j5syZvPTSS1gsFlasWAHAgQMHLikJU1yXet333nsv//vf/7jpppto06YN11xzDYMGDQKyPvH29/fn0KFDHDt2jNtuu42nn34am83G4cOHGTFiBLfddhuHDx9mwYIFvP766zneNB05coTBgwfTpUsXZs2alSthUBImk4knnniChQsXEhQURN++fZk8eTJr1qxxHDNo0CBGjhzJlVdeybJly1i2bBlt27bl9ddfd1zTnDlz2Lt3L61bt+aHH35wnNuwYUNOnDjBmjVriI6OJjQ0tMhTf+x2O6+88goAgwcPzvOYbdu2MW/evAKnycTExDBx4kQeeugh9uzZw59//sn06dOZNm0a+/fv5/7776dt27aMHDmSZcuW8cILLxQpvs8++4zExERGjhzp2Pbggw8SFRXF/PnzCx0JURq+++47nnjiCcfX9OnTgayExrhx43Bzc2PDhg38+uuvuLm5ce+99zqK5B48eJDx48fz7bffMnToUFatWgXAn3/+CcDy5cuBrETcwYMH6dmzJ/PmzWPlypX8/vvvHDlyhNdff52lS5eyfft2R0wxMTEsXLiQl19+mSlTppCSksLq1atZsWJFgcmNK664grfffpu///6bG264gVdffZVWrVrx+uuvl8m9K66CnseLFy9m8+bN7Nmzh+joaEaPHs3LL79MUFBQga9h1apV45lnnmHPnj0899xzLF26lKZNm/K///2PpKQkWrRowUcffcSePXsYPnw4M2bMoEmTJrz00kvOuAUiIiIiUsqUDHGC9PR0vv32W/z8/JgwYQJDhw7Fx8enyPvzk5aWRkJCguOroEKJEydOpGvXroSFhQHw+uuvM2/ePK6++mrOnz9P1apVS36hxXSp1x0aGkq1atWoUaMGDRo04LfffuP3338H4LXXXuObb74hJSWFTZs2OT5FT0tLY8uWLQDcd999BAQE0KNHD1atWkWDBg0AOHHiBIMGDaJatWp8+OGHpZoIyXbfffdx8OBBpkyZAsC7775L165dGTp0aIGry6xcuZKqVasydepUHnzwQR588EHS0tJyTA2pXbu24/tbrVo1+vbty9KlS4sU11NPPcUXX3zh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iIiISE5KhpSB7BUjKpOiXPPlfl9c6fpuv/12Z4dQYblS/RFXV9R75UrPjfJQ2a5XREREpCLS0rplwMfHhxUrVjg7jHKzYsUKx8ozBbmc70tR74G4voCAgFxFWiW3+fPnExAQUKRjL+fn/sX0WiAiIiJSMaiAahn54osvSElJcayCcbmKjIzEbDYzevToIh1/Od6X4t4DcX3Tp08nPj6e3bt3OzsUl9SkSRMCAgKKtdT05fjcv5heC0REREQqDiVDRERERERERKRS0TQZEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVSUDBERERERERGRSkXJEBERERERERGpVJQMEREREREREZFKRckQEREREREREalUlAwRERERERERkUpFyRARERERERERqVT+HxdFURH3/fNnAAAAAElFTkSuQmCC\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Image(\"contains.png\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "Frames are the key to understanding recursive calls. If we have multiple invocations of the same function outstanding, frames let us keep different local variables for each invocation.\n", + "\n", + "Recursion is a natural solution when it is easy to break a big problem into smaller, but similar problems. This happens regularly with data structures. We can often accomplish something with a data structure by doing something to all the values in that data structure (when those values are themselves data structures, we find ourselves doing recursion)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/07-recursion-and-graphs/reading2.ipynb b/lecture_material/07-recursion-and-graphs/reading2.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..31aef477cca878849ac5431ee0b87d151081f2a5 --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/reading2.ipynb @@ -0,0 +1,1925 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trees (Graphs)\n", + "\n", + "In this reading (<a href=\"lec-10-graphs.ipynb\">notebook version</a>), we'll learn about generally about *graphs*, and more specifically about a special kind of graph, the *tree*.\n", + "\n", + "By the end, you should be comfortable with the following terms:\n", + "* graph\n", + "* node\n", + "* edge\n", + "* metadata\n", + "* path\n", + "* connected, weakly connected, strongly connected\n", + "* cycle\n", + "* directed graph\n", + "* parent/child\n", + "* DAG (directed acyclic graph)\n", + "* tree\n", + "* root\n", + "* leaf\n", + "* binary tree\n", + "\n", + "## Setup\n", + "\n", + "To follow these examples, you'll need graphviz (https://www.graphviz.org/) installed on your VM. The graphviz program is called `dot`. SSH to your VM and try running it:\n", + "\n", + "```\n", + "trh@instance-1:~$ dot -V\n", + "\n", + "Command 'dot' not found, but can be installed with:\n", + "\n", + "apt install graphviz\n", + "Please ask your administrator.\n", + "```\n", + "\n", + "We don't have it, but Ubuntu is helpfully telling us how to install it (with `apt ...`)! We'll take their suggestion, but use `sudo` so we can install as root (the name for the admin user):\n", + "\n", + "```\n", + "sudo apt install graphviz\n", + "```\n", + "\n", + "You'll probably be prompted to type something like \"Y\" or \"yes\" to approve the install.\n", + "\n", + "Let's try again and confirm that we can see the installed version:\n", + "\n", + "```\n", + "trh@instance-1:~$ dot -V\n", + "dot - graphviz version 2.43.0 (0)\n", + "```\n", + "\n", + "Great! You'll also need to install the graphviz package for Python so that we can write code to generate graphs (instead of creating them manually).\n", + "\n", + "```\n", + "pip3 install graphviz\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Examples of Graphs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* Git: https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch01.html#fig0101\n", + "* Political Allignment: https://www.reddit.com/r/dataisbeautiful/comments/1q7b3s/voting_relationships_between_senators_in_the/\n", + "* Evolution: https://commons.wikimedia.org/wiki/File:The_Ancestors_Tale_Mammals_Phylogenetic_Tree_in_mya.png\n", + "* Friendship: https://facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919/\n", + "* Accounting: https://wisc-ds-projects.github.io/f19/past/langston-ellen-zan.pdf#page=22\n", + "* Transit: https://arxiv.org/pdf/1611.01890.pdf#page=14" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Nodes and Edges\n", + "\n", + "First let's import a couple things from graphviz. Note that we'll only use graphviz for visualization -- we'll be creating our own classes to represent graphs efficiently." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Digraph, Graph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Graphs have nodes and edges. Here's a graph with just one *node* (also called a *vertex*):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f34145790>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In graphviz, nodes have names and labels. If you pass one argument, they're the same. Alternatively, lets make the name \"A\" and the label \"Madison\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"108pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 108.09 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 104.09,-40 104.09,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f3404e460>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*Edges* connect nodes. Let's create another node, and an edge to connect them:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"108pt\" height=\"116pt\"\n", + " viewBox=\"0.00 0.00 108.09 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 104.09,-112 104.09,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-90\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M50.05,-71.7C50.05,-60.85 50.05,-46.92 50.05,-36.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f3404e460>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Although not common, there's no rule against having multiple edges between the same two nodes, or having an edge connecting a node to itself:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"126pt\" height=\"116pt\"\n", + " viewBox=\"0.00 0.00 126.09 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 122.09,-112 122.09,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-90\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- A--A -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>A--A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.71,-103.06C102.31,-104.97 118.09,-100.62 118.09,-90 118.09,-79.38 102.31,-75.03 84.71,-76.94\"/>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M44.17,-72.05C43.02,-61.21 43.01,-47.18 44.13,-36.28\"/>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.92,-72.05C57.07,-61.21 57.09,-47.18 55.96,-36.28\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f3404e460>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.edge(\"A\", \"B\")\n", + "g.edge(\"A\", \"A\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Can you think why you might want multiple edges between the two nodes?" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"178pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 177.66 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 173.66,-142 173.66,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"55.66\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"55.66\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"55.66\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"55.66\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M25.89,-105.42C17.49,-100.02 9.36,-92.93 4.66,-84 -1.55,-72.2 -1.55,-65.8 4.66,-54 9.41,-44.97 17.66,-37.83 26.16,-32.41\"/>\n", + "<text text-anchor=\"middle\" x=\"45.16\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">time=2h40</text>\n", + "<text text-anchor=\"middle\" x=\"45.16\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M73.68,-102.81C78.51,-97.37 83.1,-90.91 85.66,-84 90.29,-71.49 90.29,-66.51 85.66,-54 83.05,-46.94 78.31,-40.35 73.36,-34.83\"/>\n", + "<text text-anchor=\"middle\" x=\"129.16\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">time=3h10</text>\n", + "<text text-anchor=\"middle\" x=\"129.16\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f257c6430>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\", label=\"time=2h40\\ntolls=yes\")\n", + "g.edge(\"A\", \"B\", label=\"time=3h10\\ntolls=no\", badparam=\"no error here!\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Be careful! Note above that passing to params that don't exist does not produce an error in graphviz -- it's just ignored.\n", + "\n", + "You can read about what params are supported here: https://www.graphviz.org/doc/info/attrs.html\n", + "\n", + "By each parameter, the \"Used By\" column tells us what features of the graph support that attribute. The main ones to watch for are \"E\" for \"edge\" and \"N\" for \"node\". For example:\n", + "\n", + "|Name|Used By|Type|Default|Minimum|Notes|\n", + "|---|---|---|---|---|---|\n", + "|color|ENC|color |colorList|black|\n", + " \n", + "This tells us that both edges and nodes accept the color parameter.\n", + "\n", + "The other weird thing is that all arguments must be strings, even numeric data." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"178pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 177.66 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 173.66,-142 173.66,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"55.66\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"55.66\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"gray\" cx=\"55.66\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"55.66\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"red\" d=\"M25.89,-105.42C17.49,-100.02 9.36,-92.93 4.66,-84 -1.55,-72.2 -1.55,-65.8 4.66,-54 9.41,-44.97 17.66,-37.83 26.16,-32.41\"/>\n", + "<text text-anchor=\"middle\" x=\"45.16\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">time=2h40</text>\n", + "<text text-anchor=\"middle\" x=\"45.16\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"3\" d=\"M73.68,-102.81C78.51,-97.37 83.1,-90.91 85.66,-84 90.29,-71.49 90.29,-66.51 85.66,-54 83.05,-46.94 78.31,-40.35 73.36,-34.83\"/>\n", + "<text text-anchor=\"middle\" x=\"129.16\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">time=3h10</text>\n", + "<text text-anchor=\"middle\" x=\"129.16\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f257c62e0>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\", color=\"gray\")\n", + "g.edge(\"A\", \"B\", label=\"time=2h40\\ntolls=yes\", color=\"red\")\n", + "g.edge(\"A\", \"B\", label=\"time=3h10\\ntolls=no\", penwidth=\"3\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Whether it affects the visual display or not, there is often a lot of *metadata* associated with nodes and edges. For example, consider the friendship (an edge) between you and another person (two nodes).\n", + "\n", + "Node metadata: name, birthdate, SSN, address, phone, ...\n", + "\n", + "Edge metadata: when you became friends, messages exchanged, the type of relationship (work, social, etc)\n", + "\n", + "The variety of metadata that might be needed is one reason to build your own graphs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Paths\n", + "\n", + "A sequence of edges to get from one node to another is called a *path*. For example, B->A->E is one path (but not the only one) for getting from B to E." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"89pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 89.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 85,-328 85,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M47.6,-288.41C43.36,-277.41 37.81,-263.03 33.54,-251.96\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- D--E -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "<!-- E--A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>E--A</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M57.65,-36.09C59.68,-46.43 61.98,-59.91 63,-72 69.72,-151.72 69.72,-172.28 63,-252 61.98,-264.09 59.68,-277.57 57.65,-287.91\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f257cf0a0>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\")\n", + "g.node(\"B\")\n", + "g.node(\"C\")\n", + "g.node(\"D\")\n", + "g.node(\"E\")\n", + "g.edge(\"A\", \"B\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"E\")\n", + "g.edge(\"E\", \"A\", color=\"red\", penwidth=\"3\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above is an example of a *connected* graph -- there's a path between each pair of nodes. Not all graphs are connected. E.g., consider the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"174pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 174.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 170,-184 170,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"112\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"112\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M122.61,-144.05C120.44,-133.21 117.64,-119.18 115.46,-108.28\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"139\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"139\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- D--E -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>D--E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M118.4,-72.41C122.64,-61.41 128.19,-47.03 132.46,-35.96\"/>\n", + "</g>\n", + "<!-- E--C -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>E--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M143.66,-35.87C147.95,-53.88 152.95,-83.17 148,-108 145.43,-120.9 139.66,-134.59 134.68,-144.82\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f3404edf0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\")\n", + "g.node(\"B\")\n", + "g.node(\"C\")\n", + "g.node(\"D\")\n", + "g.node(\"E\")\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"E\")\n", + "g.edge(\"E\", \"C\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Take a look at https://en.wikipedia.org/wiki/Path_(graph_theory) to see other ways paths (and similar structures) are commonly defined.\n", + "\n", + "A *cycle* is a path that forms a loop back to the original node (without reusing the same edges). The red path is cycle:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"174pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 174.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 170,-184 170,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"112\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"112\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M122.61,-144.05C120.44,-133.21 117.64,-119.18 115.46,-108.28\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"139\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"139\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- D--E -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>D--E</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M118.4,-72.41C122.64,-61.41 128.19,-47.03 132.46,-35.96\"/>\n", + "</g>\n", + "<!-- E--C -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>E--C</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M143.66,-35.87C147.95,-53.88 152.95,-83.17 148,-108 145.43,-120.9 139.66,-134.59 134.68,-144.82\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f7f3404e490>" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\")\n", + "g.node(\"B\")\n", + "g.node(\"C\")\n", + "g.node(\"D\")\n", + "g.node(\"E\")\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"C\", \"D\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"D\", \"E\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"E\", \"C\", color=\"red\", penwidth=\"3\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Directed Graphs\n", + "\n", + "*Directed graphs* have special edges with a direction. For example, imagine nodes are street intersections. Some intersections are connected by one-way streets. We can create directed graphs with `Digraph`:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"174pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 174.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 170,-184 170,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"112\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"112\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M122.61,-144.05C121.07,-136.35 119.21,-127.03 117.47,-118.36\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"120.85,-117.39 115.46,-108.28 113.98,-118.77 120.85,-117.39\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"139\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"139\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- D->E -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>D->E</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M118.4,-72.41C121.51,-64.34 125.33,-54.43 128.83,-45.35\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"132.13,-46.55 132.46,-35.96 125.6,-44.03 132.13,-46.55\"/>\n", + "</g>\n", + "<!-- E->C -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>E->C</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M143.66,-35.87C147.95,-53.88 152.95,-83.17 148,-108 146.13,-117.37 142.58,-127.16 138.86,-135.74\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"135.68,-134.27 134.68,-144.82 142.04,-137.2 135.68,-134.27\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257cf3d0>" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph() # only line changed from last example!\n", + "g.node(\"A\")\n", + "g.node(\"B\")\n", + "g.node(\"C\")\n", + "g.node(\"D\")\n", + "g.node(\"E\")\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"C\", \"D\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"D\", \"E\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"E\", \"C\", color=\"red\", penwidth=\"3\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above still has a cycle, but the following is not a cycle, given the direction of the arrows:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"174pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 174.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 170,-184 170,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"112\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"112\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M122.61,-144.05C121.07,-136.35 119.21,-127.03 117.47,-118.36\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"120.85,-117.39 115.46,-108.28 113.98,-118.77 120.85,-117.39\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"139\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"139\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- C->E -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>C->E</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M134.68,-144.82C139.66,-134.59 145.43,-120.9 148,-108 152.12,-87.34 149.35,-63.6 145.83,-45.83\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"149.21,-44.9 143.66,-35.87 142.37,-46.39 149.21,-44.9\"/>\n", + "</g>\n", + "<!-- D->E -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>D->E</title>\n", + "<path fill=\"none\" stroke=\"red\" stroke-width=\"3\" d=\"M118.4,-72.41C121.51,-64.34 125.33,-54.43 128.83,-45.35\"/>\n", + "<polygon fill=\"red\" stroke=\"red\" stroke-width=\"3\" points=\"132.13,-46.55 132.46,-35.96 125.6,-44.03 132.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257cf460>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.node(\"A\")\n", + "g.node(\"B\")\n", + "g.node(\"C\")\n", + "g.node(\"D\")\n", + "g.node(\"E\")\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"C\", \"D\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"D\", \"E\", color=\"red\", penwidth=\"3\")\n", + "g.edge(\"C\", \"E\", color=\"red\", penwidth=\"3\") # only change: flip C and E\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With directed graphs, we often use parent/child terminology.\n", + "\n", + "For example, node C has two children: D and E.\n", + "\n", + "E has two parents: C and D." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Is the following graph connected?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"89pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 89.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 85,-184 85,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.6,-144.41C44.49,-136.34 40.67,-126.43 37.17,-117.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"40.4,-116.03 33.54,-107.96 33.87,-118.55 40.4,-116.03\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- A->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M57.65,-143.91C59.68,-133.57 61.98,-120.09 63,-108 64.34,-92.06 64.34,-87.94 63,-72 62.28,-63.5 60.93,-54.31 59.49,-46.01\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.91,-45.29 57.65,-36.09 56.03,-46.56 62.91,-45.29\"/>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257c65e0>" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"A\", \"C\")\n", + "g.edge(\"B\", \"C\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Sort of. We need to be able to reach any node from any other node. Can we reach A from C? No, if we respect the direction of the edges, but yet if we're willing to drive the wrong way on a one-way street. So with directed graphs, we'll have two definitions of connected:\n", + "\n", + "* *strongly directed*: there's a path between any two nodes, **respecting** direction of edges\n", + "* *weakly directed*: there's a path between any two nodes, **ignoring** direction of edges\n", + "\n", + "So the above graph is weakly connected but not strongly connected. If we just use the term \"connected\" for a directed graph, we mean \"strongly connected\"." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Directed Acyclic Graphs\n", + "\n", + "DAGs are directed graphs without cycles in them. The directed graph show above is a DAG because it doesn't have any cycles.\n", + "\n", + "DAGs show up all the time in practice! Which of the following are examples of DAGs?\n", + "\n", + "1. a network of mutual friends\n", + "2. git commits\n", + "3. a Python class hierarchy\n", + "4. a network of streets in a City\n", + "\n", + "<details>\n", + "<summary>Answers</summary>\n", + "Only (2) and (3) are DAGs\n", + "</details>" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Trees\n", + "\n", + "*Directed graphs* are a kind of *graph*\n", + "\n", + "*DAGs* are a kind of *directed graph*.\n", + "\n", + "*Trees* are a kind of *DAG*.\n", + "\n", + "Trees have these additional restrictions beyond what DAGs require:\n", + "* they have exactly one node with no parents, called the *root*\n", + "* any additional nodes have exactly one parent\n", + "\n", + "Here's an example of a tree:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"278pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 278.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 274,-328 274,4 -4,4\"/>\n", + "<!-- B -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"117\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"117\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B->A -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>B->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M159.02,-289.46C152.02,-280.4 143.06,-268.79 135.21,-258.61\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"137.83,-256.27 128.95,-250.49 132.29,-260.55 137.83,-256.27\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"225\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"225\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M182.98,-289.46C189.98,-280.4 198.94,-268.79 206.79,-258.61\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"209.71,-260.55 213.05,-250.49 204.17,-256.27 209.71,-260.55\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M100.07,-219.83C86.5,-209.27 67.24,-194.3 51.91,-182.37\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.89,-179.48 43.85,-176.11 49.6,-185.01 53.89,-179.48\"/>\n", + "</g>\n", + "<!-- G -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>G</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">G</text>\n", + "</g>\n", + "<!-- A->G -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>A->G</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M112.64,-216.05C110.61,-208.14 108.14,-198.54 105.86,-189.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"109.2,-188.6 103.32,-179.79 102.42,-190.35 109.2,-188.6\"/>\n", + "</g>\n", + "<!-- H -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>H</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">H</text>\n", + "</g>\n", + "<!-- A->H -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->H</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M128.98,-217.46C135.98,-208.4 144.94,-196.79 152.79,-186.61\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"155.71,-188.55 159.05,-178.49 150.17,-184.27 155.71,-188.55\"/>\n", + "</g>\n", + "<!-- I -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>I</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">I</text>\n", + "</g>\n", + "<!-- C->I -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>C->I</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M229.36,-216.05C231.39,-208.14 233.86,-198.54 236.14,-189.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"239.58,-190.35 238.68,-179.79 232.8,-188.6 239.58,-190.35\"/>\n", + "</g>\n", + "<!-- J -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>J</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">J</text>\n", + "</g>\n", + "<!-- I->J -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>I->J</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M243,-143.7C243,-135.98 243,-126.71 243,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-118.1 243,-108.1 239.5,-118.1 246.5,-118.1\"/>\n", + "</g>\n", + "<!-- K -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>K</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">K</text>\n", + "</g>\n", + "<!-- J->K -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>J->K</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M243,-71.7C243,-63.98 243,-54.71 243,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-46.1 243,-36.1 239.5,-46.1 246.5,-46.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257cf2b0>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.edge(\"B\", \"A\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"G\")\n", + "g.edge(\"A\", \"H\")\n", + "g.edge(\"C\", \"I\")\n", + "g.edge(\"I\", \"J\")\n", + "g.edge(\"J\", \"K\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Which node is the root in the above tree?\n", + "\n", + "<details>\n", + "<summary>Answer</summary>\n", + "B\n", + "</details>\n", + "\n", + "A leaf is a node with no children. What are the leaves in the above graph?\n", + "\n", + "<details>\n", + "<summary>Answer</summary>\n", + "F, G, H, K\n", + "</details>\n", + "\n", + "**Note:** you might encounter different definitions of \"root\" in different classes. In CS 320, we define it as any node that has no parents. By this definition, some graphs (not trees) may have multiple roots.\n", + "\n", + "Consider your files, organized as a graph:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"440pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 440.29 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 436.29,-328 436.29,4 -4,4\"/>\n", + "<!-- Users -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>Users</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"188.39\" cy=\"-306\" rx=\"38.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"188.39\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">Users</text>\n", + "</g>\n", + "<!-- Tyler -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>Tyler</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"188.39\" cy=\"-234\" rx=\"34.39\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"188.39\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">Tyler</text>\n", + "</g>\n", + "<!-- Users->Tyler -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>Users->Tyler</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M188.39,-287.7C188.39,-279.98 188.39,-270.71 188.39,-262.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"191.89,-262.1 188.39,-252.1 184.89,-262.1 191.89,-262.1\"/>\n", + "</g>\n", + "<!-- cs220 -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>cs220</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"141.39\" cy=\"-162\" rx=\"38.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"141.39\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">cs220</text>\n", + "</g>\n", + "<!-- Tyler->cs220 -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>Tyler->cs220</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M177.49,-216.76C171.76,-208.23 164.61,-197.58 158.19,-188.02\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"161.04,-185.98 152.56,-179.63 155.23,-189.89 161.04,-185.98\"/>\n", + "</g>\n", + "<!-- cs320 -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>cs320</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"236.39\" cy=\"-162\" rx=\"38.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"236.39\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">cs320</text>\n", + "</g>\n", + "<!-- Tyler->cs320 -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>Tyler->cs320</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M199.53,-216.76C205.38,-208.23 212.68,-197.58 219.24,-188.02\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"222.22,-189.86 224.99,-179.63 216.45,-185.9 222.22,-189.86\"/>\n", + "</g>\n", + "<!-- P1 -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>P1</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"185.39\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"185.39\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">P1</text>\n", + "</g>\n", + "<!-- cs320->P1 -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>cs320->P1</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M224.57,-144.76C218.1,-135.89 209.98,-124.74 202.8,-114.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"205.53,-112.69 196.81,-106.67 199.87,-116.81 205.53,-112.69\"/>\n", + "</g>\n", + "<!-- P2 -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>P2</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"287.39\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"287.39\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">P2</text>\n", + "</g>\n", + "<!-- cs320->P2 -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>cs320->P2</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M248.22,-144.76C254.69,-135.89 262.81,-124.74 269.99,-114.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"272.92,-116.81 275.98,-106.67 267.26,-112.69 272.92,-116.81\"/>\n", + "</g>\n", + "<!-- main.ipynb -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>main.ipynb</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"62.39\" cy=\"-18\" rx=\"62.29\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"62.39\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">main.ipynb</text>\n", + "</g>\n", + "<!-- P1->main.ipynb -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>P1->main.ipynb</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M165.36,-77.6C147.17,-67.25 119.93,-51.74 98.03,-39.28\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"99.74,-36.23 89.32,-34.32 96.28,-42.31 99.74,-36.23\"/>\n", + "</g>\n", + "<!-- p1-test -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>p1-test</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"185.39\" cy=\"-18\" rx=\"42.79\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"185.39\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">test.py</text>\n", + "</g>\n", + "<!-- P1->p1-test -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>P1->p1-test</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M185.39,-71.7C185.39,-63.98 185.39,-54.71 185.39,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"188.89,-46.1 185.39,-36.1 181.89,-46.1 188.89,-46.1\"/>\n", + "</g>\n", + "<!-- bus.py -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>bus.py</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"287.39\" cy=\"-18\" rx=\"41.69\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"287.39\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">bus.py</text>\n", + "</g>\n", + "<!-- P2->bus.py -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>P2->bus.py</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M287.39,-71.7C287.39,-63.98 287.39,-54.71 287.39,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"290.89,-46.1 287.39,-36.1 283.89,-46.1 290.89,-46.1\"/>\n", + "</g>\n", + "<!-- p2-test -->\n", + "<g id=\"node10\" class=\"node\">\n", + "<title>p2-test</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"389.39\" cy=\"-18\" rx=\"42.79\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"389.39\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">test.py</text>\n", + "</g>\n", + "<!-- P2->p2-test -->\n", + "<g id=\"edge9\" class=\"edge\">\n", + "<title>P2->p2-test</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M305.63,-76.49C320.46,-66.31 341.71,-51.72 359.09,-39.79\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"361.51,-42.38 367.78,-33.83 357.55,-36.61 361.51,-42.38\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257cfbb0>" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.edge(\"Users\", \"Tyler\")\n", + "g.edge(\"Tyler\", \"cs220\")\n", + "g.edge(\"Tyler\", \"cs320\")\n", + "g.edge(\"cs320\", \"P1\")\n", + "g.edge(\"cs320\", \"P2\")\n", + "g.edge(\"P1\", \"main.ipynb\")\n", + "g.edge(\"P2\", \"bus.py\")\n", + "\n", + "g.node(\"p1-test\", \"test.py\")\n", + "g.node(\"p2-test\", \"test.py\")\n", + "g.edge(\"P1\", \"p1-test\")\n", + "g.edge(\"P2\", \"p2-test\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above is an example of a(n):\n", + "1. graph\n", + "2. DAG\n", + "3. tree\n", + "4. all of the above!\n", + "\n", + "<details>\n", + "<summary>Answer</summary>\n", + "(4) All of the above! It satisfies all the requirements for being a tree. Furthemore, a tree is a kind of DAG, and a DAG is a kind of graph.\n", + "</details>" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tree Example\n", + "\n", + "Before we implemented a tree, review the LinkedList class you implemented in lab:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'A','B','C'\n", + "A\n", + "B\n", + "C\n" + ] + } + ], + "source": [ + "class Node:\n", + " def __init__(self, val):\n", + " self.val = val\n", + " self.next = None\n", + "\n", + " def __len__(self):\n", + " if self.next == None:\n", + " # base case: I'm the only Node! Length must be 1\n", + " return 1\n", + " else:\n", + " # recursive case: total length is the length of next plus 1\n", + " raise NotImplemented(\"recursive case not implemented yet\")\n", + "\n", + " def __repr__(self):\n", + " if self.next == None:\n", + " return repr(self.val)\n", + " else:\n", + " return repr(self.val)+\",\"+repr(self.next)\n", + "\n", + " def __getitem__(self, idx):\n", + " if idx == 0:\n", + " # base case\n", + " return self.val\n", + " else:\n", + " if self.next == None:\n", + " raise IndexError\n", + " \n", + " # recursive case\n", + " return self.next[idx-1]\n", + "\n", + "L = Node(\"A\")\n", + "L2 = Node(\"B\")\n", + "L3 = Node(\"C\")\n", + "L.next = L2\n", + "L2.next = L3\n", + "print(L)\n", + "for x in L:\n", + " print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above is really a simple form of a graph, like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"188pt\"\n", + " viewBox=\"0.00 0.00 62.00 188.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 184)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-184 58,-184 58,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-71.7C27,-63.98 27,-54.71 27,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257c68e0>" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each node is an object of type Node. What are the edges? The `next` attribute -- we didn't need to implement a special class for that in this case, though we might have if there were important edge metadata.\n", + "\n", + "To get a tree, we're going to need to have multiple children per node. For simplicity, lets have at most two (such a tree is called a \"binary tree\"). Instead of `next`, we'll have `left` and `right`, both of which can reference other nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A\n", + " B\n", + " C\n", + "\n" + ] + } + ], + "source": [ + "class Node:\n", + " def __init__(self, val):\n", + " self.val = val\n", + " self.left = None\n", + " self.right = None\n", + " \n", + " def indented_str(self, indent):\n", + " s = \" \" * indent + self.val + \"\\n\"\n", + " for child in [self.left, self.right]:\n", + " if child != None:\n", + " s += child.indented_str(indent+1)\n", + " return s\n", + " \n", + " def __str__(self):\n", + " return self.indented_str(0)\n", + " \n", + "root = Node(\"A\")\n", + "root.left = Node(\"B\")\n", + "root.right = Node(\"C\")\n", + "print(root)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Can we design our tree so that it " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"116pt\"\n", + " viewBox=\"0.00 0.00 134.00 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 130,-112 130,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M54.65,-72.76C50.29,-64.28 44.85,-53.71 39.96,-44.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"42.99,-42.44 35.3,-35.15 36.77,-45.64 42.99,-42.44\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- A->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M71.35,-72.76C75.71,-64.28 81.15,-53.71 86.04,-44.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"89.23,-45.64 90.7,-35.15 83.01,-42.44 89.23,-45.64\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f7f257cf8b0>" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def to_graphviz(self, g=None):\n", + " if g == None:\n", + " g = Digraph()\n", + " g.node(self.val)\n", + " for child in [self.left, self.right]:\n", + " if child != None:\n", + " g.edge(self.val, child.val)\n", + " child.to_graphviz(g)\n", + " return g\n", + "\n", + "# add to_graphviz to Node as a new method.\n", + "# this is not good style: https://www.geeksforgeeks.org/monkey-patching-in-python-dynamic-behavior/\n", + "# but it means not copy/pasting the above code\n", + "Node.to_graphviz = to_graphviz\n", + "\n", + "root.to_graphviz()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Wouldn't it be nice if we could automatically visualize the tree?" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<__main__.Node at 0x7f7f257cf430>" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can if we implement `_repr_svg_`, like `Graph` does (well, Digraph names it something similar, `_repr_image_svg_xml`):" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"116pt\"\n", + " viewBox=\"0.00 0.00 134.00 116.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 112)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-112 130,-112 130,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M54.65,-72.76C50.29,-64.28 44.85,-53.71 39.96,-44.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"42.99,-42.44 35.3,-35.15 36.77,-45.64 42.99,-42.44\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- A->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M71.35,-72.76C75.71,-64.28 81.15,-53.71 86.04,-44.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"89.23,-45.64 90.7,-35.15 83.01,-42.44 89.23,-45.64\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7f7f257cf430>" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def _repr_svg_(self, g=None):\n", + " return self.to_graphviz()._repr_image_svg_xml()\n", + "Node._repr_svg_ = _repr_svg_\n", + "\n", + "root" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.10" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/07-recursion-and-graphs/solution.ipynb b/lecture_material/07-recursion-and-graphs/solution.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..8d4912c67b8b4c8670317392f41ceb167a238b85 --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/solution.ipynb @@ -0,0 +1,1092 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f385b68", + "metadata": {}, + "source": [ + "# Graphs\n", + "\n", + "Today: graph visualization (graphviz)\n", + "Upcoming: graph computation (from classes)\n", + "\n", + "Two main components:\n", + "- **Nodes**: some kind of entity. Examples: Person, Computer, Place, Event, etc., \n", + "- **Edges**: relationships between those entities." + ] + }, + { + "cell_type": "markdown", + "id": "3d6757a4", + "metadata": {}, + "source": [ + "### Examples\n", + "\n", + "* Git: https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch01.html#fig0101\n", + "* Political Allignment: https://www.reddit.com/r/dataisbeautiful/comments/1q7b3s/voting_relationships_between_senators_in_the/\n", + "* Evolution: https://commons.wikimedia.org/wiki/File:The_Ancestors_Tale_Mammals_Phylogenetic_Tree_in_mya.png\n", + "* Friendship: https://facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919/\n", + "* Accounting: https://wisc-ds-projects.github.io/f19/past/langston-ellen-zan.pdf#page=22\n", + "* Transit: https://arxiv.org/pdf/1611.01890.pdf#page=14\n", + "\n", + "### Graphviz Setup\n", + "\n", + "- Execute the below terminal commands\n", + "\n", + "```\n", + "sudo apt install -y graphviz\n", + "pip3 install graphviz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ab111ed5-ded4-44f7-99e5-dae046890d44", + "metadata": {}, + "outputs": [], + "source": [ + "# import statements\n", + "from graphviz import Graph, Digraph" + ] + }, + { + "cell_type": "markdown", + "id": "0505c1dd", + "metadata": {}, + "source": [ + "### `Graph` Syntax\n", + "\n", + "- Creating `Graph` object:\n", + "```python\n", + "g = Graph()\n", + "dg = Digraph()\n", + "```\n", + "- Creating a `node`:\n", + "```python\n", + "g.node(<name>, <description>)\n", + "```\n", + "- Creating an `edge`:\n", + "```python\n", + "g.edge(<SOURCE NODE>, <TARGET NODE>, label=<description>, color=<value>, pendwidth=<value>)\n", + "```\n", + "- Displaying the graph object instance invokes `_repr_svg_` (similar to `_repr_html`)\n", + "- We could directly add edges which will add missing nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5837dbd7-3989-44e0-8284-1522e852891a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"red\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaef20>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\", label=\"2h40\\ntolls=yes\", color=\"red\")\n", + "g.edge(\"A\", \"B\", label=\"3h10\\ntolls=no\", penwidth=\"5\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "6b248218", + "metadata": {}, + "source": [ + "### Be careful: `graphviz` does not throw an error when you use incorrect parameter name!\n", + "- Read through \"graphviz attributes\" to see details: https://graphviz.org/doc/info/attrs.html." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e94f297f-b7f0-4a38-bbeb-7779fbd7b6aa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf400>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\", label=\"2h40\\ntolls=yes\", colors=\"red\")\n", + "g.edge(\"A\", \"B\", label=\"3h10\\ntolls=no\", penwidth=\"5\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "1347be90", + "metadata": {}, + "source": [ + "## Paths\n", + "\n", + "A **path** is a sequence of edges to get from one node to another." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "426d7460", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"161pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 161.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 157,-328 157,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.6,-288.41C43.36,-277.41 37.81,-263.03 33.54,-251.96\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M57.65,-287.91C59.68,-277.57 61.98,-264.09 63,-252 69.72,-172.28 69.72,-151.72 63,-72 61.98,-59.91 59.68,-46.43 57.65,-36.09\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf520>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.node(\"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "923f609e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C60.84,-278.07 48.13,-261.89 38.91,-250.16\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.49,-59.96 59.19,-46.48 57.3,-36.13\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A--E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A--E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C103.16,-278.07 115.87,-261.89 125.09,-250.16\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aafca0>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "22ff8ea7", + "metadata": {}, + "source": [ + "### Observations:\n", + "\n", + "- no path between A and E\n", + "- B => A => F is a path\n", + "- B => C => D => F is a path\n", + "- future: what is the SHORTEST path between two nodes\n", + "\n", + "### More terminology\n", + "\n", + "- **connected** means there is a path between any two nodes\n", + "- **cycle** means a path with same start+end, no repeating edges; for example: A,B,C,D,F,A" + ] + }, + { + "cell_type": "markdown", + "id": "274d67e1", + "metadata": {}, + "source": [ + "## Directed Graphs: DAGs (Directed Acyclic Graphs - no cycles)\n", + "\n", + "- **parent** means the outgoing end of an edge\n", + "- **child** means the incoming end of an edge\n", + "- **strongly connected** (same as **connected** with direction) => there's a path from any start to any end\n", + "- **weakly connected** => it would be connected if we ignored the direction of edges" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c1877373", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-287.7C99,-279.98 99,-270.71 99,-262.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-262.1 99,-252.1 95.5,-262.1 102.5,-262.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf250>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# weakly connected\n", + "# cyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f168d058", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.16,-288.41C92.3,-280.51 92.05,-270.85 92.41,-261.94\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"95.9,-262.18 93.12,-251.96 88.92,-261.68 95.9,-262.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "<!-- E->A -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>E->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M104.88,-251.96C105.71,-259.83 105.95,-269.37 105.58,-278.19\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.07,-278.18 104.84,-288.41 109.06,-278.69 102.07,-278.18\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf5e0>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# strongly connected\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g.edge(\"E\", \"A\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "db52edf9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aafc40>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# acyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "257bf913", + "metadata": {}, + "source": [ + "## Trees\n", + "\n", + "- **Tree**: DAG where one node (the **root**) has no parents and all others have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: is any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7e04db8c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf7c0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "17e1112d-701e-4be8-9698-cde5dde4c598", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"260pt\"\n", + " viewBox=\"0.00 0.00 206.00 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-256 202,-256 202,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-218.83C74.25,-208.94 60.48,-195.55 48.97,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-181.85 41.8,-177.38 46.53,-186.87 51.41,-181.85\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-215.7C99,-207.98 99,-198.71 99,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-190.1 99,-180.1 95.5,-190.1 102.5,-190.1\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-218.83C123.75,-208.94 137.52,-195.55 149.03,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"151.47,-186.87 156.2,-177.38 146.59,-181.85 151.47,-186.87\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-71.7C27,-63.98 27,-54.71 27,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c240d8310>" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "#g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/07-recursion-and-graphs/starter.ipynb b/lecture_material/07-recursion-and-graphs/starter.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..9391c81f565271d71cc0c4c45ff663d2d00a4158 --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/starter.ipynb @@ -0,0 +1,121 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f385b68", + "metadata": {}, + "source": [ + "# Graphs\n", + "\n", + "Today: graph visualization (graphviz)\n", + "\n", + "Upcoming: graph computation (from classes)\n", + "\n", + "**Nodes**: some kind of entity. **Edges**: relationships between those entities." + ] + }, + { + "cell_type": "markdown", + "id": "3d6757a4", + "metadata": {}, + "source": [ + "### Examples\n", + "\n", + "* Git: https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch01.html#fig0101\n", + "* Political Allignment: https://www.reddit.com/r/dataisbeautiful/comments/1q7b3s/voting_relationships_between_senators_in_the/\n", + "* Evolution: https://commons.wikimedia.org/wiki/File:The_Ancestors_Tale_Mammals_Phylogenetic_Tree_in_mya.png\n", + "* Friendship: https://facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919/\n", + "* Accounting: https://wisc-ds-projects.github.io/f19/past/langston-ellen-zan.pdf#page=22\n", + "* Transit: https://arxiv.org/pdf/1611.01890.pdf#page=14\n", + "\n", + "### Graphviz Setup\n", + "\n", + "```\n", + "sudo apt install -y graphviz\n", + "pip3 install graphviz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b375c8d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "1347be90", + "metadata": {}, + "source": [ + "## Paths\n", + "\n", + "A **path** is a sequence of edges to get from one node to another" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "426d7460", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "274d67e1", + "metadata": {}, + "source": [ + "## Directed Graphs, DAGs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1877373", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "257bf913", + "metadata": {}, + "source": [ + "## Trees\n", + "\n", + "**Tree**: DAG where one node (the **root**) has no parents and all others have exactly one parent" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7e04db8c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/07-recursion-and-graphs/template_lec_001.ipynb b/lecture_material/07-recursion-and-graphs/template_lec_001.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1ba77a14ee4cef3d0b2f5f0a46e3d4c3b171f024 --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/template_lec_001.ipynb @@ -0,0 +1,1084 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f385b68", + "metadata": {}, + "source": [ + "# Graphs\n", + "\n", + "Today: graph visualization (graphviz)\n", + "Upcoming: graph computation (from classes)\n", + "\n", + "Two main components:\n", + "- **Nodes**: some kind of entity. Examples: Person, Computer, Place, Event, etc., \n", + "- **Edges**: relationships between those entities." + ] + }, + { + "cell_type": "markdown", + "id": "3d6757a4", + "metadata": {}, + "source": [ + "### Examples\n", + "\n", + "* Git: https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch01.html#fig0101\n", + "* Political Allignment: https://www.reddit.com/r/dataisbeautiful/comments/1q7b3s/voting_relationships_between_senators_in_the/\n", + "* Evolution: https://commons.wikimedia.org/wiki/File:The_Ancestors_Tale_Mammals_Phylogenetic_Tree_in_mya.png\n", + "* Friendship: https://facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919/\n", + "* Accounting: https://wisc-ds-projects.github.io/f19/past/langston-ellen-zan.pdf#page=22\n", + "* Transit: https://arxiv.org/pdf/1611.01890.pdf#page=14\n", + "\n", + "### Graphviz Setup\n", + "\n", + "- Execute the below terminal commands\n", + "\n", + "```\n", + "sudo apt install -y graphviz\n", + "pip3 install graphviz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ab111ed5-ded4-44f7-99e5-dae046890d44", + "metadata": {}, + "outputs": [], + "source": [ + "# import statements\n" + ] + }, + { + "cell_type": "markdown", + "id": "0505c1dd", + "metadata": {}, + "source": [ + "### `Graph` Syntax\n", + "\n", + "- Creating `Graph` object:\n", + "```python\n", + "g = Graph()\n", + "dg = Digraph()\n", + "```\n", + "- Creating a `node`:\n", + "```python\n", + "g.node(<name>, <description>)\n", + "```\n", + "- Creating an `edge`:\n", + "```python\n", + "g.edge(<SOURCE NODE>, <TARGET NODE>, label=<description>, color=<value>, pendwidth=<value>)\n", + "```\n", + "- Displaying the graph object instance invokes `_repr_svg_` (similar to `_repr_html`)\n", + "- We could directly add edges which will add missing nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5837dbd7-3989-44e0-8284-1522e852891a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"red\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaef20>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6b248218", + "metadata": {}, + "source": [ + "### Be careful: `graphviz` does not throw an error when you use incorrect parameter name!\n", + "- Read through \"graphviz attributes\" to see details: https://graphviz.org/doc/info/attrs.html." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e94f297f-b7f0-4a38-bbeb-7779fbd7b6aa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf400>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\", label=\"2h40\\ntolls=yes\", colors=\"red\")\n", + "g.edge(\"A\", \"B\", label=\"3h10\\ntolls=no\", penwidth=\"5\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "1347be90", + "metadata": {}, + "source": [ + "## Paths\n", + "\n", + "A **path** is a sequence of edges to get from one node to another." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "426d7460", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"161pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 161.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 157,-328 157,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.6,-288.41C43.36,-277.41 37.81,-263.03 33.54,-251.96\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M57.65,-287.91C59.68,-277.57 61.98,-264.09 63,-252 69.72,-172.28 69.72,-151.72 63,-72 61.98,-59.91 59.68,-46.43 57.65,-36.09\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf520>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.node(\"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "923f609e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C60.84,-278.07 48.13,-261.89 38.91,-250.16\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.49,-59.96 59.19,-46.48 57.3,-36.13\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A--E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A--E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C103.16,-278.07 115.87,-261.89 125.09,-250.16\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aafca0>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "22ff8ea7", + "metadata": {}, + "source": [ + "### Observations:\n", + "\n", + "- no path between A and E\n", + "- B => A => F is a path\n", + "- B => C => D => F is a path\n", + "- future: what is the SHORTEST path between two nodes\n", + "\n", + "### More terminology\n", + "\n", + "- **connected** means there is a path between any two nodes\n", + "- **cycle** means a path with same start+end, no repeating edges; for example: A,B,C,D,F,A" + ] + }, + { + "cell_type": "markdown", + "id": "274d67e1", + "metadata": {}, + "source": [ + "## Directed Graphs: DAGs (Directed Acyclic Graphs - no cycles)\n", + "\n", + "- **parent** means the outgoing end of an edge\n", + "- **child** means the incoming end of an edge\n", + "- **strongly connected** (same as **connected** with direction) => there's a path from any start to any end\n", + "- **weakly connected** => it would be connected if we ignored the direction of edges" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c1877373", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-287.7C99,-279.98 99,-270.71 99,-262.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-262.1 99,-252.1 95.5,-262.1 102.5,-262.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf250>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# weakly connected\n", + "# cyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f168d058", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.16,-288.41C92.3,-280.51 92.05,-270.85 92.41,-261.94\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"95.9,-262.18 93.12,-251.96 88.92,-261.68 95.9,-262.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "<!-- E->A -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>E->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M104.88,-251.96C105.71,-259.83 105.95,-269.37 105.58,-278.19\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.07,-278.18 104.84,-288.41 109.06,-278.69 102.07,-278.18\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf5e0>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# strongly connected\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g.edge(\"E\", \"A\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "db52edf9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aafc40>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# acyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "257bf913", + "metadata": {}, + "source": [ + "## Trees\n", + "\n", + "- **Tree**: DAG where one node (the **root**) has no parents and all others have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: is any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7e04db8c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf7c0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "17e1112d-701e-4be8-9698-cde5dde4c598", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"260pt\"\n", + " viewBox=\"0.00 0.00 206.00 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-256 202,-256 202,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-218.83C74.25,-208.94 60.48,-195.55 48.97,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-181.85 41.8,-177.38 46.53,-186.87 51.41,-181.85\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-215.7C99,-207.98 99,-198.71 99,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-190.1 99,-180.1 95.5,-190.1 102.5,-190.1\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-218.83C123.75,-208.94 137.52,-195.55 149.03,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"151.47,-186.87 156.2,-177.38 146.59,-181.85 151.47,-186.87\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-71.7C27,-63.98 27,-54.71 27,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c240d8310>" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "#g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/07-recursion-and-graphs/template_lec_002.ipynb b/lecture_material/07-recursion-and-graphs/template_lec_002.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1ba77a14ee4cef3d0b2f5f0a46e3d4c3b171f024 --- /dev/null +++ b/lecture_material/07-recursion-and-graphs/template_lec_002.ipynb @@ -0,0 +1,1084 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2f385b68", + "metadata": {}, + "source": [ + "# Graphs\n", + "\n", + "Today: graph visualization (graphviz)\n", + "Upcoming: graph computation (from classes)\n", + "\n", + "Two main components:\n", + "- **Nodes**: some kind of entity. Examples: Person, Computer, Place, Event, etc., \n", + "- **Edges**: relationships between those entities." + ] + }, + { + "cell_type": "markdown", + "id": "3d6757a4", + "metadata": {}, + "source": [ + "### Examples\n", + "\n", + "* Git: https://www.oreilly.com/library/view/git-pocket-guide/9781449327507/ch01.html#fig0101\n", + "* Political Allignment: https://www.reddit.com/r/dataisbeautiful/comments/1q7b3s/voting_relationships_between_senators_in_the/\n", + "* Evolution: https://commons.wikimedia.org/wiki/File:The_Ancestors_Tale_Mammals_Phylogenetic_Tree_in_mya.png\n", + "* Friendship: https://facebook.com/notes/facebook-engineering/visualizing-friendships/469716398919/\n", + "* Accounting: https://wisc-ds-projects.github.io/f19/past/langston-ellen-zan.pdf#page=22\n", + "* Transit: https://arxiv.org/pdf/1611.01890.pdf#page=14\n", + "\n", + "### Graphviz Setup\n", + "\n", + "- Execute the below terminal commands\n", + "\n", + "```\n", + "sudo apt install -y graphviz\n", + "pip3 install graphviz\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ab111ed5-ded4-44f7-99e5-dae046890d44", + "metadata": {}, + "outputs": [], + "source": [ + "# import statements\n" + ] + }, + { + "cell_type": "markdown", + "id": "0505c1dd", + "metadata": {}, + "source": [ + "### `Graph` Syntax\n", + "\n", + "- Creating `Graph` object:\n", + "```python\n", + "g = Graph()\n", + "dg = Digraph()\n", + "```\n", + "- Creating a `node`:\n", + "```python\n", + "g.node(<name>, <description>)\n", + "```\n", + "- Creating an `edge`:\n", + "```python\n", + "g.edge(<SOURCE NODE>, <TARGET NODE>, label=<description>, color=<value>, pendwidth=<value>)\n", + "```\n", + "- Displaying the graph object instance invokes `_repr_svg_` (similar to `_repr_html`)\n", + "- We could directly add edges which will add missing nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5837dbd7-3989-44e0-8284-1522e852891a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"red\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaef20>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6b248218", + "metadata": {}, + "source": [ + "### Be careful: `graphviz` does not throw an error when you use incorrect parameter name!\n", + "- Read through \"graphviz attributes\" to see details: https://graphviz.org/doc/info/attrs.html." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e94f297f-b7f0-4a38-bbeb-7779fbd7b6aa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"144pt\" height=\"146pt\"\n", + " viewBox=\"0.00 0.00 144.05 146.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 142)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-142 140.05,-142 140.05,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-120\" rx=\"50.09\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-116.3\" font-family=\"Times,serif\" font-size=\"14.00\">Madison</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"50.05\" cy=\"-18\" rx=\"48.19\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"50.05\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">Chicago</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M23.81,-104.27C16.73,-98.88 9.95,-92.09 6.05,-84 0.25,-71.99 0.25,-66.01 6.05,-54 10.03,-45.74 17.02,-38.82 24.27,-33.38\"/>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">2h40</text>\n", + "<text text-anchor=\"middle\" x=\"39.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=yes</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" stroke-width=\"5\" d=\"M63.67,-102.56C67.47,-97.01 71.09,-90.55 73.05,-84 76.87,-71.23 76.87,-66.77 73.05,-54 71.09,-47.45 67.47,-40.99 63.67,-35.44\"/>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-72.8\" font-family=\"Times,serif\" font-size=\"14.00\">3h10</text>\n", + "<text text-anchor=\"middle\" x=\"105.55\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">tolls=no</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf400>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Graph()\n", + "g.node(\"A\", \"Madison\")\n", + "g.node(\"B\", \"Chicago\")\n", + "g.edge(\"A\", \"B\", label=\"2h40\\ntolls=yes\", colors=\"red\")\n", + "g.edge(\"A\", \"B\", label=\"3h10\\ntolls=no\", penwidth=\"5\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "1347be90", + "metadata": {}, + "source": [ + "## Paths\n", + "\n", + "A **path** is a sequence of edges to get from one node to another." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "426d7460", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"161pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 161.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 157,-328 157,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.6,-288.41C43.36,-277.41 37.81,-263.03 33.54,-251.96\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M57.65,-287.91C59.68,-277.57 61.98,-264.09 63,-252 69.72,-172.28 69.72,-151.72 63,-72 61.98,-59.91 59.68,-46.43 57.65,-36.09\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"126\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"126\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aaf520>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.node(\"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "923f609e", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A--B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A--B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C60.84,-278.07 48.13,-261.89 38.91,-250.16\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A--F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.49,-59.96 59.19,-46.48 57.3,-36.13\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A--E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A--E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C103.16,-278.07 115.87,-261.89 125.09,-250.16\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B--C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B--C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-204.85 27,-190.92 27,-180.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C--D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C--D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-132.85 27,-118.92 27,-108.1\"/>\n", + "</g>\n", + "<!-- D--F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D--F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C37.64,-61.41 43.19,-47.03 47.46,-35.96\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Graph at 0x7f0c27aafca0>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# connected\n", + "g = Graph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "22ff8ea7", + "metadata": {}, + "source": [ + "### Observations:\n", + "\n", + "- no path between A and E\n", + "- B => A => F is a path\n", + "- B => C => D => F is a path\n", + "- future: what is the SHORTEST path between two nodes\n", + "\n", + "### More terminology\n", + "\n", + "- **connected** means there is a path between any two nodes\n", + "- **cycle** means a path with same start+end, no repeating edges; for example: A,B,C,D,F,A" + ] + }, + { + "cell_type": "markdown", + "id": "274d67e1", + "metadata": {}, + "source": [ + "## Directed Graphs: DAGs (Directed Acyclic Graphs - no cycles)\n", + "\n", + "- **parent** means the outgoing end of an edge\n", + "- **child** means the incoming end of an edge\n", + "- **strongly connected** (same as **connected** with direction) => there's a path from any start to any end\n", + "- **weakly connected** => it would be connected if we ignored the direction of edges" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c1877373", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-287.7C99,-279.98 99,-270.71 99,-262.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-262.1 99,-252.1 95.5,-262.1 102.5,-262.1\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf250>" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# weakly connected\n", + "# cyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f168d058", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"152pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 152.25 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 148.25,-328 148.25,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-290.83C74.25,-280.94 60.48,-267.55 48.97,-256.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-253.85 41.8,-249.38 46.53,-258.87 51.41,-253.85\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.16,-288.41C92.3,-280.51 92.05,-270.85 92.41,-261.94\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"95.9,-262.18 93.12,-251.96 88.92,-261.68 95.9,-262.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M35.35,-216.76C39.71,-208.28 45.15,-197.71 50.04,-188.2\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"53.23,-189.64 54.7,-179.15 47.01,-186.44 53.23,-189.64\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M67.36,-144.05C69.39,-136.14 71.86,-126.54 74.14,-117.69\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"77.58,-118.35 76.68,-107.79 70.8,-116.6 77.58,-118.35\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"108\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"108\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M87.4,-72.41C90.51,-64.34 94.33,-54.43 97.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"101.13,-46.55 101.46,-35.96 94.6,-44.03 101.13,-46.55\"/>\n", + "</g>\n", + "<!-- F->A -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>F->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M114.43,-35.52C128.54,-74.25 159.12,-173.57 135,-252 131.71,-262.69 125.46,-273.15 119.07,-281.92\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"116.12,-280.02 112.75,-290.07 121.65,-284.31 116.12,-280.02\"/>\n", + "</g>\n", + "<!-- E->A -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>E->A</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M104.88,-251.96C105.71,-259.83 105.95,-269.37 105.58,-278.19\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.07,-278.18 104.84,-288.41 109.06,-278.69 102.07,-278.18\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf5e0>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# strongly connected\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"F\", \"A\")\n", + "g.edge(\"A\", \"E\")\n", + "g.edge(\"E\", \"A\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "db52edf9", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aafc40>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# acyclic\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "257bf913", + "metadata": {}, + "source": [ + "## Trees\n", + "\n", + "- **Tree**: DAG where one node (the **root**) has no parents and all others have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: is any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "7e04db8c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"172pt\" height=\"332pt\"\n", + " viewBox=\"0.00 0.00 172.00 332.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 328)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-328 168,-328 168,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"82\" cy=\"-306\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"82\" y=\"-302.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.07,-289.81C62.79,-280.55 53.34,-268.52 45.15,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.84,-255.86 38.91,-250.16 42.34,-260.18 47.84,-255.86\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"54\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"54\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M81.12,-287.99C79.02,-249.45 73.1,-152.54 63,-72 61.94,-63.54 60.49,-54.36 59.06,-46.06\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"62.49,-45.36 57.3,-36.13 55.6,-46.59 62.49,-45.36\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"137\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"137\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M93.93,-289.81C101.21,-280.55 110.66,-268.52 118.85,-258.09\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"121.66,-260.18 125.09,-250.16 116.16,-255.86 121.66,-260.18\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-215.7C27,-207.98 27,-198.71 27,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-190.1 27,-180.1 23.5,-190.1 30.5,-190.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>D->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M33.4,-72.41C36.51,-64.34 40.33,-54.43 43.83,-45.35\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"47.13,-46.55 47.46,-35.96 40.6,-44.03 47.13,-46.55\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c27aaf7c0>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "17e1112d-701e-4be8-9698-cde5dde4c598", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"260pt\"\n", + " viewBox=\"0.00 0.00 206.00 260.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 256)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-256 202,-256 202,4 -4,4\"/>\n", + "<!-- A -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>A</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-234\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-230.3\" font-family=\"Times,serif\" font-size=\"14.00\">A</text>\n", + "</g>\n", + "<!-- B -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>B</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">B</text>\n", + "</g>\n", + "<!-- A->B -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>A->B</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.43,-218.83C74.25,-208.94 60.48,-195.55 48.97,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"51.41,-181.85 41.8,-177.38 46.53,-186.87 51.41,-181.85\"/>\n", + "</g>\n", + "<!-- F -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>F</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">F</text>\n", + "</g>\n", + "<!-- A->F -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>A->F</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-215.7C99,-207.98 99,-198.71 99,-190.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-190.1 99,-180.1 95.5,-190.1 102.5,-190.1\"/>\n", + "</g>\n", + "<!-- E -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>E</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-162\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-158.3\" font-family=\"Times,serif\" font-size=\"14.00\">E</text>\n", + "</g>\n", + "<!-- A->E -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>A->E</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M113.57,-218.83C123.75,-208.94 137.52,-195.55 149.03,-184.36\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"151.47,-186.87 156.2,-177.38 146.59,-181.85 151.47,-186.87\"/>\n", + "</g>\n", + "<!-- C -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>C</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-90\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-86.3\" font-family=\"Times,serif\" font-size=\"14.00\">C</text>\n", + "</g>\n", + "<!-- B->C -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>B->C</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-143.7C27,-135.98 27,-126.71 27,-118.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-118.1 27,-108.1 23.5,-118.1 30.5,-118.1\"/>\n", + "</g>\n", + "<!-- D -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>D</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">D</text>\n", + "</g>\n", + "<!-- C->D -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>C->D</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-71.7C27,-63.98 27,-54.71 27,-46.11\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.1 27,-36.1 23.5,-46.1 30.5,-46.1\"/>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f0c240d8310>" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# not a tree\n", + "g = Digraph()\n", + "g.edge(\"A\", \"B\")\n", + "g.edge(\"B\", \"C\")\n", + "g.edge(\"C\", \"D\")\n", + "#g.edge(\"D\", \"F\")\n", + "g.edge(\"A\", \"F\")\n", + "g.edge(\"A\", \"E\")\n", + "g" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/07-recursion-and-graphs/worksheet-4.pdf b/lecture_material/07-recursion-and-graphs/worksheet-4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fa406cdcbd5a1eed299469fddd4d7fd193cbfe25 Binary files /dev/null and b/lecture_material/07-recursion-and-graphs/worksheet-4.pdf differ diff --git a/lecture_material/08-trees/reading.ipynb b/lecture_material/08-trees/reading.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..34e182cc22391be447d12adc17141b0252d6ae2b --- /dev/null +++ b/lecture_material/08-trees/reading.ipynb @@ -0,0 +1,3208 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Search Trees\n", + "\n", + "In this reading, we'll learn about how to use trees as an efficient way to search for data.\n", + "\n", + "By the end, you should be comfortable with the following terms:\n", + "* binary tree\n", + "* search\n", + "* range query\n", + "* binary search tree\n", + "* balanced tree\n", + "\n", + "formatting..." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": [ + "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", + " return false;\n", + "}\n" + ], + "text/plain": [ + "<IPython.core.display.Javascript object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%%javascript\n", + "IPython.OutputArea.prototype._should_scroll = function(lines) {\n", + " return false;\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "from graphviz import Graph, Digraph" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary Tree\n", + "\n", + "Below is a binary tree, cleaned up from last time.\n", + "\n", + "Remember that a tree is a directed graph. It has one root node (that is, a node without a parent). Every other node has a parent. Nodes without children are called leaves.\n", + "\n", + "This tree is a *binary tree* because each node has at most two children." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n", + "<!-- 'A' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n", + "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A'->'C' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'A'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n", + "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Y' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "<!-- 'B'->'Y' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'Y'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n", + "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'X' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "<!-- 'B'->'X' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'X'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Z' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'Z'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Z'</text>\n", + "</g>\n", + "<!-- 'C'->'Z' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'C'->'Z'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e0a0>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "class Node:\n", + " def __init__(self, val):\n", + " self.val = val\n", + " self.left = None\n", + " self.right = None\n", + " \n", + " def to_graphviz(self, g=None):\n", + " if g == None:\n", + " g = Digraph()\n", + " \n", + " # draw self\n", + " g.node(repr(self.val))\n", + " \n", + " for label, child in [(\"L\", self.left), (\"R\", self.right)]:\n", + " if child != None:\n", + " # draw child, recursively\n", + " child.to_graphviz(g)\n", + " \n", + " # draw edge from self to child\n", + " g.edge(repr(self.val), repr(child.val), label=label)\n", + " return g\n", + " \n", + " def _repr_svg_(self):\n", + " return self.to_graphviz()._repr_image_svg_xml()\n", + " \n", + "root = Node(\"A\")\n", + "root.left = Node(\"B\")\n", + "root.right = Node(\"C\")\n", + "root.left.left = Node(\"Y\")\n", + "root.left.right = Node(\"X\")\n", + "root.right.right = Node(\"Z\")\n", + "root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Search\n", + "\n", + "What if we want to check whether a tree *contains* a value? We know it does if one of the following is true:\n", + "\n", + "1. the root has that value\n", + "2. the left subtree contains that value\n", + "3. the right subtree contains that value\n", + "\n", + "Let's write a recursive function, `contains`, to do this search. At each step, we'll display the subtree being searched." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "Is the root B?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n", + "<!-- 'A' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n", + "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A'->'C' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'A'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n", + "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Y' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "<!-- 'B'->'Y' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'Y'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n", + "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'X' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "<!-- 'B'->'X' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'X'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Z' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'Z'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Z'</text>\n", + "</g>\n", + "<!-- 'C'->'Z' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'C'->'Z'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e0a0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root B?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n", + "<!-- 'B' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'Y' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "<!-- 'B'->'Y' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'Y'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'X' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "<!-- 'B'->'X' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'X'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n", + "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e100>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.core.display import display, HTML\n", + "\n", + "def contains(node, target):\n", + " if node == None:\n", + " return False\n", + "\n", + " display(HTML(\"Is the root %s?\" % target))\n", + " display(node)\n", + "\n", + " if node.val == target:\n", + " return True\n", + " return contains(node.left, target) or contains(node.right, target)\n", + "\n", + "contains(root, \"B\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cool, we found the value in the second place we looked because we check left first. What if the data is deep on the right side? Worse, what if the thing we're searching for isn't even in the tree? Let's try that:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 206.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 202,-214 202,4 -4,4\"/>\n", + "<!-- 'A' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"135\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"135\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M127.89,-174.21C122.78,-162.14 115.79,-145.64 109.97,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"113.1,-130.31 105.98,-122.47 106.65,-133.04 113.1,-130.31\"/>\n", + "<text text-anchor=\"middle\" x=\"123.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A'->'C' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'A'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M142.11,-174.21C147.22,-162.14 154.21,-145.64 160.03,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"163.35,-133.04 164.02,-122.47 156.9,-130.31 163.35,-133.04\"/>\n", + "<text text-anchor=\"middle\" x=\"160\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Y' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "<!-- 'B'->'Y' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'Y'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M86.13,-88.8C75.07,-75.75 58.96,-56.74 46.35,-41.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"48.89,-39.43 39.76,-34.06 43.55,-43.96 48.89,-39.43\"/>\n", + "<text text-anchor=\"middle\" x=\"72.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'X' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "<!-- 'B'->'X' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'X'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'Z' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'Z'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Z'</text>\n", + "</g>\n", + "<!-- 'C'->'Z' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'C'->'Z'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M171,-86.8C171,-75.16 171,-59.55 171,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"174.5,-46.18 171,-36.18 167.5,-46.18 174.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"176\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e0a0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n", + "<!-- 'B' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'Y' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "<!-- 'B'->'Y' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'Y'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'X' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "<!-- 'B'->'X' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'X'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n", + "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e100>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'Y' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'Y'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Y'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e130>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'X' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'X'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'X'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39ed60>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'Z' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'Z'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Z'</text>\n", + "</g>\n", + "<!-- 'C'->'Z' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'C'->'Z'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e0d0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Is the root M?" + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'Z' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'Z'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'Z'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39ef10>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "contains(root, \"M\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Search Tree\n", + "\n", + "Ouch, that was slow. It would be great if we could determine that an entry isn't in the tree without needing to look at every entry.\n", + "\n", + "One way we can guarantee this is if every value in a left subtree is less than the value of the parent and every value in the right subtree is greater than the value of the parent.\n", + "\n", + "## Constructing a Search Tree\n", + "\n", + "Let's create a function for adding values that guarantees this." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "# TODO: make this a method...\n", + "def add(node, val):\n", + " if node.val == val:\n", + " return # no duplicates\n", + " elif val < node.val:\n", + " if node.left != None:\n", + " add(node.left, val)\n", + " else:\n", + " node.left = Node(val)\n", + " else:\n", + " if node.right != None:\n", + " add(node.right, val)\n", + " else:\n", + " node.right = Node(val)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "root = Node(\"C\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"31.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"A\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"31.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# duplicate shouldn't be added\n", + "add(root, \"A\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 62.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 58,-214 58,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"31.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"B\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n", + "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n", + "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"E\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-174.21C50.78,-162.14 43.79,-145.64 37.97,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-130.31 33.98,-122.47 34.65,-133.04 41.1,-130.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-174.21C75.22,-162.14 82.21,-145.64 88.03,-131.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-133.04 92.02,-122.47 84.9,-130.31 91.35,-133.04\"/>\n", + "<text text-anchor=\"middle\" x=\"88\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"D1\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"305pt\"\n", + " viewBox=\"0.00 0.00 134.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 130,-301 130,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n", + "<text text-anchor=\"middle\" x=\"51.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n", + "<text text-anchor=\"middle\" x=\"88\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"D2\")\n", + "root" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"305pt\"\n", + " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n", + "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'F' -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>'F'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'F'</text>\n", + "</g>\n", + "<!-- 'E'->'F' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'E'->'F'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n", + "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "add(root, \"F\")\n", + "root" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using a Search Tree\n", + "\n", + "Now that we've built a search tree, we can write a function for efficiently searching it. It's like the previous `contains` function, but now we only need to check one child instead of checking both each time." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Is the root D2?'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"305pt\"\n", + " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n", + "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'F' -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>'F'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'F'</text>\n", + "</g>\n", + "<!-- 'E'->'F' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'E'->'F'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n", + "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Go Right'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root D2?'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n", + "<!-- 'E' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n", + "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'F' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'F'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'F'</text>\n", + "</g>\n", + "<!-- 'E'->'F' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'E'->'F'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n", + "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39b220>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Go Left'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root D2?'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n", + "<!-- 'D1' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39aaf0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Go Right'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root D2?'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'D2' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39ab20>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def contains(node, target):\n", + " if node == None:\n", + " return False\n", + "\n", + " display(\"Is the root %s?\" % target)\n", + " display(node)\n", + "\n", + " if node.val == target:\n", + " return True\n", + " \n", + " if target < node.val:\n", + " display(\"Go Left\")\n", + " return contains(node.left, target)\n", + " else:\n", + " display(\"Go Right\")\n", + " return contains(node.right, target)\n", + "\n", + "contains(root, \"D2\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Range Query\n", + "\n", + "For the previous lookups, using a Python set would probably do about as well. But what if we want get all the values in some range?\n", + "\n", + "We can write a similar function. But now, we'll sometimes need to search both sides (depending on the width of the range).\n", + "\n", + "Rather than returning found values, we can accumulate everything in a list." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Is the root C between D1 and D9'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'NO'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"206pt\" height=\"305pt\"\n", + " viewBox=\"0.00 0.00 206.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 202,-301 202,4 -4,4\"/>\n", + "<!-- 'C' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'C'->'A' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-261.21C50.78,-249.14 43.79,-232.64 37.97,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-217.31 33.98,-209.47 34.65,-220.04 41.1,-217.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'C'->'E' -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>'C'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-261.21C75.22,-249.14 82.21,-232.64 88.03,-218.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-220.04 92.02,-209.47 84.9,-217.31 91.35,-220.04\"/>\n", + "<text text-anchor=\"middle\" x=\"89\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'B' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A'->'B' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'A'->'B'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'F' -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>'F'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'F'</text>\n", + "</g>\n", + "<!-- 'E'->'F' -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>'E'->'F'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M111.87,-175.8C122.93,-162.75 139.04,-143.74 151.65,-128.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"154.45,-130.96 158.24,-121.06 149.11,-126.43 154.45,-130.96\"/>\n", + "<text text-anchor=\"middle\" x=\"145\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39e760>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root E between D1 and D9'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'NO'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n", + "<!-- 'E' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"81\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"81\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'D1' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'E'->'D1' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'E'->'D1'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.84,-175.01C62.92,-162.55 51.78,-145.01 42.72,-130.74\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"45.43,-128.48 37.11,-121.92 39.52,-132.23 45.43,-128.48\"/>\n", + "<text text-anchor=\"middle\" x=\"62.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'F' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'F'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'F'</text>\n", + "</g>\n", + "<!-- 'E'->'F' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'E'->'F'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M84.64,-173.8C87.12,-162.09 90.46,-146.34 93.29,-132.97\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"96.78,-133.39 95.42,-122.89 89.93,-131.94 96.78,-133.39\"/>\n", + "<text text-anchor=\"middle\" x=\"96\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39b220>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root D1 between D1 and D9'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'YES'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 62.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 58,-127 58,4 -4,4\"/>\n", + "<!-- 'D1' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'D1'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D1'</text>\n", + "</g>\n", + "<!-- 'D2' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "<!-- 'D1'->'D2' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'D1'->'D2'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39aaf0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'Is the root D2 between D1 and D9'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "'YES'" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"44pt\"\n", + " viewBox=\"0.00 0.00 62.00 44.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 40)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-40 58,-40 58,4 -4,4\"/>\n", + "<!-- 'D2' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'D2'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D2'</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d39ab20>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "['D1', 'D2']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def range_query(node, lower, upper, results=None):\n", + " if results == None:\n", + " results = []\n", + "\n", + " if node == None:\n", + " return results\n", + " \n", + " display(\"Is the root %s between %s and %s\" % (node.val, str(lower), str(upper)))\n", + " if lower <= node.val <= upper:\n", + " display(\"YES\")\n", + " results.append(node.val)\n", + " else:\n", + " display(\"NO\")\n", + " \n", + " display(node)\n", + "\n", + " if lower < node.val:\n", + " range_query(node.left, lower, upper, results)\n", + " if upper > node.val:\n", + " range_query(node.right, lower, upper, results)\n", + "\n", + " return results\n", + "\n", + "range_query(root, \"D1\", \"D9\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Balancing\n", + "\n", + "If the depth of all nodes are roughly equal, the time to check a values will be O(log N), which is pretty great! But the insertion order matters a lot. Let's consider these 8 numbers:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nums1 = list(range(20))\n", + "nums1" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[17, 9, 4, 18, 12, 7, 0, 6, 11, 15, 16, 3, 8, 1, 14, 19, 5, 10, 2, 13]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from numpy import random\n", + "\n", + "nums2 = nums1[:] # shallow copy\n", + "random.seed(320)\n", + "random.shuffle(nums2)\n", + "nums2" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "tree1 = Node(nums1[0])\n", + "for num in nums1[1:]:\n", + " add(tree1, num)\n", + " \n", + "tree2 = Node(nums2[0])\n", + "for num in nums2[1:]:\n", + " add(tree2, num)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"62pt\" height=\"1697pt\"\n", + " viewBox=\"0.00 0.00 62.00 1697.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 1693)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-1693 58,-1693 58,4 -4,4\"/>\n", + "<!-- 0 -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>0</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1671\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1667.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", + "</g>\n", + "<!-- 1 -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>1</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1584\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1580.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", + "</g>\n", + "<!-- 0->1 -->\n", + "<g id=\"edge19\" class=\"edge\">\n", + "<title>0->1</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1652.8C27,-1641.16 27,-1625.55 27,-1612.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1612.18 27,-1602.18 23.5,-1612.18 30.5,-1612.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1623.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 2 -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>2</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1497\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1493.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", + "</g>\n", + "<!-- 1->2 -->\n", + "<g id=\"edge18\" class=\"edge\">\n", + "<title>1->2</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1565.8C27,-1554.16 27,-1538.55 27,-1525.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1525.18 27,-1515.18 23.5,-1525.18 30.5,-1525.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1536.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 3 -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>3</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1410\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1406.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", + "</g>\n", + "<!-- 2->3 -->\n", + "<g id=\"edge17\" class=\"edge\">\n", + "<title>2->3</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1478.8C27,-1467.16 27,-1451.55 27,-1438.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1438.18 27,-1428.18 23.5,-1438.18 30.5,-1438.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1449.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 4 -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>4</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1323\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1319.3\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n", + "</g>\n", + "<!-- 3->4 -->\n", + "<g id=\"edge16\" class=\"edge\">\n", + "<title>3->4</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1391.8C27,-1380.16 27,-1364.55 27,-1351.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1351.18 27,-1341.18 23.5,-1351.18 30.5,-1351.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1362.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 5 -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>5</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1236\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1232.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n", + "</g>\n", + "<!-- 4->5 -->\n", + "<g id=\"edge15\" class=\"edge\">\n", + "<title>4->5</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1304.8C27,-1293.16 27,-1277.55 27,-1264.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1264.18 27,-1254.18 23.5,-1264.18 30.5,-1264.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1275.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 6 -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>6</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1149\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1145.3\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n", + "</g>\n", + "<!-- 5->6 -->\n", + "<g id=\"edge14\" class=\"edge\">\n", + "<title>5->6</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1217.8C27,-1206.16 27,-1190.55 27,-1177.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1177.18 27,-1167.18 23.5,-1177.18 30.5,-1177.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1188.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 7 -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>7</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-1062\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-1058.3\" font-family=\"Times,serif\" font-size=\"14.00\">7</text>\n", + "</g>\n", + "<!-- 6->7 -->\n", + "<g id=\"edge13\" class=\"edge\">\n", + "<title>6->7</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1130.8C27,-1119.16 27,-1103.55 27,-1090.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1090.18 27,-1080.18 23.5,-1090.18 30.5,-1090.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1101.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 8 -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>8</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-975\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-971.3\" font-family=\"Times,serif\" font-size=\"14.00\">8</text>\n", + "</g>\n", + "<!-- 7->8 -->\n", + "<g id=\"edge12\" class=\"edge\">\n", + "<title>7->8</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-1043.8C27,-1032.16 27,-1016.55 27,-1003.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-1003.18 27,-993.18 23.5,-1003.18 30.5,-1003.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-1014.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 9 -->\n", + "<g id=\"node10\" class=\"node\">\n", + "<title>9</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-888\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-884.3\" font-family=\"Times,serif\" font-size=\"14.00\">9</text>\n", + "</g>\n", + "<!-- 8->9 -->\n", + "<g id=\"edge11\" class=\"edge\">\n", + "<title>8->9</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-956.8C27,-945.16 27,-929.55 27,-916.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-916.18 27,-906.18 23.5,-916.18 30.5,-916.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-927.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 10 -->\n", + "<g id=\"node11\" class=\"node\">\n", + "<title>10</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-801\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-797.3\" font-family=\"Times,serif\" font-size=\"14.00\">10</text>\n", + "</g>\n", + "<!-- 9->10 -->\n", + "<g id=\"edge10\" class=\"edge\">\n", + "<title>9->10</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-869.8C27,-858.16 27,-842.55 27,-829.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-829.18 27,-819.18 23.5,-829.18 30.5,-829.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-840.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 11 -->\n", + "<g id=\"node12\" class=\"node\">\n", + "<title>11</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-714\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-710.3\" font-family=\"Times,serif\" font-size=\"14.00\">11</text>\n", + "</g>\n", + "<!-- 10->11 -->\n", + "<g id=\"edge9\" class=\"edge\">\n", + "<title>10->11</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-782.8C27,-771.16 27,-755.55 27,-742.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-742.18 27,-732.18 23.5,-742.18 30.5,-742.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-753.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 12 -->\n", + "<g id=\"node13\" class=\"node\">\n", + "<title>12</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-627\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-623.3\" font-family=\"Times,serif\" font-size=\"14.00\">12</text>\n", + "</g>\n", + "<!-- 11->12 -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>11->12</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-695.8C27,-684.16 27,-668.55 27,-655.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-655.18 27,-645.18 23.5,-655.18 30.5,-655.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-666.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 13 -->\n", + "<g id=\"node14\" class=\"node\">\n", + "<title>13</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-540\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-536.3\" font-family=\"Times,serif\" font-size=\"14.00\">13</text>\n", + "</g>\n", + "<!-- 12->13 -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>12->13</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-608.8C27,-597.16 27,-581.55 27,-568.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-568.18 27,-558.18 23.5,-568.18 30.5,-568.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-579.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 14 -->\n", + "<g id=\"node15\" class=\"node\">\n", + "<title>14</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">14</text>\n", + "</g>\n", + "<!-- 13->14 -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>13->14</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-521.8C27,-510.16 27,-494.55 27,-481.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-481.18 27,-471.18 23.5,-481.18 30.5,-481.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 15 -->\n", + "<g id=\"node16\" class=\"node\">\n", + "<title>15</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">15</text>\n", + "</g>\n", + "<!-- 14->15 -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>14->15</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-434.8C27,-423.16 27,-407.55 27,-394.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-394.18 27,-384.18 23.5,-394.18 30.5,-394.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 16 -->\n", + "<g id=\"node17\" class=\"node\">\n", + "<title>16</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">16</text>\n", + "</g>\n", + "<!-- 15->16 -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>15->16</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-347.8C27,-336.16 27,-320.55 27,-307.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-307.18 27,-297.18 23.5,-307.18 30.5,-307.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 17 -->\n", + "<g id=\"node18\" class=\"node\">\n", + "<title>17</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">17</text>\n", + "</g>\n", + "<!-- 16->17 -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>16->17</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-260.8C27,-249.16 27,-233.55 27,-220.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-220.18 27,-210.18 23.5,-220.18 30.5,-220.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 18 -->\n", + "<g id=\"node19\" class=\"node\">\n", + "<title>18</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">18</text>\n", + "</g>\n", + "<!-- 17->18 -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>17->18</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 19 -->\n", + "<g id=\"node20\" class=\"node\">\n", + "<title>19</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">19</text>\n", + "</g>\n", + "<!-- 18->19 -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>18->19</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d7f5340>" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# lookup with be very slow!\n", + "tree1" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"422pt\" height=\"566pt\"\n", + " viewBox=\"0.00 0.00 422.00 566.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 562)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-562 418,-562 418,4 -4,4\"/>\n", + "<!-- 17 -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>17</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"279\" cy=\"-540\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"279\" y=\"-536.3\" font-family=\"Times,serif\" font-size=\"14.00\">17</text>\n", + "</g>\n", + "<!-- 9 -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>9</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">9</text>\n", + "</g>\n", + "<!-- 17->9 -->\n", + "<g id=\"edge17\" class=\"edge\">\n", + "<title>17->9</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M271.89,-522.21C266.78,-510.14 259.79,-493.64 253.97,-479.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"257.1,-478.31 249.98,-470.47 250.65,-481.04 257.1,-478.31\"/>\n", + "<text text-anchor=\"middle\" x=\"267.5\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 18 -->\n", + "<g id=\"node19\" class=\"node\">\n", + "<title>18</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-453\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"315\" y=\"-449.3\" font-family=\"Times,serif\" font-size=\"14.00\">18</text>\n", + "</g>\n", + "<!-- 17->18 -->\n", + "<g id=\"edge19\" class=\"edge\">\n", + "<title>17->18</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M286.11,-522.21C291.22,-510.14 298.21,-493.64 304.03,-479.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"307.35,-481.04 308.02,-470.47 300.9,-478.31 307.35,-481.04\"/>\n", + "<text text-anchor=\"middle\" x=\"304\" y=\"-492.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 4 -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>4</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"162\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"162\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">4</text>\n", + "</g>\n", + "<!-- 9->4 -->\n", + "<g id=\"edge9\" class=\"edge\">\n", + "<title>9->4</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M228.89,-437.19C216.23,-423.91 197.48,-404.23 183.04,-389.08\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"185.38,-386.46 175.95,-381.64 180.31,-391.29 185.38,-386.46\"/>\n", + "<text text-anchor=\"middle\" x=\"212.5\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 12 -->\n", + "<g id=\"node12\" class=\"node\">\n", + "<title>12</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">12</text>\n", + "</g>\n", + "<!-- 9->12 -->\n", + "<g id=\"edge16\" class=\"edge\">\n", + "<title>9->12</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M243,-434.8C243,-423.16 243,-407.55 243,-394.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-394.18 243,-384.18 239.5,-394.18 246.5,-394.18\"/>\n", + "<text text-anchor=\"middle\" x=\"248\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 0 -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>0</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"72\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"72\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">0</text>\n", + "</g>\n", + "<!-- 4->0 -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>4->0</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M147.14,-350.96C132.81,-337.43 110.93,-316.77 94.47,-301.22\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"96.56,-298.38 86.88,-294.06 91.75,-303.47 96.56,-298.38\"/>\n", + "<text text-anchor=\"middle\" x=\"127.5\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 7 -->\n", + "<g id=\"node8\" class=\"node\">\n", + "<title>7</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"162\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"162\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">7</text>\n", + "</g>\n", + "<!-- 4->7 -->\n", + "<g id=\"edge8\" class=\"edge\">\n", + "<title>4->7</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M162,-347.8C162,-336.16 162,-320.55 162,-307.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"165.5,-307.18 162,-297.18 158.5,-307.18 165.5,-307.18\"/>\n", + "<text text-anchor=\"middle\" x=\"167\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 3 -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>3</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", + "</g>\n", + "<!-- 0->3 -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>0->3</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M63.32,-261.61C56.85,-249.38 47.88,-232.44 40.48,-218.46\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"43.42,-216.54 35.65,-209.34 37.24,-219.81 43.42,-216.54\"/>\n", + "<text text-anchor=\"middle\" x=\"58\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 1 -->\n", + "<g id=\"node6\" class=\"node\">\n", + "<title>1</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", + "</g>\n", + "<!-- 3->1 -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>3->1</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-173.8C27,-162.16 27,-146.55 27,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-133.18 27,-123.18 23.5,-133.18 30.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"31.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 2 -->\n", + "<g id=\"node7\" class=\"node\">\n", + "<title>2</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", + "</g>\n", + "<!-- 1->2 -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>1->2</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M27,-86.8C27,-75.16 27,-59.55 27,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"30.5,-46.18 27,-36.18 23.5,-46.18 30.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"32\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 6 -->\n", + "<g id=\"node9\" class=\"node\">\n", + "<title>6</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">6</text>\n", + "</g>\n", + "<!-- 7->6 -->\n", + "<g id=\"edge6\" class=\"edge\">\n", + "<title>7->6</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M150.44,-262.41C140.94,-249.59 127.33,-231.22 116.49,-216.6\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"119.25,-214.44 110.48,-208.49 113.62,-218.61 119.25,-214.44\"/>\n", + "<text text-anchor=\"middle\" x=\"139.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 8 -->\n", + "<g id=\"node11\" class=\"node\">\n", + "<title>8</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"171\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"171\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">8</text>\n", + "</g>\n", + "<!-- 7->8 -->\n", + "<g id=\"edge7\" class=\"edge\">\n", + "<title>7->8</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M163.82,-260.8C165.05,-249.16 166.71,-233.55 168.12,-220.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"171.61,-220.49 169.18,-210.18 164.65,-219.75 171.61,-220.49\"/>\n", + "<text text-anchor=\"middle\" x=\"173\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 5 -->\n", + "<g id=\"node10\" class=\"node\">\n", + "<title>5</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">5</text>\n", + "</g>\n", + "<!-- 6->5 -->\n", + "<g id=\"edge5\" class=\"edge\">\n", + "<title>6->5</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"103.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 11 -->\n", + "<g id=\"node13\" class=\"node\">\n", + "<title>11</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">11</text>\n", + "</g>\n", + "<!-- 12->11 -->\n", + "<g id=\"edge11\" class=\"edge\">\n", + "<title>12->11</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M243,-347.8C243,-336.16 243,-320.55 243,-307.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-307.18 243,-297.18 239.5,-307.18 246.5,-307.18\"/>\n", + "<text text-anchor=\"middle\" x=\"247.5\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 15 -->\n", + "<g id=\"node15\" class=\"node\">\n", + "<title>15</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"315\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">15</text>\n", + "</g>\n", + "<!-- 12->15 -->\n", + "<g id=\"edge15\" class=\"edge\">\n", + "<title>12->15</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M255.87,-349.8C266.93,-336.75 283.04,-317.74 295.65,-302.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"298.45,-304.96 302.24,-295.06 293.11,-300.43 298.45,-304.96\"/>\n", + "<text text-anchor=\"middle\" x=\"288\" y=\"-318.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 10 -->\n", + "<g id=\"node14\" class=\"node\">\n", + "<title>10</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"243\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"243\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">10</text>\n", + "</g>\n", + "<!-- 11->10 -->\n", + "<g id=\"edge10\" class=\"edge\">\n", + "<title>11->10</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M243,-260.8C243,-249.16 243,-233.55 243,-220.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"246.5,-220.18 243,-210.18 239.5,-220.18 246.5,-220.18\"/>\n", + "<text text-anchor=\"middle\" x=\"247.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 14 -->\n", + "<g id=\"node16\" class=\"node\">\n", + "<title>14</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"315\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">14</text>\n", + "</g>\n", + "<!-- 15->14 -->\n", + "<g id=\"edge13\" class=\"edge\">\n", + "<title>15->14</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M315,-260.8C315,-249.16 315,-233.55 315,-220.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-220.18 315,-210.18 311.5,-220.18 318.5,-220.18\"/>\n", + "<text text-anchor=\"middle\" x=\"319.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 16 -->\n", + "<g id=\"node18\" class=\"node\">\n", + "<title>16</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"387\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"387\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">16</text>\n", + "</g>\n", + "<!-- 15->16 -->\n", + "<g id=\"edge14\" class=\"edge\">\n", + "<title>15->16</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M327.87,-262.8C338.93,-249.75 355.04,-230.74 367.65,-215.85\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"370.45,-217.96 374.24,-208.06 365.11,-213.43 370.45,-217.96\"/>\n", + "<text text-anchor=\"middle\" x=\"360\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 13 -->\n", + "<g id=\"node17\" class=\"node\">\n", + "<title>13</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"315\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">13</text>\n", + "</g>\n", + "<!-- 14->13 -->\n", + "<g id=\"edge12\" class=\"edge\">\n", + "<title>14->13</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M315,-173.8C315,-162.16 315,-146.55 315,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-133.18 315,-123.18 311.5,-133.18 318.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"319.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 19 -->\n", + "<g id=\"node20\" class=\"node\">\n", + "<title>19</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"315\" cy=\"-366\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"315\" y=\"-362.3\" font-family=\"Times,serif\" font-size=\"14.00\">19</text>\n", + "</g>\n", + "<!-- 18->19 -->\n", + "<g id=\"edge18\" class=\"edge\">\n", + "<title>18->19</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M315,-434.8C315,-423.16 315,-407.55 315,-394.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"318.5,-394.18 315,-384.18 311.5,-394.18 318.5,-394.18\"/>\n", + "<text text-anchor=\"middle\" x=\"320\" y=\"-405.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17d3bc8e0>" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a bit better!\n", + "tree2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Balance\n", + "\n", + "The second tree is definitely a lot more balanced than the first. If we really want to measure this, we would like to identify openings that are shallower than the deepest nodes." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(2, 6)" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def nearest_open(node):\n", + " if node is None:\n", + " return 0\n", + " return min(nearest_open(node.left), nearest_open(node.right)) + 1\n", + "\n", + "def max_depth(node):\n", + " if node is None or (node.left is None and node.right is None):\n", + " return 0\n", + " return 1 + max(max_depth(node.left), max_depth(node.right))\n", + "\n", + "nearest_open(tree2), max_depth(tree2)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def is_balanced(node):\n", + " return nearest_open(node) >= max_depth(node)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n", + "<!-- 'B' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B'->'A' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n", + "<text text-anchor=\"middle\" x=\"52.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'B'->'C' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'B'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n", + "<text text-anchor=\"middle\" x=\"88\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17e0a83a0>" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test is_balanced\n", + "t = Node(\"B\")\n", + "t.left = Node(\"A\")\n", + "t.right = Node(\"C\")\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"218pt\"\n", + " viewBox=\"0.00 0.00 134.00 218.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 214)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-214 130,-214 130,4 -4,4\"/>\n", + "<!-- 'B' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"53\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"53\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B'->'A' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.86,-174.21C44.23,-162.33 39.29,-146.17 35.12,-132.56\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"38.4,-131.3 32.13,-122.76 31.7,-133.34 38.4,-131.3\"/>\n", + "<text text-anchor=\"middle\" x=\"45.5\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'B'->'C' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'B'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M61.87,-174.61C68.53,-162.3 77.77,-145.23 85.37,-131.19\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"88.63,-132.51 90.31,-122.05 82.48,-129.18 88.63,-132.51\"/>\n", + "<text text-anchor=\"middle\" x=\"83\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'D'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D'</text>\n", + "</g>\n", + "<!-- 'C'->'D' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'C'->'D'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17e0a83a0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t.right.right = Node(\"D\")\n", + "display(t)\n", + "is_balanced(t)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.44.1 (20200629.0846)\n", + " -->\n", + "<!-- Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"305pt\"\n", + " viewBox=\"0.00 0.00 134.00 305.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 301)\">\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-301 130,-301 130,4 -4,4\"/>\n", + "<!-- 'B' -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>'B'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"53\" cy=\"-279\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"53\" y=\"-275.3\" font-family=\"Times,serif\" font-size=\"14.00\">'B'</text>\n", + "</g>\n", + "<!-- 'A' -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>'A'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'A'</text>\n", + "</g>\n", + "<!-- 'B'->'A' -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>'B'->'A'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M47.86,-261.21C44.23,-249.33 39.29,-233.17 35.12,-219.56\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"38.4,-218.3 32.13,-209.76 31.7,-220.34 38.4,-218.3\"/>\n", + "<text text-anchor=\"middle\" x=\"45.5\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">L</text>\n", + "</g>\n", + "<!-- 'C' -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>'C'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-192\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-188.3\" font-family=\"Times,serif\" font-size=\"14.00\">'C'</text>\n", + "</g>\n", + "<!-- 'B'->'C' -->\n", + "<g id=\"edge4\" class=\"edge\">\n", + "<title>'B'->'C'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M61.87,-261.61C68.53,-249.3 77.77,-232.23 85.37,-218.19\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"88.63,-219.51 90.31,-209.05 82.48,-216.18 88.63,-219.51\"/>\n", + "<text text-anchor=\"middle\" x=\"83\" y=\"-231.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'D' -->\n", + "<g id=\"node4\" class=\"node\">\n", + "<title>'D'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">'D'</text>\n", + "</g>\n", + "<!-- 'C'->'D' -->\n", + "<g id=\"edge3\" class=\"edge\">\n", + "<title>'C'->'D'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-173.8C99,-162.16 99,-146.55 99,-133.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-133.18 99,-123.18 95.5,-133.18 102.5,-133.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-144.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "<!-- 'E' -->\n", + "<g id=\"node5\" class=\"node\">\n", + "<title>'E'</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">'E'</text>\n", + "</g>\n", + "<!-- 'D'->'E' -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>'D'->'E'</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M99,-86.8C99,-75.16 99,-59.55 99,-46.24\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"102.5,-46.18 99,-36.18 95.5,-46.18 102.5,-46.18\"/>\n", + "<text text-anchor=\"middle\" x=\"104\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">R</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<__main__.Node at 0x7fd17e0a83a0>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t.right.right.right = Node(\"E\")\n", + "display(t)\n", + "is_balanced(t)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Conclusion\n", + "\n", + "In this reading, we have seen that a binary tree is a BST (Binary Search Tree) if all the left descendents of a node have lesser values than the node, and all the right descendents have greater values. Binary search trees allow us to find values and ranges of values without checking every node.\n", + "\n", + "In a perfectly balanced tree, looking for a single item is O(log N). A tree if balanced if there are no nodes that could be moved closer to the root.\n", + "\n", + "Randomizing insertion order can improve balance. There are also algorithms (not covered) to rearrange trees as values are inserted, maintaining balance (perhaps within some tolerance)." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lecture_material/08-trees/solution.ipynb b/lecture_material/08-trees/solution.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a39e00275f29a506fab7f963dc1421cb4f0dfdd5 --- /dev/null +++ b/lecture_material/08-trees/solution.ipynb @@ -0,0 +1,478 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d684d88e-e96d-4392-b4d6-92d3f1669b32", + "metadata": {}, + "source": [ + "# Binary Search Trees" + ] + }, + { + "cell_type": "markdown", + "id": "8da93b35", + "metadata": {}, + "source": [ + "### Review **tree** terminology:\n", + "\n", + "- **Tree**: DAG (directed acyclic graph) with exactly one **root** (has no parents) and all other nodes have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "66ba808a", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Graph, Digraph" + ] + }, + { + "cell_type": "markdown", + "id": "8b758d75", + "metadata": {}, + "source": [ + "### Is this a tree? If not, how do we make it into a tree?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d62b95dc-9f28-4e6e-a3a0-e0aac6e6eb3b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/svg+xml": [ + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n", + "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n", + " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n", + "<!-- Generated by graphviz version 2.43.0 (0)\n", + " -->\n", + "<!-- Title: %3 Pages: 1 -->\n", + "<svg width=\"134pt\" height=\"131pt\"\n", + " viewBox=\"0.00 0.00 134.00 131.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n", + "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 127)\">\n", + "<title>%3</title>\n", + "<polygon fill=\"white\" stroke=\"transparent\" points=\"-4,4 -4,-127 130,-127 130,4 -4,4\"/>\n", + "<!-- 1 -->\n", + "<g id=\"node1\" class=\"node\">\n", + "<title>1</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"63\" cy=\"-105\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"63\" y=\"-101.3\" font-family=\"Times,serif\" font-size=\"14.00\">1</text>\n", + "</g>\n", + "<!-- 2 -->\n", + "<g id=\"node2\" class=\"node\">\n", + "<title>2</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"27\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"27\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">2</text>\n", + "</g>\n", + "<!-- 1->2 -->\n", + "<g id=\"edge1\" class=\"edge\">\n", + "<title>1->2</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M55.89,-87.21C50.78,-75.14 43.79,-58.64 37.97,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"41.1,-43.31 33.98,-35.47 34.65,-46.04 41.1,-43.31\"/>\n", + "<text text-anchor=\"middle\" x=\"60.5\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">left</text>\n", + "</g>\n", + "<!-- 3 -->\n", + "<g id=\"node3\" class=\"node\">\n", + "<title>3</title>\n", + "<ellipse fill=\"none\" stroke=\"black\" cx=\"99\" cy=\"-18\" rx=\"27\" ry=\"18\"/>\n", + "<text text-anchor=\"middle\" x=\"99\" y=\"-14.3\" font-family=\"Times,serif\" font-size=\"14.00\">3</text>\n", + "</g>\n", + "<!-- 1->3 -->\n", + "<g id=\"edge2\" class=\"edge\">\n", + "<title>1->3</title>\n", + "<path fill=\"none\" stroke=\"black\" d=\"M70.11,-87.21C75.22,-75.14 82.21,-58.64 88.03,-44.89\"/>\n", + "<polygon fill=\"black\" stroke=\"black\" points=\"91.35,-46.04 92.02,-35.47 84.9,-43.31 91.35,-46.04\"/>\n", + "<text text-anchor=\"middle\" x=\"101\" y=\"-57.8\" font-family=\"Times,serif\" font-size=\"14.00\">right</text>\n", + "</g>\n", + "</g>\n", + "</svg>\n" + ], + "text/plain": [ + "<graphviz.graphs.Digraph at 0x7f4eb821ab90>" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = Digraph()\n", + "g.edge(\"1\", \"2\", label=\"left\")\n", + "g.edge(\"1\", \"3\", label=\"right\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "aa0f43f8", + "metadata": {}, + "source": [ + "### Special cases of trees\n", + "- **Linked list**: a tree, where each node has *at most* one child\n", + "- **Binary tree**: a tree, where each has *at most* two children" + ] + }, + { + "cell_type": "markdown", + "id": "61015756", + "metadata": {}, + "source": [ + "### Review: recursive functions\n", + "1. *Category 1*: functions that return some computation\n", + "2. *Category 2*: functions that do some action (for example: printing, appending, etc.,)" + ] + }, + { + "cell_type": "markdown", + "id": "a6b914b2", + "metadata": {}, + "source": [ + "## Binary tree" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "847dc240-ca01-4f1a-a4d7-13fed4fe3995", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 1 \n", + "\t 2 (LEFT)\n", + "\t\t 4 (LEFT)\n", + "\t 3 (RIGHT)\n" + ] + } + ], + "source": [ + "# TODO: define Node class\n", + "class Node:\n", + " def __init__(self, label):\n", + " self.label = label\n", + " self.left = None\n", + " self.right = None\n", + " \n", + "\n", + " # Category 2: functions that do some action\n", + " def dump(self, prefix=\"\", suffix=\"\"):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " # TODO: what is the simplest example in this case?\n", + " print(prefix, self.label, suffix)\n", + " # recurse left\n", + " if self.left != None:\n", + " self.left.dump(prefix+\"\\t\", \"(LEFT)\")\n", + " # recurse right\n", + " if self.right != None:\n", + " self.right.dump(prefix+\"\\t\", \"(RIGHT)\")\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " if target == self.label:\n", + " return True\n", + "\n", + " if self.left != None:\n", + " if self.left.search(target):\n", + " return True\n", + " \n", + " if self.right != None:\n", + " if self.right.search(target):\n", + " return True\n", + " \n", + " return False\n", + "\n", + "node1 = Node(1)\n", + "node2 = Node(2)\n", + "node3 = Node(3)\n", + "node4 = Node(4)\n", + "node1.left = node2\n", + "node1.right = node3\n", + "node2.left = node4\n", + "node1.dump()" + ] + }, + { + "cell_type": "markdown", + "id": "e81ed3ef", + "metadata": {}, + "source": [ + "### Let's come up with testcases for `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c5248d0a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "True\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "print(node1.search(1)) # should be True\n", + "print(node1.search(2)) # should be True\n", + "print(node1.search(3)) # should be True\n", + "print(node1.search(4)) # should be True\n", + "print(node1.search(5)) # should be False" + ] + }, + { + "cell_type": "markdown", + "id": "c05e82e7", + "metadata": {}, + "source": [ + "#### How many times is search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: **O(N)**" + ] + }, + { + "cell_type": "markdown", + "id": "3c372194", + "metadata": {}, + "source": [ + "## Binary Search Tree\n", + "\n", + "- special case of *Binary trees*\n", + "- **BST rule**: any node's value is bigger than every value in its left subtree, and and smaller than every value in its right subtree\n", + "- TODO: write an efficient search for a BST (better complexity than O(N)\n", + "- TODO: write a method to add values to a BST, while preserving the BST rule" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "894a39d2-5e3b-4178-bc1b-dedf0b5a86c0", + "metadata": {}, + "outputs": [], + "source": [ + "class BSTNode:\n", + " def __init__(self, label):\n", + " self.label = label\n", + " self.left = None\n", + " self.right = None\n", + " \n", + " # Category 2: functions that do some action\n", + " def dump(self, prefix=\"\", suffix=\"\"):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " print(prefix, self.label, suffix)\n", + " if self.left != None:\n", + " self.left.dump(prefix+\"\\t\", \"(LEFT)\")\n", + " if self.right != None:\n", + " self.right.dump(prefix+\"\\t\", \"(RIGHT)\")\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " if target == self.label:\n", + " return True\n", + " elif target < self.label:\n", + " if self.left != None:\n", + " if self.left.search(target):\n", + " return True\n", + " elif target > self.label:\n", + " if self.right != None:\n", + " if self.right.search(target):\n", + " return True\n", + " \n", + " return False" + ] + }, + { + "cell_type": "markdown", + "id": "1d6935d8", + "metadata": {}, + "source": [ + "### Does this tree satisfy BST rule? If not, which node violates it and how can we fix its position?\n", + "- Let's not displace other children node to find a new spot for the node in violation of BST rule." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7047d184", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 10 \n", + "\t 2 (LEFT)\n", + "\t\t 1 (LEFT)\n", + "\t\t 4 (RIGHT)\n", + "\t\t\t 3 (LEFT)\n", + "\t 15 (RIGHT)\n", + "\t\t 12 (LEFT)\n", + "\t\t\t 8 (LEFT)\n", + "\t\t 19 (RIGHT)\n" + ] + } + ], + "source": [ + "root = BSTNode(10)\n", + "root.left = BSTNode(2)\n", + "root.left.left = BSTNode(1)\n", + "root.left.right = BSTNode(4)\n", + "root.left.right.left = BSTNode(3)\n", + "root.right = BSTNode(15)\n", + "root.right.left = BSTNode(12)\n", + "root.right.right = BSTNode(19)\n", + "root.right.left.left = BSTNode(8)\n", + "root.dump()" + ] + }, + { + "cell_type": "markdown", + "id": "1d56266b", + "metadata": {}, + "source": [ + "### BST after fix" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dfbfc6e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 10 \n", + "\t 2 (LEFT)\n", + "\t\t 1 (LEFT)\n", + "\t\t 4 (RIGHT)\n", + "\t\t\t 3 (LEFT)\n", + "\t\t\t 8 (RIGHT)\n", + "\t 15 (RIGHT)\n", + "\t\t 12 (LEFT)\n", + "\t\t 19 (RIGHT)\n" + ] + } + ], + "source": [ + "root = BSTNode(10)\n", + "root.left = BSTNode(2)\n", + "root.left.left = BSTNode(1)\n", + "root.left.right = BSTNode(4)\n", + "root.left.right.right = BSTNode(8)\n", + "root.left.right.left = BSTNode(3)\n", + "root.right = BSTNode(15)\n", + "root.right.left = BSTNode(12)\n", + "root.right.right = BSTNode(19)\n", + "#root.right.left.left = Node(8)\n", + "root.dump()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "61b93235-2702-474d-a601-e8fcbe5c3bcb", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: update \"search(...)\" definition for BSTNode" + ] + }, + { + "cell_type": "markdown", + "id": "77d45804", + "metadata": {}, + "source": [ + "### Testcases for BST `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e2ef8e73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "print(root.search(10)) # should be True\n", + "print(root.search(11)) # should be False\n", + "print(root.search(19)) # should be True\n", + "print(root.search(5)) # should be False" + ] + }, + { + "cell_type": "markdown", + "id": "6ae7786b", + "metadata": {}, + "source": [ + "#### How many times is BST search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: **O(h)**, where **h** is the height of the tree." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd5aa50f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/08-trees/template_lec_001.ipynb b/lecture_material/08-trees/template_lec_001.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..647fa524af9ab44683629ce639bb2e5530d3f2b3 --- /dev/null +++ b/lecture_material/08-trees/template_lec_001.ipynb @@ -0,0 +1,315 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d684d88e-e96d-4392-b4d6-92d3f1669b32", + "metadata": {}, + "source": [ + "# Binary Search Trees" + ] + }, + { + "cell_type": "markdown", + "id": "8da93b35", + "metadata": {}, + "source": [ + "### Review **tree** terminology:\n", + "\n", + "- **Tree**: DAG (directed acyclic graph) with exactly one **root** (has no parents) and all other nodes have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66ba808a", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Graph" + ] + }, + { + "cell_type": "markdown", + "id": "8b758d75", + "metadata": {}, + "source": [ + "### Is this a tree? If not, how do we make it into a tree?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d62b95dc-9f28-4e6e-a3a0-e0aac6e6eb3b", + "metadata": {}, + "outputs": [], + "source": [ + "g = Graph()\n", + "g.edge(\"1\", \"2\", label=\"left\")\n", + "g.edge(\"1\", \"3\", label=\"right\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "aa0f43f8", + "metadata": {}, + "source": [ + "### Special cases of trees\n", + "- **Linked list**: a tree, where each node has *at most* one child\n", + "- **Binary tree**: a tree, where each has *at most* two children" + ] + }, + { + "cell_type": "markdown", + "id": "61015756", + "metadata": {}, + "source": [ + "### Review: recursive functions\n", + "1. *Category 1*: functions that return some computation\n", + "2. *Category 2*: functions that do some action (for example: printing, appending, etc.,)" + ] + }, + { + "cell_type": "markdown", + "id": "a6b914b2", + "metadata": {}, + "source": [ + "## Binary tree" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "847dc240-ca01-4f1a-a4d7-13fed4fe3995", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: define Node class\n", + " \n", + "\n", + " # Category 2: functions that do some action\n", + " def dump(self):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " pass\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " pass\n", + " # TODO: what is the simplest example in this case?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e81ed3ef", + "metadata": {}, + "source": [ + "### Let's come up with testcases for `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5248d0a", + "metadata": {}, + "outputs": [], + "source": [ + "print() # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be " + ] + }, + { + "cell_type": "markdown", + "id": "c05e82e7", + "metadata": {}, + "source": [ + "#### How many times is search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: ???" + ] + }, + { + "cell_type": "markdown", + "id": "3c372194", + "metadata": {}, + "source": [ + "## Binary Search Tree\n", + "\n", + "- special case of *Binary trees*\n", + "- **BST rule**: any node's value is bigger than every value in its left subtree, and and smaller than every value in its right subtree\n", + "- TODO: write an efficient search for a BST (better complexity than O(N)\n", + "- TODO: write a method to add values to a BST, while preserving the BST rule" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "894a39d2-5e3b-4178-bc1b-dedf0b5a86c0", + "metadata": {}, + "outputs": [], + "source": [ + "class BSTNode:\n", + " def __init__(self, label):\n", + " self.label = label\n", + " self.left = None\n", + " self.right = None\n", + " \n", + "\n", + " # Category 2: functions that do some action\n", + " def dump(self, prefix=\"\", suffix=\"\"):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " print(prefix, self.label, suffix)\n", + " # recurse left\n", + " if self.left != None:\n", + " self.left.dump(prefix+\"\\t\", \"(LEFT)\")\n", + " # recurse right\n", + " if self.right != None:\n", + " self.right.dump(prefix+\"\\t\", \"(RIGHT)\")\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " if target == self.label:\n", + " return True\n", + "\n", + " if self.left != None:\n", + " if self.left.search(target):\n", + " return True\n", + " \n", + " if self.right != None:\n", + " if self.right.search(target):\n", + " return True\n", + " \n", + " return False" + ] + }, + { + "cell_type": "markdown", + "id": "1d6935d8", + "metadata": {}, + "source": [ + "### Does this tree satisfy BST rule? If not, which node violates it and how can we fix its position?\n", + "- Let's not displace other children node to find a new spot for the node in violation of BST rule." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7047d184", + "metadata": {}, + "outputs": [], + "source": [ + "root = BSTNode(10)\n", + "root.left = BSTNode(2)\n", + "root.left.left = BSTNode(1)\n", + "root.left.right = BSTNode(4)\n", + "root.left.right.left = BSTNode(3)\n", + "root.right = BSTNode(15)\n", + "root.right.left = BSTNode(12)\n", + "root.right.right = BSTNode(19)\n", + "root.right.left.left = BSTNode(8)\n", + "root.dump()" + ] + }, + { + "cell_type": "markdown", + "id": "1d56266b", + "metadata": {}, + "source": [ + "### BST after fix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfbfc6e8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61b93235-2702-474d-a601-e8fcbe5c3bcb", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: update \"search(...)\" definition for BSTNode" + ] + }, + { + "cell_type": "markdown", + "id": "77d45804", + "metadata": {}, + "source": [ + "### Testcases for BST `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2ef8e73", + "metadata": {}, + "outputs": [], + "source": [ + "print(root.search(10)) # should be \n", + "print(root.search(11)) # should be \n", + "print(root.search(19)) # should be \n", + "print(root.search(5)) # should be " + ] + }, + { + "cell_type": "markdown", + "id": "6ae7786b", + "metadata": {}, + "source": [ + "#### How many times is BST search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: ???" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd5aa50f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lecture_material/08-trees/template_lec_002.ipynb b/lecture_material/08-trees/template_lec_002.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..647fa524af9ab44683629ce639bb2e5530d3f2b3 --- /dev/null +++ b/lecture_material/08-trees/template_lec_002.ipynb @@ -0,0 +1,315 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d684d88e-e96d-4392-b4d6-92d3f1669b32", + "metadata": {}, + "source": [ + "# Binary Search Trees" + ] + }, + { + "cell_type": "markdown", + "id": "8da93b35", + "metadata": {}, + "source": [ + "### Review **tree** terminology:\n", + "\n", + "- **Tree**: DAG (directed acyclic graph) with exactly one **root** (has no parents) and all other nodes have exactly one parent\n", + "- **root**: any node with no parents\n", + "- **leaf**: any node with no children" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66ba808a", + "metadata": {}, + "outputs": [], + "source": [ + "from graphviz import Graph" + ] + }, + { + "cell_type": "markdown", + "id": "8b758d75", + "metadata": {}, + "source": [ + "### Is this a tree? If not, how do we make it into a tree?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d62b95dc-9f28-4e6e-a3a0-e0aac6e6eb3b", + "metadata": {}, + "outputs": [], + "source": [ + "g = Graph()\n", + "g.edge(\"1\", \"2\", label=\"left\")\n", + "g.edge(\"1\", \"3\", label=\"right\")\n", + "g" + ] + }, + { + "cell_type": "markdown", + "id": "aa0f43f8", + "metadata": {}, + "source": [ + "### Special cases of trees\n", + "- **Linked list**: a tree, where each node has *at most* one child\n", + "- **Binary tree**: a tree, where each has *at most* two children" + ] + }, + { + "cell_type": "markdown", + "id": "61015756", + "metadata": {}, + "source": [ + "### Review: recursive functions\n", + "1. *Category 1*: functions that return some computation\n", + "2. *Category 2*: functions that do some action (for example: printing, appending, etc.,)" + ] + }, + { + "cell_type": "markdown", + "id": "a6b914b2", + "metadata": {}, + "source": [ + "## Binary tree" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "847dc240-ca01-4f1a-a4d7-13fed4fe3995", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: define Node class\n", + " \n", + "\n", + " # Category 2: functions that do some action\n", + " def dump(self):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " pass\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " pass\n", + " # TODO: what is the simplest example in this case?\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "e81ed3ef", + "metadata": {}, + "source": [ + "### Let's come up with testcases for `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5248d0a", + "metadata": {}, + "outputs": [], + "source": [ + "print() # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be \n", + "print(node1.search()) # should be " + ] + }, + { + "cell_type": "markdown", + "id": "c05e82e7", + "metadata": {}, + "source": [ + "#### How many times is search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: ???" + ] + }, + { + "cell_type": "markdown", + "id": "3c372194", + "metadata": {}, + "source": [ + "## Binary Search Tree\n", + "\n", + "- special case of *Binary trees*\n", + "- **BST rule**: any node's value is bigger than every value in its left subtree, and and smaller than every value in its right subtree\n", + "- TODO: write an efficient search for a BST (better complexity than O(N)\n", + "- TODO: write a method to add values to a BST, while preserving the BST rule" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "894a39d2-5e3b-4178-bc1b-dedf0b5a86c0", + "metadata": {}, + "outputs": [], + "source": [ + "class BSTNode:\n", + " def __init__(self, label):\n", + " self.label = label\n", + " self.left = None\n", + " self.right = None\n", + " \n", + "\n", + " # Category 2: functions that do some action\n", + " def dump(self, prefix=\"\", suffix=\"\"):\n", + " \"\"\"\n", + " prints out name of every node in the tree with some basic formatting\n", + " \"\"\"\n", + " print(prefix, self.label, suffix)\n", + " # recurse left\n", + " if self.left != None:\n", + " self.left.dump(prefix+\"\\t\", \"(LEFT)\")\n", + " # recurse right\n", + " if self.right != None:\n", + " self.right.dump(prefix+\"\\t\", \"(RIGHT)\")\n", + " \n", + " # Category 1: functions that return some computation\n", + " def search(self, target):\n", + " \"\"\"\n", + " returns True/False, if target is somewhere in the tree\n", + " \"\"\"\n", + " if target == self.label:\n", + " return True\n", + "\n", + " if self.left != None:\n", + " if self.left.search(target):\n", + " return True\n", + " \n", + " if self.right != None:\n", + " if self.right.search(target):\n", + " return True\n", + " \n", + " return False" + ] + }, + { + "cell_type": "markdown", + "id": "1d6935d8", + "metadata": {}, + "source": [ + "### Does this tree satisfy BST rule? If not, which node violates it and how can we fix its position?\n", + "- Let's not displace other children node to find a new spot for the node in violation of BST rule." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7047d184", + "metadata": {}, + "outputs": [], + "source": [ + "root = BSTNode(10)\n", + "root.left = BSTNode(2)\n", + "root.left.left = BSTNode(1)\n", + "root.left.right = BSTNode(4)\n", + "root.left.right.left = BSTNode(3)\n", + "root.right = BSTNode(15)\n", + "root.right.left = BSTNode(12)\n", + "root.right.right = BSTNode(19)\n", + "root.right.left.left = BSTNode(8)\n", + "root.dump()" + ] + }, + { + "cell_type": "markdown", + "id": "1d56266b", + "metadata": {}, + "source": [ + "### BST after fix" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dfbfc6e8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61b93235-2702-474d-a601-e8fcbe5c3bcb", + "metadata": {}, + "outputs": [], + "source": [ + "# TODO: update \"search(...)\" definition for BSTNode" + ] + }, + { + "cell_type": "markdown", + "id": "77d45804", + "metadata": {}, + "source": [ + "### Testcases for BST `search(...)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2ef8e73", + "metadata": {}, + "outputs": [], + "source": [ + "print(root.search(10)) # should be \n", + "print(root.search(11)) # should be \n", + "print(root.search(19)) # should be \n", + "print(root.search(5)) # should be " + ] + }, + { + "cell_type": "markdown", + "id": "6ae7786b", + "metadata": {}, + "source": [ + "#### How many times is BST search(...) called, in the worst case? \n", + "- Assume tree has *N* nodes. \n", + "- Complexity is: ???" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bd5aa50f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}