Skip to content

Instantly share code, notes, and snippets.

@MoGaber
Created September 20, 2020 04:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MoGaber/aa284b6953218463de0038ed8cd57db7 to your computer and use it in GitHub Desktop.
Save MoGaber/aa284b6953218463de0038ed8cd57db7 to your computer and use it in GitHub Desktop.
Lattice Gas
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pylab\n",
"import random\n",
"import copy\n",
"from tqdm import tqdm"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"columns = 300\n",
"rows = 300\n",
"def initialize():\n",
" vectorized_object = np.vectorize(lambda obj: node(False))\n",
" config = np.zeros((rows, columns)).astype(object) \n",
" config[:] = vectorized_object(config[:])\n",
" \n",
" \n",
" vectorized_object_wall = np.vectorize(lambda obj: node(True))\n",
" \n",
" config[0, :] = vectorized_object_wall(config[0, :])\n",
" config[rows-1, :] = vectorized_object_wall(config[rows-1, :])\n",
" config[:, 0] = vectorized_object_wall(config[:, 0])\n",
" config[:, columns-1] = vectorized_object_wall(config[:, columns-1])\n",
" \n",
" \n",
" return config \n",
" \n",
"\n",
"\n",
"def initialize_2():\n",
" vectorized_object = np.vectorize(lambda obj: node(False))\n",
" config = np.zeros((rows, columns)).astype(object) \n",
" config[:] = vectorized_object(config[:])\n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" \n",
" return config"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"class node: \n",
" def __init__(self, wall):\n",
" self.ni_s = [0, 0, 0, 0, 0, 0]\n",
" self.wall = wall\n",
" if not wall:\n",
" self.occupied = 0\n",
" else:\n",
" self.occupied = 1"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"def observe(config):\n",
" vectorized_x = np.vectorize(lambda obj: obj.occupied)\n",
"\n",
" view_grid = vectorized_x(config)\n",
" \n",
" plt.figure(figsize = (10, 8))\n",
" pylab.cla()\n",
" pylab.imshow(view_grid, vmin = 0, vmax = 1, cmap = pylab.cm.binary)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"def get_neighbors(coordinates, config):\n",
" row, column = coordinates\n",
" neighbors = []\n",
" neighbors.append([row, (column+1)%columns]) #right\n",
" neighbors.append([(row-1)%rows, (column+1)%columns]) # top right\n",
" neighbors.append([(row-1)%rows, (column-1)%columns]) #top left\n",
" neighbors.append([row, (column-1)%columns]) #left\n",
" neighbors.append([(row+1)%rows, (column-1)%columns]) #bottom left\n",
" neighbors.append([(row+1)%rows, (column+1)%columns]) # bottom right\n",
" \n",
" return neighbors \n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"i_coords, j_coords = np.meshgrid(range(rows), range(columns), indexing='ij')\n",
"coordinate_grid = np.array([i_coords, j_coords])\n",
"all_coordinates = []\n",
"for i in range(1, rows-1):\n",
" for j in range(1, columns-1):\n",
" all_coordinates.append(list(coordinate_grid[:, i, j]))\n",
" \n",
" \n",
"def fill_random(N, config, d = False):\n",
" samples = random.sample(all_coordinates, N)\n",
" for row,column in samples:\n",
" config[row, column].occupied = 1\n",
" \n",
" our_neighbors = get_neighbors([row, column], config)\n",
" while True:\n",
" if not d:\n",
" direction = random.choice([i for i in range(6)])\n",
" else:\n",
" direction = d-1\n",
" n_row, n_col = our_neighbors[direction]\n",
" if not config[n_row,n_col].wall:\n",
" if config[n_row,n_col].occupied == 0:\n",
" config[n_row,n_col].ni_s[direction]=1\n",
" break\n",
" \n",
" return config"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"rows = 300\n",
"columns = 300\n",
"my_grid = initialize()\n",
"my_grid = fill_random(1000, my_grid)\n",
"observe(my_grid)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"\n",
"def D_i(n, i):\n",
" \"\"\"\n",
" The head-on collision function\n",
" \"\"\"\n",
" return n[i%6]*n[(i+3)%6]*(1-n[(i+1)%6])*(1-n[(i+2)%6])*(1-n[(i+4)%6])\n",
"\n",
"def T_i(n, i):\n",
" \"\"\"\n",
" The three-body collision function\n",
" \"\"\"\n",
" return n[i]*n[(i+2)%6]*n[(i+4)%6]*(1-n[(i+1)%6])*(1-n[(i+3)%6])*(1-n[(i+5)%6])\n",
"def collision_factor(coords, config, i):\n",
" \"\"\"\n",
" The collision factor Ω\n",
" \"\"\"\n",
" q = random.choice([0, 1])\n",
" n = config[coords[0], coords[1]].ni_s\n",
" coll = -D_i(n, i)+q*D_i(n, (i-1)%6) + (1-q)*D_i(n, (i+1)%6) - T_i(n, i)+T_i(n, (i+3)%6)\n",
" return coll"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"\\ndef update(config):\\n #next_config = config\\n next_config = initialize()\\n for row in range(rows):\\n for column in range(columns):\\n \\n our_neighbors = get_neighbors([row, column], config)\\n \\n for i in range(6): #coming to me from the i direction and going to the i+3 direction\\n \\n # for each direction surronding this cell:\\n \\n if config[row, column].ni_s[i] >=1: #if there is particle coming from that direction:\\n other_row,other_col = our_neighbors[(i+3)% 6] # then get the coordinate of the next cell\\n if not config[other_row, other_col].wall: #if it's not a wall\\n \\n #calculate its value using the FHP equation\\n next_config[other_row,other_col].ni_s[i] = config[row, column].ni_s[i]+ collision_factor([row, column], config, i)\\n\\n # then update so that the coming particle can enter the cell\\n next_config[row, column].occupied = 1\\n th_row, th_col = our_neighbors[i]\\n next_config[th_row, th_col].occupied = 0\\n next_config[row, column].ni_s[i] = 0\\n\\n \\n else: #if it's a wall \\n \\n #let it advance to the cell\\n next_config[row, column].occupied = 1\\n th_row, th_col = our_neighbors[i]\\n next_config[th_row, th_col].occupied = 0\\n next_config[row, column].ni_s[i] = 0\\n \\n # then update its direction so that it bounces\\n next_config[th_row,th_col].ni_s[(i+3)%6]=1\\n \\n \\n \\n\\n \\n return next_config \\n\""
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"\"\"\"\n",
"def update(config):\n",
" #next_config = config\n",
" next_config = initialize()\n",
" for row in range(rows):\n",
" for column in range(columns):\n",
" \n",
" our_neighbors = get_neighbors([row, column], config)\n",
" \n",
" for i in range(6): #coming to me from the i direction and going to the i+3 direction\n",
" \n",
" # for each direction surronding this cell:\n",
" \n",
" if config[row, column].ni_s[i] >=1: #if there is particle coming from that direction:\n",
" other_row,other_col = our_neighbors[(i+3)% 6] # then get the coordinate of the next cell\n",
" if not config[other_row, other_col].wall: #if it's not a wall\n",
" \n",
" #calculate its value using the FHP equation\n",
" next_config[other_row,other_col].ni_s[i] = config[row, column].ni_s[i]+\\\n",
" collision_factor([row, column], config, i)\n",
"\n",
" # then update so that the coming particle can enter the cell\n",
" next_config[row, column].occupied = 1\n",
" th_row, th_col = our_neighbors[i]\n",
" next_config[th_row, th_col].occupied = 0\n",
" next_config[row, column].ni_s[i] = 0\n",
"\n",
" \n",
" else: #if it's a wall \n",
" \n",
" #let it advance to the cell\n",
" next_config[row, column].occupied = 1\n",
" th_row, th_col = our_neighbors[i]\n",
" next_config[th_row, th_col].occupied = 0\n",
" next_config[row, column].ni_s[i] = 0\n",
" \n",
" # then update its direction so that it bounces\n",
" next_config[th_row,th_col].ni_s[(i+3)%6]=1\n",
" \n",
" \n",
" \n",
"\n",
" \n",
" return next_config \n",
"\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"def update(config):\n",
" next_config = initialize()\n",
" \n",
" for row in range(rows):\n",
" for column in range(columns): # for each cell in the grid\n",
" if not config[row, column].wall: # if it's not a wall\n",
"\n",
" #get all of its neighbors \n",
" our_neighbors = get_neighbors([row, column], config)\n",
" \n",
" \n",
" bounce_direc = [] # make this list to store if it's going to bounce off a wall\n",
" \n",
" for i in range(6):# for each neighbor\n",
"\n",
" # start by letting the particle that is coming along i (from i+3) get in\n",
" if config[row, column].ni_s[i] >0:\n",
"\n",
" # then update so that the coming particle can enter the cell\n",
" next_config[row, column].occupied = 1\n",
" th_row, th_col = our_neighbors[(i+3)%6] # the cell that sent that particle\n",
" if not next_config[th_row, th_col].wall: \n",
" next_config[th_row, th_col].occupied = 0 # update it to 0 since the particle moved already\n",
" next_config[row, column].ni_s[i] = 0\n",
"\n",
"\n",
" #then for each neghibor, check if something will pop inside them from this cell and change their n_i\n",
" other_row, other_col = our_neighbors[i]\n",
" #calculate its value using the FHP equation\n",
" next_config[other_row,other_col].ni_s[i] = config[row, column].ni_s[i]+\\\n",
" collision_factor([row, column], config, i)\n",
" \n",
" # check if any particle is hitting the wall:\n",
" if next_config[other_row,other_col].wall and next_config[other_row,other_col].ni_s[i]>0:\n",
" next_config[other_row,other_col].ni_s[i] = 0\n",
" bounce_direc.append((i+3)%6) #store their bounce off directions\n",
" \n",
" # if any particles were hiting the wall, send them back: \n",
" if bounce_direc:\n",
" next_config[row, column].ni_s[bounce_direc[0]] = 1\n",
"\n",
"\n",
" \n",
"\n",
" \n",
" return next_config "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"def update_periodic(config):\n",
" #next_config = config\n",
" next_config = initialize_2()\n",
" for row in range(rows):\n",
" for column in range(columns): \n",
" our_neighbors = get_neighbors([row, column], config)\n",
" for i in range(6):\n",
" \n",
" other_row, other_col = our_neighbors[i]\n",
" #calculate its value using the FHP equation\n",
" next_config[other_row,other_col].ni_s[i] = config[row, column].ni_s[i]+\\\n",
" collision_factor([row, column], config, i)\n",
"\n",
" if config[row, column].ni_s[i] >0:\n",
"\n",
" # then update so that the coming particle can enter the cell\n",
" next_config[row, column].occupied = 1\n",
" th_row, th_col = our_neighbors[i]\n",
" next_config[th_row, th_col].occupied = 0\n",
" next_config[row, column].ni_s[i] = 0\n",
"\n",
"\n",
" \n",
"\n",
" \n",
" return next_config "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 200/200 [00:17<00:00, 11.29it/s]\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def turn_state(config):\n",
" \"\"\"\n",
" A function to visualize the states\n",
" \"\"\"\n",
" view_grid = np.copy(config)\n",
" for i in range(len(config)):\n",
" for j in range(len(config)):\n",
" if type(config[i,j]) is not int:\n",
" view_grid[i, j] = config[i,j].occupied\n",
" view_grid = view_grid.astype(int)\n",
" return view_grid\n",
"\n",
"my_grid = initialize_2()\n",
"my_grid = fill_random(100, my_grid)\n",
"observe(my_grid)\n",
"\n",
"states = []\n",
"states.append(turn_state(my_grid))\n",
"next_grid = update(my_grid)\n",
"states.append(turn_state(next_grid))\n",
"\n",
"states.append(turn_state(next_grid))\n",
"for i in tqdm(range(200)):\n",
" next_grid = update(next_grid)\n",
" states.append(turn_state(next_grid))\n",
"\n",
" \n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib\n",
"import matplotlib.animation as animation\n",
"from IPython.display import Video\n",
"import matplotlib as mpl\n",
"\n",
"def build_animation(states, save_name):\n",
" \"\"\"\n",
" A function that makes a very nice animation that can be used to debug the code or to \n",
" enjoy watching the mini city model\n",
" \n",
" Source: https://stackoverflow.com/questions/17212722/matplotlib-imshow-how-to-animate\n",
" \"\"\"\n",
" \n",
" fps = 20\n",
" nSeconds = len(states)// fps\n",
"\n",
" # First set up the figure, the axis, and the plot element we want to animate\n",
" fig = plt.figure( figsize=(8,8) )\n",
"\n",
" a = states[0]\n",
"\n",
"\n",
"\n",
" pylab.cla()\n",
" im = pylab.imshow(a, vmin = 0, vmax = 1, cmap = pylab.cm.binary)\n",
"\n",
"\n",
" def animate_func(i):\n",
" if i % fps == 0:\n",
" print( '.', end ='' )\n",
"\n",
" im.set_array(states[i])\n",
" return [im]\n",
"\n",
" anim = animation.FuncAnimation(\n",
" fig, \n",
" animate_func, \n",
" frames = nSeconds * fps,\n",
" interval = 1000 / fps, # in ms\n",
" )\n",
"\n",
" anim.save(save_name, fps=fps, extra_args=['-vcodec', 'libx264'])\n",
"\n",
" print('Done!')\n"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"...........Done!\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAAHSCAYAAAC6vFFPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAR8klEQVR4nO3dT4jkZ53H8c93Z+MqyKLZNWHIxI2HYTHIGmEIAT2IGBg1OLkoCsIchLm4EMFFRi+yCwuexIuXQYMDihpW2QxeljAqehDXGddFJUqCaMw6ZBAV9aKozx66om1mJlXT9a0/v+rXC0J3Vc9MP/VUdb/zdPXzVI0xAgAs7682PQAA2BWiCgBNRBUAmogqADQRVQBoIqoA0OSv1/nJqsr+HQCm7mdjjJdd7wNLrVSr6mRV/aCqnqyqs8v8WwAwET++0QcOHNWqOpLkY0nelOTuJO+sqrsP+u8BwNQts1K9N8mTY4wfjjF+l+SzSU71DAsApmeZqN6R5Cf7Lj89u+4vVNWZqrpUVZeW+FwAsPWW+UWlus511/wi0hjjXJJziV9UAmC3LbNSfTrJnfsuH0vy0+WGAwDTtUxUv5nkeFW9oqpekOQdSS70DAsApufAP/4dY/y+qv45yX8lOZLk4THG99pGBgATU+t8PdVFnlNd13iqrveU8PrHkWzXWADWbd73wGR72jBzeYxx4nofcEwhADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBN1voi5dvE3k+A7bBL34+tVAGgiagCQBNRBYAmogoATUQVAJqIKgA0EVUAaCKqANDk0B7+sC7b9OK7U2LeYPXmfZ35Grt5VqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmogqADQRVQBo4vCHFbN5+mDMG6yer7N+VqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmogqADSxT5Wb4sXDAW7MShUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBNHP7ATXGwA8+adxDIIo8Vh4mQ7NbjwEoVAJqIKgA0EVUAaCKqANBEVAGgiagCQBNRBYAmogoATRz+ABxIx2b8qWzo77RLBx102aXba6UKAE1EFQCaiCoANBFVAGgiqgDQRFQBoImoAkATUQWAJg5/gAbzNvTv0uZ2luOxsNusVAGgiagCQBNRBYAmogoATUQVAJqIKgA0EVUAaGKfKjSw9/Bau/Zi3Ou8PfY9T5eVKgA0EVUAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJo4/AEa2Kx/rV27zeu8Pbs2dx2mcpjI3JVqVT1cVVer6rv7rru1qh6rqidmb1+62mECwPZb5Me/n0xy8jnXnU1ycYxxPMnF2WUAONTmRnWM8dUkP3/O1aeSnJ+9fz7Jg73DAoDpOehzqrePMa4kyRjjSlXddqM/WFVnkpw54OcBgMlY+S8qjTHOJTmXJFW1+WeRAWBFDrql5pmqOpoks7dX+4YEANN00KheSHJ69v7pJI/2DAcApmuRLTWfSfL1JP9YVU9X1buTfDjJ/VX1RJL7Z5cB4FCrdW6WXeQ51W3YvLuoRTYjL2JKtxlgly34ff3yGOPE9T7gmEIAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJp4kfIl2F96OEzlxZG5Mfch62KlCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCYOf4A5HAowfe5D1sVKFQCaiCoANBFVAGgiqgDQRFQBoImoAkATUQWAJqIKAE0c/kC7qnrej9uIz7rNe0wmHpe7YBvuZytVAGgiqgDQRFQBoImoAkATUQWAJqIKAE1EFQCa2KcKc2zD3jeW4/45HLbhfrZSBYAmogoATUQVAJqIKgA0EVUAaCKqANBEVAGgiagCQBOHP9BuGzZgd9qm2+MF4A/GAR6si5UqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmjj8gZsytU30u3ZYwpTGu67HytQek4vYtcftYWKlCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaH9vCHRTaMz3MYN2BP7TZPbby7ZF1zv033cddBFNt0m7g5VqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmogqADQ5tPtU7QObvl17cepduz2HkfsHK1UAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJqIKgA0ObSHP+yaw3hwgNsDbJu5K9WqurOqvlxVj1fV96rqodn1t1bVY1X1xOztS1c/XADYXov8+Pf3Sd43xnhlkvuSvKeq7k5yNsnFMcbxJBdnlwHg0Job1THGlTHGt2bv/zrJ40nuSHIqyfnZHzuf5MEVjREAJuGmnlOtqruSvCbJN5LcPsa4kuyFt6puu8HfOZPkzJLjBICtt3BUq+rFST6f5L1jjF8t8osxSTLGOJfk3Ozf8JsYAOyshbbUVNUt2Qvqp8cYX5hd/UxVHZ19/GiSq6sZIgBMwyK//VtJPpHk8THGR/Z96EKS07P3Tyd5tH94ADAdNW9vXFW9LsnXknwnyR9nV38we8+rPpLk5UmeSvK2McbP5/xbc3/8a6/ewRzGfaoA3RZ8avPyGOPEdf/+Or/R7lpUhQxgtywbVccUAkATUQWAJqIKAE1EFQCaiCoANBFVAGgiqgDQxIuUL8EeVAD2s1IFgCaiCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE4c/3MA6X4B83udyyATbyOMWrmWlCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCYOf7iBdW5ct0meKfK4hWtZqQJAE1EFgCaiCgBNRBUAmogqADQRVQBoIqoA0MQ+Vdgh8144PLG/dAq8APx0WakCQBNRBYAmogoATUQVAJqIKgA0EVUAaCKqANBEVAGgicMfYIccxkMBdvHAi6mNlz+zUgWAJqIKAE1EFQCaiCoANBFVAGgiqgDQRFQBoImoAkAThz/AltjFQwzWwZywTaxUAaCJqAJAE1EFgCaiCgBNRBUAmogqADQRVQBoIqoA0MThD7AlHGIA02elCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE/tUOdS8MDi7ymN7M6xUAaCJqAJAE1EFgCaiCgBNRBUAmogqADQRVQBoIqoA0GTu4Q9V9cIkX03yN7M//x9jjA9V1a1JPpfkriQ/SvL2McYvVjdUno+N3gdjTthVHtubschK9bdJ3jDGeHWSe5KcrKr7kpxNcnGMcTzJxdllADi05kZ17PnN7OIts/9GklNJzs+uP5/kwVUMEACmYqHnVKvqSFV9O8nVJI+NMb6R5PYxxpUkmb29bWWjBIAJWCiqY4w/jDHuSXIsyb1V9apFP0FVnamqS1V16YBjBIBJuKnf/h1j/DLJV5KcTPJMVR1Nktnbqzf4O+fGGCfGGCeWGyoAbLe5Ua2ql1XVS2bvvyjJG5N8P8mFJKdnf+x0kkdXNEYAmIRFXk/1aJLzVXUkexF+ZIzxxar6epJHqurdSZ5K8rYVjhMAtl6tcy9TVc39ZPZWHYx9qgDLW+R7aZLLN3pKc5GVKktYV+y2KZjzbvM2jRWgk2MKAaCJqAJAE1EFgCaiCgBNRBUAmogqADQRVQBoYp/qinXsyZzawQ7bNJZtMbX7EDgYK1UAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJqIKgA0cfjDBDgUYPrchzzLQSC7zUoVAJqIKgA0EVUAaCKqANBEVAGgiagCQBNRBYAmogoATRz+sGI2em8398/qbNPcbtNYDuNt7jCV22OlCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE/tUV2wb9k1xY+6f1dmmud2msazLNt3meXtMt2msy7JSBYAmogoATUQVAJqIKgA0EVUAaCKqANBEVAGgiagCQBOHPwCwUh2HO0zlgAgrVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmogqADRx+ANwIFX1vB+fymZ96GSlCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCYOf2Cy5h0+kDiAYJXMLVzLShUAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCb2qd6APZDbz/yvjsc/HIyVKgA0EVUAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJosfPhDVR1JcinJ/40xHqiqW5N8LsldSX6U5O1jjF+sYpCbcBg3tm/Thv9tGsthZG6Zom34vnEzK9WHkjy+7/LZJBfHGMeTXJxdBoBDa6GoVtWxJG9J8vF9V59Kcn72/vkkD7aODAAmZtGV6keTvD/JH/ddd/sY40qSzN7e1js0AJiWuVGtqgeSXB1jXD7IJ6iqM1V1qaouHeTvA8BULPKLSq9N8taqenOSFyb526r6VJJnquroGONKVR1NcvV6f3mMcS7JuSSpKr/9AMDOmrtSHWN8YIxxbIxxV5J3JPnSGONdSS4kOT37Y6eTPLqyUQLABCyzT/XDSe6vqieS3D+7DACHVq1zP9oiP/61P25ztmGP17O2aSzANHR831jk30hyeYxx4nofWPjwB3bfIpFaV+y6gjlvvMIMu2Mbvp4dUwgATUQVAJqIKgA0EVUAaCKqANBEVAGgiagCQBP7VLkp27APjN3hkA92jZUqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBNRBUAmjj84QZsSt8N7qPt1nH/+Fplm1ipAkATUQWAJqIKAE1EFQCaiCoANBFVAGgiqgDQRFQBoInDH27AZnGYhl38Wp13oMXUbvOu3Z7nY6UKAE1EFQCaiCoANBFVAGgiqgDQRFQBoImoAkAT+1T5Ey/2vP0O036/Re3i43Zq451n127P87FSBYAmogoATUQVAJqIKgA0EVUAaCKqANBEVAGgiagCQBOHP/Anh2mD9s3YpsMF3EfXWmROtuk+3DXm9i9ZqQJAE1EFgCaiCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJwx/YStu0ofwwbVx/1jbNf4cpjXVqzO1fslIFgCaiCgBNRBUAmogqADQRVQBoIqoA0ERUAaCJqAJAk0N7+MO8ze02NF/fug4FMP+bZf6nb9cO8JgKK1UAaCKqANBEVAGgiagCQBNRBYAmogoATUQVAJps3T7VRfZWrcO2jGOKzB1Mg6/VflaqANBEVAGgiagCQBNRBYAmogoATUQVAJqIKgA0EVUAaLLuwx9+luTH+y7//ew6+pnb1TG3q2NuV8fc9vmHG32gNvnK71V1aYxxYmMD2GHmdnXM7eqY29Uxt+vhx78A0ERUAaDJpqN6bsOff5eZ29Uxt6tjblfH3K7BRp9TBYBdsumVKgDsjI1FtapOVtUPqurJqjq7qXHsgqp6uKquVtV39113a1U9VlVPzN6+dJNjnKqqurOqvlxVj1fV96rqodn15ndJVfXCqvrvqvrf2dz+6+x6c9ugqo5U1f9U1Rdnl83rGmwkqlV1JMnHkrwpyd1J3llVd29iLDvik0lOPue6s0kujjGOJ7k4u8zN+32S940xXpnkviTvmT1Wze/yfpvkDWOMVye5J8nJqrov5rbLQ0ke33fZvK7Bplaq9yZ5cozxwzHG75J8NsmpDY1l8sYYX03y8+dcfSrJ+dn755M8uM4x7YoxxpUxxrdm7/86e9+k7oj5XdrY85vZxVtm/42Y26VV1bEkb0ny8X1Xm9c12FRU70jyk32Xn55dR5/bxxhXkr0wJLltw+OZvKq6K8lrknwj5rfF7EeU305yNcljYwxz2+OjSd6f5I/7rjOva7CpqNZ1rvNryGytqnpxks8nee8Y41ebHs+uGGP8YYxxT5JjSe6tqldteEiTV1UPJLk6xri86bEcRpuK6tNJ7tx3+ViSn25oLLvqmao6miSzt1c3PJ7JqqpbshfUT48xvjC72vw2GmP8MslXsve7AeZ2Oa9N8taq+lH2nlp7Q1V9KuZ1LTYV1W8mOV5Vr6iqFyR5R5ILGxrLrrqQ5PTs/dNJHt3gWCarqirJJ5I8Psb4yL4Pmd8lVdXLquols/dflOSNSb4fc7uUMcYHxhjHxhh3Ze9765fGGO+KeV2LjR3+UFVvzt7P/Y8keXiM8e8bGcgOqKrPJHl99l6F4pkkH0ryn0keSfLyJE8ledsY47m/zMQcVfW6JF9L8p38+fmpD2bveVXzu4Sq+qfs/cLMkez9D/4jY4x/q6q/i7ltUVWvT/IvY4wHzOt6OFEJAJo4UQkAmogqADQRVQBoIqoA0ERUAaCJqAJAE1EFgCaiCgBN/h9GSaS/FL962gAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"build_animation(states, \"try_9.mp4\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<video src=\"try_9.mp4\" controls >\n",
" Your browser does not support the <code>video</code> element.\n",
" </video>"
],
"text/plain": [
"<IPython.core.display.Video object>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.display import Video\n",
"Video(\"try_9.mp4\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment