Skip to content

Instantly share code, notes, and snippets.

@RutgerK
Created March 14, 2019 16:27
Show Gist options
  • Save RutgerK/352839af57fd986a88566803669cc8cc to your computer and use it in GitHub Desktop.
Save RutgerK/352839af57fd986a88566803669cc8cc to your computer and use it in GitHub Desktop.
Numba heapq test
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numba\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from heapq import heappush, heappop\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"@numba.njit\n",
"def aldous_broder(ys=20, xs=20): \n",
"\n",
" x_start = np.random.randint(xs)\n",
" y_start = np.random.randint(ys)\n",
" \n",
" maze = np.zeros((ys*2+1, xs*2+1))\n",
" \n",
" neighbors = [[-2, 0], # up\n",
" [ 0, 2], # right\n",
" [ 2 ,0], # down\n",
" [ 0,-2]] # left\n",
" \n",
" # current position\n",
" y = y_start * 2 + 1\n",
" x = x_start * 2 + 1\n",
" \n",
" # neighbros \n",
" yp = y\n",
" xp = x\n",
" \n",
" n_filled = 0\n",
" while n_filled < (ys*xs):\n",
" \n",
" if maze[y, x] == 0:\n",
" \n",
" maze[y, x] = 1\n",
" \n",
" if n_filled > 0:\n",
" # since where taking steps of 2 (to get \"walls\")\n",
" # \"break\" the wall with the previous step\n",
" if yp == y:\n",
" maze[yp, (x+xp)//2] = 1\n",
" elif xp == x:\n",
" maze[(y+yp)//2, xp] = 1\n",
" \n",
" n_filled += 1\n",
" \n",
" yp = y\n",
" xp = x\n",
" \n",
" # get the (potential) neighbors of the current position\n",
" nb = [(y + y_off, x + x_off) for y_off, x_off in neighbors]\n",
" \n",
" while len(nb) > 0:\n",
" # pick random neighbor\n",
" yn, xn = nb.pop(np.random.randint(0,len(nb)) )\n",
" \n",
" # out of bounds\n",
" if yn < 0 or yn//2 > ys-1:\n",
" continue\n",
" if xn < 0 or xn//2 > xs-1:\n",
" continue\n",
"\n",
" y = yn\n",
" x = xn\n",
" \n",
" if maze[y, x] == 1:\n",
" yp = y\n",
" xp = x\n",
" \n",
" break\n",
" \n",
" return maze"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def dijkstra_distance_python(grid, x, y):\n",
" \"\"\"Simple dijkstra distance calculate the distance\n",
" for an entire grid (not just shortest)\n",
" \n",
" grid: array defining the grid, \n",
" zeros are passable\n",
" ones are impassable (eg walls)\n",
" \n",
" x: starting x index\n",
" y: starting y index \n",
" \"\"\"\n",
" \n",
" ys, xs = grid.shape\n",
" start_dist = 0.0\n",
" \n",
" neighbors = [[-1, 0], # up\n",
" [ 0, 1], # right\n",
" [ 1 ,0], # down\n",
" [ 0,-1]] # left\n",
" \n",
" distance = np.full_like(grid, np.inf, dtype=np.float32) \n",
" frontier = [(start_dist, y, x)]\n",
" \n",
" while len(frontier) > 0:\n",
" dist, y, x = heappop(frontier)\n",
" distance[y,x] = dist\n",
" \n",
" for y_off, x_off in neighbors:\n",
" \n",
" # neighbor location\n",
" yn = y + y_off\n",
" xn = x + x_off\n",
" \n",
" # out of bounds\n",
" if yn < 0 or yn > ys-1:\n",
" continue\n",
" if xn < 0 or xn > xs-1:\n",
" continue\n",
" \n",
" # check if passable\n",
" if grid[yn,xn] == 0:\n",
" continue\n",
" \n",
" # neighbor distance\n",
" ndist = distance[y,x] + 1\n",
" \n",
" if np.isinf(distance[yn, xn]) or ndist < distance[yn,xn]:\n",
" distance[yn,xn] = ndist\n",
" heappush(frontier, (ndist, yn, xn))\n",
"\n",
" return distance"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"@numba.njit\n",
"def get_path_from(distance, x_end=-2, y_end=-2):\n",
" \"\"\"Get the shortest path by walking in reverse from an end point\"\"\"\n",
" \n",
" ys, xs = distance.shape\n",
"\n",
" # start of search\n",
" y = y_end % ys\n",
" x = x_end % xs\n",
" \n",
" dist = distance[y,x]\n",
" path = [(y,x)]\n",
" \n",
" neighbors = [[-1, 0], # up\n",
" [ 0, 1], # right\n",
" [ 1 ,0], # down\n",
" [ 0,-1]] # left\n",
" \n",
" while True:\n",
" \n",
" not_smaller = 0 \n",
" \n",
" for y_off, x_off in neighbors:\n",
"\n",
" yn = y + y_off\n",
" xn = x + x_off\n",
"\n",
" # out of bounds\n",
" if xn < 0 or xn > xs-1:\n",
" continue\n",
" if yn < 0 or yn > ys-1:\n",
" continue\n",
"\n",
" ndist = distance[yn, xn]\n",
"\n",
" if ndist < dist:\n",
" dist = ndist\n",
" yn_best = yn\n",
" xn_best = xn\n",
" else:\n",
" not_smaller += 1\n",
"\n",
" y = yn_best\n",
" x = xn_best\n",
" path.append((y, x))\n",
" \n",
" if not_smaller == 4:\n",
" break\n",
" \n",
" return path"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Compile to Numba"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"dijkstra_distance_numba = numba.njit()(dijkstra_distance_python)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate Maze (Aldous-Broder algorithm)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"# generate maze\n",
"maze_dims = (50, 50)\n",
"maze = aldous_broder(*maze_dims)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Dijkstra distance (for entire grid)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"# start in the upper-left corner\n",
"dist_py = dijkstra_distance_python(maze, 1, 1)\n",
"dist_num = dijkstra_distance_numba(maze, 1, 1)\n",
"\n",
"np.testing.assert_array_equal(dist_num, dist_py)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Test performance"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"63.5 ms ± 2.24 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
"1.25 ms ± 98.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
]
},
{
"data": {
"text/plain": [
"'Numba speedup: 50.79x'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"t_py = %timeit -o dist_py = dijkstra_distance_python(maze, 1, 1)\n",
"t_num = %timeit -o dist_num = dijkstra_distance_numba(maze, 1, 1)\n",
"\n",
"'Numba speedup: {:1.2f}x'.format(t_py.best / t_num.best)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extract shortest path"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# start at bottom-right corner\n",
"shortest_path = get_path_from(dist_num, x_end=-2, y_end=-2)\n",
"yverts, xverts = list(zip(*shortest_path))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plot result"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x2b3090fe748>]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x864 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(1,1, figsize=(12, 12), constrained_layout=True, subplot_kw=dict(xticks=[], yticks=[]))\n",
"\n",
"cmap = plt.cm.viridis\n",
"cmap.set_bad('k')\n",
"\n",
"ax.imshow(dist_num, origin='upper', cmap=cmap)\n",
"ax.plot(xverts, yverts, 'w-', lw=4)"
]
},
{
"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.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment