Skip to content

Instantly share code, notes, and snippets.

@rjw57
Created January 21, 2015 15:42
Show Gist options
  • Select an option

  • Save rjw57/b7522077030524a55d5f to your computer and use it in GitHub Desktop.

Select an option

Save rjw57/b7522077030524a55d5f to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "",
"signature": "sha256:bd5e8e2daf5196d64b2e3aeeaad715001e08abe10ca5b3680e42ebdf0a57060a"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"from __future__ import division, print_function"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Import all the plotting stuff\n",
"%pylab inline\n",
"rcParams['figure.figsize'] = (16,9)\n",
"rcParams['image.interpolation'] = 'none'"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Import att he networkx stuff\n",
"from networkx import DiGraph"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Create a simple network\n",
"nodes = [\n",
" (-2,2), (-2,-2), (-1,1), (-1,-1), (0,2), (1,1), (1,-1), (2,2), (2,-2)\n",
"]\n",
"edges = [\n",
" (0,2,50), (2,0,50), (1,3,50), (3,1,50), (2,3,70), (3,2,70), (2,4,30), (4,2,30), (4,5,30), (5,4,30),\n",
" (2,5,70), (5,2,70), (3,6,40), (6,3,40), (5,3,70), (5,6,40), (6,5,40), (5,7,50), (7,5,50), (6,8,50), (8,6,50)\n",
"]\n",
"print(len(edges), len(nodes))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"21 9\n"
]
}
],
"prompt_number": 113
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def edge_weight(u, v, s):\n",
" \"\"\"\n",
" The \"weight\" or \"length\" of an edge is going to be the time taken to traverse it.\n",
" \"\"\"\n",
" delta = np.array(u) - np.array(v)\n",
" length = np.sqrt(np.sum(delta * delta))\n",
" time = length / s\n",
" return time"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 114
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"G = DiGraph()\n",
"G.add_edges_from(\n",
" (nodes[i1], nodes[i2], dict(speed=s, weight=edge_weight(nodes[i1], nodes[i2], s)))\n",
" for i1, i2, s in edges\n",
")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 115
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from networkx import draw_networkx_edge_labels, draw_networkx"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 116
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"draw_networkx(G, pos=dict((n, n) for n in G.nodes_iter()))\n",
"draw_networkx_edge_labels(\n",
" G,\n",
" pos=dict((n, n) for n in G.nodes_iter()),\n",
" edge_labels=dict(((u,v),d['speed']) for u, v, d in G.edges_iter(data=True))\n",
")\n",
"axis('equal')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 117,
"text": [
"(-3.0, 3.0, -3.0, 3.0)"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nbdu28vuys7M1d/ZsFar0CGVjUq1QUm6dWzUNdz2Ntuw05vbt20tS+emzkZGROnPmjCIiIsq3NQxD\nI0aMsP2XvpENAAAgAElEQVRjsTvcJSlHUnMnHl8i6Wpxsdq2bVvp9qNHjyo6OppTaAHARaoeQFyw\nYIHD7TiNFgA83PDhw5WamurwvtatW6tfz57aKClPUpGkYkn51/9bxk/S32rY/18k3d6nj9555x1F\nRUUpLy9P+fn5Mk1Tpmnqiy++ULt27VRQUFB+m6v+uKv169eXn0IrSaNHj1ZycrIkKTk5WWPGjLFr\ntBq5+t+q4p+lS5dq2rRplW7Ly8vTbb1765pK12NehdnWSnJ8OapSRde3PyUpsn17BQUFqaSkpPz+\n1NRUDR8+3Pq/NABAgzh9gSDDMNZLGqzSixx+JenHpmmuqXA/FwgCABe6ePGiYmNj9e9//1vNm1c/\nTrR+/XrNmTRJJ6u8NMl8ST+WdFpSjKSTksIc7L9/ixY6kFeaAtcvAKC4uDh98MEHkqTFixfr3Llz\nWrJkiXUflAe5cuWKoqKilJ6eXv67gpmZmRo7dqxOnTql6Ohovfnmmz59SqejNRodHa1Tp07JNE0Z\nKj3qnq7S19tMlPSZpHU17G+ypNdVelp42RHatWvXauLEiZJKj/a/8cYb6t272nULAQAuUNMFgiy5\nGm0dT0xsAoCLzZkzRxEREZo5c2a1+/Lz8xUVEaF3cnLU38Fj35B0RNJCB/elSRrRqpVOnT+vwMBA\nh/uOjY3V7t27FR4e7uRHAW/maI3WtDbvk/SiVOvrb9a0Njdv3qw33nhDKSkpFn8EAICaEJsA4MM2\npKToucce04fXrqlLPR9zStK3goO1ePVqjUtIcOV48GEbUlL07OTJ2pOfz9oEAA/FS58AgA8bl5Cg\nWT/7mb7VooXS6rF9mkq/mZ+VmMg383CpG2+6SZf9/XVnYCBrEwC8DEc2AcCHbEhJ0czp0xVTUqIn\nL1/WaH19WfJCSZskvRIaqsOGoWUrV/LNPFzqk08+0ciRI7V69WpdvXKFtQkAHorTaAEAkkpfE/Kt\nt97SK0lJ2nvggEKv354raWBsrJ784Q/14IMPOvwdTcAqFUNz1KhRklibAOCpiE0AQDVVX2uRz9do\nCo5CsyrWJgB4Dn5nEwAA2K4+oQkA8A7EJgAAaBKEJgD4FmITAAC4HKEJAL6H2AQAAC5FaAKAbyI2\n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\nMxMmTOh3zBtvvJEDx45NXb8+5yf5ZJIpO3ieMUkm7b13Vq9evemHy5966qnMmTPnXbfMTpgwIZ2d\nnTt4BoA9r78e+uijj2bDxo3ZlW9Tbt47586dmyRbfPUg0TOBHdNv2CylLE4yeSu7vlRrvb93zNVJ\numut39rWcb761a9u+ru9vT3t7e07UyswxE2cODFr1qzZ9PiMM87II488kiS5/fbbM2PGjCRJrTUz\nk+yT5JYBHvul/HEGtCQ5YLN9L7zwQs4888zcfPPNOf7447d43po1a7L//vsHYLDr20Pf8cILL+RT\nn/pUDhg7NsevWzegY/1Tkn/u/Xtmknmb7bvrrrty9913Z+nSpe9aPG3NmjWZOHHiTtUPDB9LlizJ\nkiVLtjtul1ajLaV8Msmnk5xaa31rG2OsRgskSU477bRceOGF+cQnPrHNMZ2dnTnwgANyYq357yRb\nX0qof+uTTBwzJqteey2dnZ1pb2/PVVddlc985jPvGnvdddfll7/8ZebPn78TZwLYc7bWQ1euXJn2\n9vZ8/vOfz9VXXJHfrV+fnV1be32S8aNG5aD3vz9Lly5NW1vbu8ZMmTIl8+fPz4knnriTZwGGo92x\nGu3pSa5Ics62gibA5s4888w89NBD/Y754he/mHHjxuXvs/WguVeSh7dznu8l+fDRR2ft2rU55ZRT\nctlll201aCbJQw89lDPOOGMA1QO0Vt8eumrVqk09bvbs2Tn2Qx/K/ZuNvyM9i6wNVEeSWkoWL168\n1aC5atWqrF69Oscdd9zOvQBgxNnpmc1SyvNJ9k6yunfTY7XWWVsZZ2YTSNLzfcxp06bl+eefzz77\n7POu/StXrsxhhx2WMWPG5O3u7ozr3X57khlJfpXkmCQrkvR3E9epEybk07ffnueeey7XXntt3vOe\n92zaV0rJm2++mST5zW9+k+nTp+fFF1/M6NFNfYUdYPfo20OvvfbaLXrchg0bsv6tt7Khd/yc9Cyy\n9s0BHn9cKdkwatQW/XnmzJmZN6/nJlu/swlsy7ZmNnfpNtoBnljYBDa5+uqrc9BBB2X27NnbHLNu\n3bp88KCD8v0339zi9+L+I8kzSa7r5/iPJznrve/NS6+9lr333rvfWjo6OnL44Yfnkksu2YFXANA6\n/fXQvr3zr5LcnKT/NcB7bK93rlu3LtOmTcvSpUszadKkXXwVwHAjbAJDysIFC3LFRRflkT/8IYcO\n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\n",
"text": [
"<matplotlib.figure.Figure at 0x36b1810>"
]
}
],
"prompt_number": 117
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Test finding a shortest path using A*\n",
"def astar_heuristic(n1, n2):\n",
" \"\"\"A function to evaluate the estimate of the distance from the a node\n",
" to the target. The function takes two nodes arguments and must return a number.\n",
" \"\"\"\n",
" average_speed = 50\n",
" return edge_weight(n1, n2, 50)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 118
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from networkx import astar_path"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 119
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"astar_path(G, nodes[1], nodes[7], astar_heuristic)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 120,
"text": [
"[(-2, -2), (-1, -1), (-1, 1), (1, 1), (2, 2)]"
]
}
],
"prompt_number": 120
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Compute a path for each possible pair of nodes"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 121
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from itertools import product\n",
"# n_pairs = G.order()**2 - G.order()\n",
"best_paths = { }\n",
"for n1, n2 in product(G.nodes_iter(), G.nodes_iter()):\n",
" if n1 is n2:\n",
" continue\n",
" best_paths[(n1, n2)] = astar_path(G, n1, n2, astar_heuristic)\n",
"\n",
"print('Computed {0} paths. Expected to compute {1}'.format(\n",
" len(best_paths), G.order()**2 - G.order()\n",
"))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Computed 72 paths. Expected to compute 72\n"
]
}
],
"prompt_number": 122
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"routes = list(best_paths.keys())\n",
"edges = G.edges()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 123
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def path_to_edges(path):\n",
" \"\"\"Convert a path specified as a list of nodes into a list of edges.\"\"\"\n",
" return list((u, v) for u, v in zip(path[:-1], path[1:]))\n",
"\n",
"p = best_paths[routes[0]]\n",
"print(p)\n",
"print(path_to_edges(p))\n"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[(-2, -2), (-1, -1), (-1, 1), (-2, 2)]\n",
"[((-2, -2), (-1, -1)), ((-1, -1), (-1, 1)), ((-1, 1), (-2, 2))]\n"
]
}
],
"prompt_number": 124
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"edges.index(path_to_edges(best_paths[routes[0]])[0])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 125,
"text": [
"7"
]
}
],
"prompt_number": 125
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Our routing matrix has #edge rows and #routes columns\n",
"routing = np.zeros((len(edges), len(routes)))\n",
"# For each route...\n",
"for r_idx, r in enumerate(routes):\n",
" # Which edges are in this path?\n",
" edge_idxs = list(edges.index(e) for e in path_to_edges(best_paths[r]))\n",
" routing[edge_idxs, r_idx] = 1"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 126
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"imshow(routing)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 127,
"text": [
"<matplotlib.image.AxesImage at 0x34a1b90>"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\nJfm9JB/NFuq9zTOa9yf5re4+7O4Xk/xikh/d4vqZWXd/Jsk3Xjb5oSSPbe4/luTdWx0Us+nu57v7\nC5v7v5vky0neEDVfrO7+vc3dVya5LUf7u3ovVFV9b5I/n+Tnk7x06Xr1XraX/4kC9V6gqvojSX64\nux9Nku7+/e7+naj3LnhHjvLYM9lCvbcZNN+Q5Jljj7+2mcay3dndVzf3rya58ywHwzyqai/JvUk+\nGzVfrKp6RVV9IUd1/VR3fzHqvWT/KMnfTvIHx6ap93J1kl+tqs9V1U9spqn3Mt2T5OtV9aGq+nxV\n/bOqelXUexf8lSQf2dyfvd7bDJr+YOeO66M/2mo7WJiqenWSX07yvu7+5vF5ar4s3f0Hm6/Ofm+S\nP1dVb3vZfPVeiKr6C0le6O4n851nuZKo9wK9ZfPVunfl6KcQP3x8pnovyu1J7kvyT7r7viT/Oy/7\n2qR6L09VvTLJX0zyL14+b656bzNo/naSu489vjtHZzVZtqtV9bokqaq7krxwxuNhoKr6rhyFzA93\n9+ObyWq+cJuvWP2rHP3WQ72X6c8keaiqvpqj//1+e1V9OOq9WN393Obfr+fo91v3R72X6mtJvtbd\n/2nz+JdyFDyfV+9Fe1eS/7zZx5Mt7N/bDJqfS/J9VbW3SdQ/luRjW1w/Z+NjSd6zuf+eJI9fpy0X\nSFVVkkeSfKm7P3hslpovUFW99qUr0lXVH07yziRPRr0Xqbv/bnff3d335OirVv+uu/9a1HuRquq7\nq+p7NvdfleRHkjwV9V6k7n4+yTNV9cbNpHck+WKSj0e9l+zhfOtrs8kW9u86OlO6HVX1riQfzNFF\nJB7p7g9sbeXMrqo+kuStSV6bo+96r5L8yyT/PMkfS3KY5C939/88qzEyzuaKo/8+ya/nW1+3+DtJ\nfi1qvjhV9cdzdLGAV2xuH+7uv19Vr4l6L1pVvTXJ3+ruh9R7marqnhydxUyOvlb5C939AfVerqr6\nkzm60Ncrk/y3JD+eo8/n6r1Am/9A+u9J7nnpZ07b2L+3GjQBAABYvm1+dRYAAIAdIGgCAAAwlKAJ\nAADAUIImAAAAQwmaAAAADCVoAgAAMJSgCQAAwFD/D9fS79FzytlRAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x3695190>"
]
}
],
"prompt_number": 127
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# To be able to resolve any pattern of edges, the rank of the matrix must be >= #edges\n",
"print('#edges: {0}, routing matrix rank: {1}'.format(\n",
" len(edges), np.linalg.matrix_rank(routing)\n",
"))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"#edges: 21, routing matrix rank: 21\n"
]
}
],
"prompt_number": 128
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our theory is that given the routing matrix, R, and traffic alng each route T, the edge occupancy, E, should be:\n",
"\n",
"$$\n",
"R T = E\n",
"$$\n",
"\n",
"So, given E, we can estimate T as:\n",
"\n",
"$$\n",
"T = (R^T T)^{-1} R^T E\n",
"$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Luckily, numpy has a least squares function...\n",
"def estimate_routes(edge_occupancy):\n",
" return np.linalg.lstsq(routing, edge_occupancy)[0]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 129
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Construct some sensible edge occupancy\n",
"occupancies = (\n",
" # node1, node2, occupancy\n",
" (0, 2, 1),\n",
" (2, 5, 1),\n",
" (5, 7, 1),\n",
" (7, 5, 2),\n",
" (5, 3, 1),\n",
" (5, 2, 0),\n",
" (2, 3, 1),\n",
" (3, 1, 2),\n",
" (4, 2, 1),\n",
" (5, 4, 1),\n",
")\n",
"\n",
"eo = np.zeros(len(edges))\n",
"for n1, n2, o in occupancies:\n",
" e_idx = edges.index((nodes[n1], nodes[n2]))\n",
" eo[e_idx] = o\n",
"\n",
"for o, e in zip(eo, edges):\n",
" n_idxs = tuple(nodes.index(n) for n in e)\n",
" print(n_idxs, o)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(2, 5) 1.0\n",
"(2, 0) 0.0\n",
"(2, 4) 0.0\n",
"(2, 3) 1.0\n",
"(8, 6) 0.0\n",
"(7, 5) 2.0\n",
"(0, 2) 1.0\n",
"(1, 3) 0.0\n",
"(4, 2) 1.0\n",
"(4, 5) 0.0\n",
"(3, 2) 0.0\n",
"(3, 6) 0.0\n",
"(3, 1) 2.0\n",
"(6, 8) 0.0\n",
"(6, 5) 0.0\n",
"(6, 3) 0.0\n",
"(5, 2) 0.0\n",
"(5, 7) 1.0\n",
"(5, 6) 0.0\n",
"(5, 4) 1.0\n",
"(5, 3) 1.0\n"
]
}
],
"prompt_number": 137
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"route_flows = estimate_routes(eo)\n",
"actual_eo = routing.dot(route_flows)\n",
"for o, e in zip(actual_eo, edges):\n",
" n_idxs = tuple(nodes.index(n) for n in e)\n",
" print(n_idxs, o)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"(2, 5) 1.0\n",
"(2, 0) 6.86950496487e-16\n",
"(2, 4) -8.881784197e-16\n",
"(2, 3) 1.0\n",
"(8, 6) 1.49880108324e-15\n",
"(7, 5) 2.0\n",
"(0, 2) 1.0\n",
"(1, 3) -1.47104550763e-15\n",
"(4, 2) 1.0\n",
"(4, 5) -9.29811783124e-16\n",
"(3, 2) -3.60822483003e-16\n",
"(3, 6) -1.86482773668e-15\n",
"(3, 1) 2.0\n",
"(6, 8) -1.05471187339e-15\n",
"(6, 5) -3.05311331772e-16\n",
"(6, 3) 1.05471187339e-15\n",
"(5, 2) 9.78384040451e-16\n",
"(5, 7) 1.0\n",
"(5, 6) 3.88578058619e-16\n",
"(5, 4) 1.0\n",
"(5, 3) 1.0\n"
]
}
],
"prompt_number": 138
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"flow_thresh = 0.15"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 139
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"routeG = DiGraph()\n",
"for r, f in zip(routes, route_flows):\n",
" if f < flow_thresh:\n",
" continue\n",
" n1, n2 = r\n",
" routeG.add_edge(n1, n2, dict(label='{0:.02}'.format(f), flow=f))\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 140
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from networkx import layout, to_agraph"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 141
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"to_agraph(routeG).write('foo.dot')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 142
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\n",
"el = list(e for e in routeG.edges(data=True) if e[2]['flow'] > flow_thresh)\n",
"p = layout.random_layout(routeG)\n",
"draw_networkx(\n",
" routeG, pos=dict((n, n) for n in routeG.nodes_iter()),\n",
" edgelist = el, edge_color=list(e[2]['flow'] for e in el)\n",
")\n",
"draw_networkx_edge_labels(\n",
" routeG,\n",
" pos=dict((n, n) for n in G.nodes_iter()), \n",
" edge_labels=dict(((u,v), '{0:.02}'.format(d['flow'])) for u, v, d in el)\n",
")\n",
"axis('equal')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 143,
"text": [
"(-3.0, 3.0, -3.0, 3.0)"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAA5sAAAIXCAYAAAASbkoHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VGXe//H3SYWYAoQmRXBXVEKRJgirgorSEZCiLrKC\nrmBDRVeFFYVl130UFxf10UXFB1EhCMJK/yEiHUUEBGkWQleQkhAkfc7vj2FCJpkkk8yZ/nldVy6Z\nOWfOuSfehHzm+z33MUzTRERERERERMRKEf4egIiIiIiIiIQehU0RERERERGxnMKmiIiIiIiIWE5h\nU0RERERERCynsCkiIiIiIiKWU9gUERERERERy3kUNg3DqGIYxleGYWw3DGO3YRj/tGpgIiIiIiIi\nErwMT++zaRhGnGma5w3DiALWA0+ZprnektGJiIiIiIhIUPK4jdY0zfMX/hgDRAKnPT2miIiIiIiI\nBDePw6ZhGBGGYWwHjgNfmKa52/NhiYiIiIiISDCzorJpM02zFdAAuNEwjC4ej0pERERERESCWpRV\nBzJNM8MwjCVAO2C143nDMDy7KFREREREREQCmmmaRvHnPAqbhmHUBPJN00w3DKMqcCsw0cWJPTmN\n+NGECROYMGGCv4chUoLmpgQqzU0JZJqfEqg0N4ObYZTImYDnlc1LgfcNw4jA3pL7gWman3t4TBER\nEREREQlyHoVN0zR3Am0sGouIiIiIiIiECI8XCJLQ1qVLF38PQcQlzU0JVJqbEsg0PyVQaW6GJsPb\n11MahmHqmk0REREREZHQZBiGywWCVNkUERERERERyylsioiIiIiIiOUUNkVERERERMRyCpsiIiIi\nIiJiOYVNERERERERsZzCpoiIiIiIiFhOYVNEREREREQsp7ApIiIiIiIillPYFBEREREREcspbIqI\niIiIiIjlFDZFRERERETEcgqbIiIiIiIiYjmFTREREREREbGcwqaIiIiIiIhYTmFTRERERERELKew\nKSIiIiIiIpZT2BQRERERERHLKWyKiIiIiIiI5RQ2RURERERExHIKmyIiIiIiImI5hU0RERERERGx\nnMKmiIiIiIiIWE5hU0RERERERCynsCkiIiIiIiKWU9gUERERERERyylsioiIiIiIiOUUNkVERERE\nRMRyCpsiIiIiIiJiOYVNERERERERsZzCpoiIiIiIiFhOYVNEREREREQsp7ApIiIiIiIillPYFBER\n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\nufb/Tpjg/PzixbBli1eGwPfff88f//hHWrRowa233sq//vUvfv7558LtBQUFRf5s8q+3c8PqNiXl\n8frcFBEJcrpqXUREvM4RPAcPbsa5c7nExUU7bTdNk+ho5+fOnj3L2LFjOXjwIG+99RYnT55kxIgR\n9OrVi+rVq5OXl0d0dDQ7duygevXqAJVrU3RxX02wt9DOm5fJypUNKn5MN/TuDVWqXGylPXDAHipv\nvdV+382i1c2JEytf3dy5cycLFy6kfv369O/fn6SkJAoKCoiMjOTs2bP069ePadOmER0dzd13341p\nmowbNw6bzea0uE1kpMFdfSN49N5IYmKqV/6NhwCfzU0RkSCnyqaIiPhUfHwMERHOv3i7+kU8KiqK\nW265hcWLF9O+fXt69uzJrbfeyvr16wEKw+nmzZsZOHAg+fn5vP322xw8eND9wZRR1dy0KZsaNSIt\nvVazqPh46NHD+bm5c+0r6VpV3Txw4AATJ07k4MGDLF++nJdffhmAyMhIAK6++mr69+9PfHw8sbGx\ndOrUibS0tMLXF///Uq9uVFhWMIvzydwUEQkBCpsiIhIQ8vPzC/9smiZxcXF07dq18HFGRgZpaWm0\natUKsLd4nj59GoDXX3+dtm3b8tNPP9GgQQUqkaVUNcG7LbQOrlppTfNidbOoiRMrfvwVK1YUBp2/\n/vWvnDhxggUXLhS12WzEx8cXVi9PnTrFli1bGDJkCECJazXDmV/mpohICNC/JCIi4nfjxo3j0Ucf\nLQxCFxYaIDExsXAfwzC45JJLSEpKAuzVuYyMDJYuXcr58+eZP38+L730UmHVrlxlVDUdLbSDBiVY\n8v5K42ildXC00lpV3YyLi6N27doANGrUiJYtW7J582agZJjcuHEjx48f5+abb67guwhtfpmbIiIh\nQmFTRET8avz48ezatYtu3brx73//m6lTp5Kenl74Sz3Yf5nfsWMHMTExJCYmsmnTJr799lsuv/xy\nduzYwcyZM/n9739fsROXUdX0dgutQ2mttGBNdTM2NpaIiIjCcFSnTh3S09PJLnrPFSArK4uxY8fy\nzjvvlAihWVlZhVW6cOO3uSkiEiIUNkVExG9yc3NZu3Ytr7zyCv369eOFF17g0KFDzJkzp8S+69at\n49JLL+XJJ59k+PDhHDp0CKBw9c8KKaOqCb5poXUorZXWiurmZZddxvnz5zl69CgAMTExXHLJJWRm\nZjrt99RTTzFgwAAA3nnnHbZcOIlpmpimybFjxyr0nkKB3+amiEgIUdgUERG/iYmJoVmzZsyePRuA\nTp060bZtW7Zu3UpaWprTAjX79u3jk08+ITk5mb1799KnT59Sj1vubSbKqGr6qoXWobRWWvC8utm0\naVOys7PZsGEDALt37wagVq1a/PDDD5w5c4Y9e/awcOFCpk+fzoMPPsiKFSv47bffAHvVLjY2lpo1\na1b27QUtb81NEZFworApIiJ+1bt3b/bv38/+/fupUqUKzZs3JyEhgePHjwOwbds2AAYOHMi+ffsY\nN25cmcfLyckhLy8PKCV0llPV9FULrUNZrbTuVjfz8y++z6LvOTExkc6dO5Oamsq4ceNYtWoVt9xy\nC8ePH2fJkiUcP36cBg0asGrVKo4cOcKKFSuYO3cunTt3LjxGZGQk1apVs+KtBh2r56aISLhR2BQR\nEb/q0KED9evX5/333wegZcuWbN26lfPnz7Nt2zbWrVtHZmYmvXv3LrPClp2dzfHjx9m7d2/hrSdO\nn86ie/cPee+9bZw+nWXfsYyqJvi2hdahtFZaKL26+fmaLLoNOc01t54nK+fituK3K3nggQd48MEH\nycrK4qmnnuKWW26hTp06PP7441x99dUkJCTQpEmTMu8DWaVo6TWMWDU3RUTClcKmiIj4VXJyMv37\n92ft2rXMnDmTEydOEBkZSdWqVWndujWjR48mIaH0llbTNMnPz+frr78mLS2Na665pjA4JSVVYcSI\n1ixd+gOXXz6V7t0/4NePnyaz/ViXVU1ft9A6lNVKW1p189a7ojh23OC+QQXEx5V+7OjoaG677TZe\nffVVunfvTkxMxSu25bYlhyhP56aISLhT2BQREb9r164dzz33HKtWreKGG27g5ptvpmPxcl4pDMMg\nKiqKG264geuuu85pW1RUBIMHN2PevMEcPTqGvw7M5PzZczTsllay4onvW2gdymql/XxNFq+8e5qI\n2AKn7T1aR7FzdXVGP5BQZlWyMoreVxJKVkvDiSdzU0Qk3Bne/rTSMAwzXD8RFRHvMY7lYNaL9fcw\nxGK5ubkYhlHYBmsp04S32sONz3KucR+WLv2Bjz/exWef7adjxwYMHtyMr76qS/36MTz/fLL15y9H\naircddfFx1UuKYA62eTaoklp9BvXXxPLf15zLmF+/TW0a2ftODIzM5k3bx516tThtttuIyoqytoT\n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\nJk2a0LhxY+vGHELGjx/Prl27GD58OK+++iqHDh3iT3/6E9WqVcM0TQzDwDAMduzYQUxMDImJiWza\ntImqVavSqlUr3n33XX7/+99X+LxjxzaiTZstjBnTQNduiogIoMqmiEhICJgWWguqmo7r/B236zBN\nk6SkJO6++26uvfZaDhw4wLRp06wacUjJzc1l7dq1vPLKK/Tr148XXniBQ4cOFa7eW9S6deu49NJL\nefLJJxkxYgSHDh0CqFTQBFU3RUSkJIVNEZEQEDAttBZUNQ3j4voCNputsAUU4OTJkzzzzDPUrl3b\n46GGopiYGJo1a8bs2bMB6NSpE23btmXr1q2kpaU5fW/37dvHJ598QnJyMnv27KFv374en1/XboqI\nSFEKmyIiQc7RQtunT2L5O3uTh1XNvXv3snDhQrZv386WLVsA+6I1jsAJ8Mc//pHx48dbOeqQ07t3\nb/bv38/+/fupUqUKzZs3JyEhgePHjwOwbds2AAYOHMi+ffsYN26cZedWdVNERIpS2BQRCXIB00Lr\nQVXzzJkz3H333cyYMYN//etfzJgxgxdeeIE9e/YUrpK6aNEicnJyrB51yOnQoQP169fn/fffB6Bl\ny5Zs3bqV8+fPs23bNtatW0dmZia9e/emZs2aLo+Rm5vLuXPnKnV+VTdFRMRBYVNEJMgFRAuth1XN\n1157jeuuu4758+czadIkevXqhWEYvPvuuxw5coTt27dz4sQJYmN1b9XyJCcn079/f9auXcvMmTM5\nceIEkZGRVK1aldatWzN69GgSEhLKPEZMTAxDhw5l2bJlFT6/qpsiIuKgsCkiEsQCpoXWw2s127Rp\nw4kTJ8jJyaFx48b06NGDwYMHk5+fz5QpU2jVqhXDhg2zeNChq127djz33HOsWrWKG264gZtvvrnM\n25g4ronNyclh06ZN7Nq1i++//55//OMflTq/qpsiIgJgOP6B8doJDMP09jlEJPwYx3Iw66nK9cEH\nZ5g3L4NPP23sv0GYJrzVHm58FprfUalDFBQU8Kc//QnDMBg+fDg333wzAPn5+XTv3p0333yTK6+8\n0spRh4Xc3FwMwyA6OrrMfU6fPs17773Hf/7zH7p27UpaWhrt27enefPm9OjRo9R227KMGrWPGjWi\nefHF33nyFkREJAhcWMzPKPG8wqaIBCOFTbu+fdMYPLgaQ4dW998g9i6BFWPhke2Vvt0J2K/b/OCD\nD9ixYwfVq1dn4MCBnD17lgceeIC0tDQLBywOubm5jBs3jjp16pCTk8PAgQNJSkoiISGB+Ph4j459\n8GA2bdpsYd++9rrvpohIiFPYFJGQorBpb6Ft2HAPhw839d/iQBZUNYvKyclh69atfPHFF7z//vvc\neOON3H777fTu3duCwYa+pfuOc+MVtYmPLPHvfYXZbLbCxZkqS9VNEZHwoLApIiFFYTNAWmgtqmqW\nJjc3l5gYVcXcMWXDfp4yGnOkZR714iv2d8MRLK0ImEWpuikiEh5KC5taIEhEJEj5fRVaD1egdYeC\npnumbNjPk0ZjRmb+WOGgCRQGTCuDJmhlWhGRcKewKSIShAJiFVoPV6AtS0GBSUGBumLc4QiaozJ/\n5K1ulV9E6fz5ArzRiaSVaUVEwpfCpohIEFq48Cw33RTv32s1vVjVnDz5DL/8km/5cUONVUET4JNP\nfmX58tPWDKwIVTdFRMKXwqaISBDyewutF6uaNpvJ66+nc/asKptlsTJoApw+nc+cOSc8H5gLqm6K\niIQnhU0RkSDj9xZaL1c1N23KpkaNSJo21fWapbE6aAIMHFiLhQtPkZtrs+R4Ram6KSISnhQ2RUSC\njN9baL1Y1QT4+ONzDBrk2T0eQ5k3giZA/fqxpKTE8dlnZyw7ZlGqboqIhB+FTRGRIOPXFlovVzVt\nNpN58zIZNCjB8mOHAm8FTYdBg2ozd653WmlV3RQRCT8KmyIiQcTvLbRermqqhbZ03g6a4N1WWlB1\nU0Qk3ChsiogEEb+20PrgvppqoXXNF0ETvN9Kq+qmiEh4UdgUEQkifm2h9XJVUy20rvkqaDp4s5UW\nVN0UEQknCpsiIkHCry20PqhqqoW2JF8HTfB+K62qmyIi4UNhU0QkSPi1hdbLVU1QC21x/gia4P1W\nWlB1U0QkXChsiogECb+10PqgqqkWWmf+CpoO3m6lVXVTRCQ8KGyKiAQBv7bQ+qCqqRbai/wdNMH7\nrbSg6qaISDhQ2BQRCQJ+a6H1QVUT1ELrEAhBE3zTSqvqpohI6FPYFBEJAn5rofVBVVMttHaBEjQd\nvN1KC6puioiEOoVNEQlKQ6uGz48vv7XQ+qiqqRbawAua4JtWWlU3RURCW/j8tiYiIeXNpCh/D8Fn\n/NZC64OqJqiFNhCDJvimlRbs1c21a9Ox2UyvnkdERHxPYVNEglJChOHvIfiMX1pofVTVDPcW2kAN\nmg6+aKVt1KgKK1e28uo5RETEPxQ2RUQCmN9aaH1U1QznFtppXx8M6KAJvmmlBahSJYKIMPoASUQk\nXFpehjgAACAASURBVChsiogEML+00Jom5GR6vaoJ4dtCW2AzSWx8WUAHTfBdK62IiIQmwzS9e42E\nYRimt88hIhKq+vZNY/DgagwdWt23J847D1FVwfBetclmM2nYMI2VKxuEZWUzt8BGTGTgf+Y7deoR\ntm3LZMaMpj4759y5c4mLi6NVq1bUr1/fZ+cVEZHKMQwD0zRL/NKgsCkiQSc/P58tW7Zw9OhRTNOk\nfv36tG/fnshIHy+g42UZGQU0bLiHw4eb+n5xIB/YsCGLUaNOsHNnI38Pxes+/vhj9u7dy5gxY4iP\nD65K7tGjObRo8TW//NKJmBjvhWPTNNm4cSMfffQRmzZt4uabb2bevHns2rUr6L5nIiLhprSwGT7L\nOYpISFi2bBmPPPIITZo0oWHDhgAcPnyYH3/8kTfeeIPu3bv7eYTW8VULbU5ODrGxsV49hyvh0EK7\ndu1aJk+ezObNm6lbty7PP/+8v4dUYUVbaXv1SvbKOUzT5LPPPmPBggXUq1ePr776ipiYGNLT01m8\neDF33nmnV84rIiLeFfj9OyIiRTz++ON8/vnnLF++nHfeeYd33nmH5cuXs3LlSh5//HF/D89SvliF\n9r///S/jxo1j3759Xj1PceGwCu38+fMZNWoUI0aM4Pjx40RGRvLtt9/6e1iV4u1VaY8dO8b06dNJ\nSUlh/PjxxMTE8N133/Htt9/SqFHoV75FREKVwqaIBJWCggLq1atX4vn69etTUFDghxF5h69Wod22\nbRvLly9n+fLlbN261avnKipUV6HNycnh4MGDANx6663s3r2b/v37c+bMGdq1a8eBAwf8O8BK8uaq\ntDabjWeffZa6devy6KOPArB//37WrFlDz549adeuneXnFBER3/C4jdYwjO7Av4FI4F3TNF/yeFQi\nIqW47777aN++PUOGDClsoz1y5Aipqancf//9fh6ddXzVQtu6dWvWrl3Lzp07OXz4MImJieTk5HDp\npZdSo0YNr503FFtobTYbzZo14/rrr+fvf/87DRo0AOwtoklJSRw+fJisrCzA/qFJMF1j7M1WWpvN\nRlRUFEOHDgVg8+bNrF+/nj179jBkyBCio6MtPZ+IiPiOR5VNwzAigTeA7kAKcJdhGL5brk5Ews7Y\n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\nAAAA2O7/A2JAOym1/nMEAAAAAElFTkSuQmCC\n",
"text": [
"<matplotlib.figure.Figure at 0x3975510>"
]
}
],
"prompt_number": 143
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 136
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 136
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment