In [16]:
Copied!
%load_ext autoreload
%autoreload 2
%load_ext autoreload
%autoreload 2
The autoreload extension is already loaded. To reload it, use: %reload_ext autoreload
In [17]:
Copied!
from pylattica.core import BasicController, SynchronousRunner, SimulationState
from pylattica.structures.square_grid import MooreNbHoodBuilder, VonNeumannNbHood2DBuilder
from pylattica.discrete.state_constants import DISCRETE_OCCUPANCY
from pylattica.models.game_of_life import Maze, Anneal, Diamoeba, Seeds, Life, GameOfLifeController
from pylattica.core import BasicController, SynchronousRunner, SimulationState
from pylattica.structures.square_grid import MooreNbHoodBuilder, VonNeumannNbHood2DBuilder
from pylattica.discrete.state_constants import DISCRETE_OCCUPANCY
from pylattica.models.game_of_life import Maze, Anneal, Diamoeba, Seeds, Life, GameOfLifeController
Life-like Cellular Automata¶
There are many variations on Conway's Game of Life which Life-like Automata. There are implementations of these in pylattica for your enjoyment.
In [18]:
Copied!
from pylattica.discrete import PhaseSet
from pylattica.structures.square_grid.grid_setup import DiscreteGridSetup
from pylattica.visualization import SquareGridArtist2D, ResultArtist, DiscreteCellArtist
phases = PhaseSet(["dead", "alive"])
setup = DiscreteGridSetup(phases)
cell_artist = DiscreteCellArtist.from_phase_list(phases.phases)
from pylattica.discrete import PhaseSet
from pylattica.structures.square_grid.grid_setup import DiscreteGridSetup
from pylattica.visualization import SquareGridArtist2D, ResultArtist, DiscreteCellArtist
phases = PhaseSet(["dead", "alive"])
setup = DiscreteGridSetup(phases)
cell_artist = DiscreteCellArtist.from_phase_list(phases.phases)
Life¶
In [19]:
Copied!
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Life)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Life)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 14403.08it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:00<00:00, 60.08it/s]
In [29]:
Copied!
ResultArtist(artist, result).to_gif("Life.gif", wait=0.2, cell_size=6)
ResultArtist(artist, result).to_gif("Life.gif", wait=0.2, cell_size=6)
Seeds¶
In [28]:
Copied!
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Seeds)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Seeds.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Seeds)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Seeds.gif", wait=0.2, cell_size=6)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 14556.74it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:01<00:00, 59.55it/s]
Diamoeba¶
In [27]:
Copied!
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Diamoeba)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Diamoeba.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Diamoeba)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Diamoeba.gif", wait=0.2, cell_size=6)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 14601.01it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:01<00:00, 58.76it/s]
Anneal¶
In [26]:
Copied!
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Anneal)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Anneal.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_noise(100, ["dead", "alive"])
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Anneal)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Anneal.gif", wait=0.2, cell_size=6)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 14040.92it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:01<00:00, 57.99it/s]
Maze¶
In [31]:
Copied!
starting_state = setup.setup_particle(100, 30, "dead", "alive")
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Maze)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Maze.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_particle(100, 30, "dead", "alive")
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, Maze)
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("Maze.gif", wait=0.2, cell_size=6)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 13928.12it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:01<00:00, 57.46it/s]
Other Lifes¶
You can specify any other life variant using the Bxxx/Sxxx
syntax.
In [32]:
Copied!
starting_state = setup.setup_particle(100, 30, "dead", "alive")
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, variant="B3678/S34678")
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("daynnite.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_particle(100, 30, "dead", "alive")
artist = SquareGridArtist2D(starting_state.structure, cell_artist)
controller = GameOfLifeController(starting_state.structure, variant="B3678/S34678")
runner = SynchronousRunner(parallel=True)
result = runner.run(starting_state.state, controller, 60, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
ResultArtist(artist, result).to_gif("daynnite.gif", wait=0.2, cell_size=6)
100%|█████████████████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 14349.37it/s] 100%|██████████████████████████████████████████████████████████████████████████████████████████████| 60/60 [00:01<00:00, 56.26it/s]
In [57]:
Copied!
starting_state = setup.setup_particle(100, 30, "dead", "alive")
controller = GameOfLifeController(variant="B3/S238")
runner = Runner(parallel=True)
result = runner.run(starting_state.state, controller, 150, structure=starting_state.structure, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
DiscreteSquareGridResultArtist(artist, result).to_gif("8life.gif", wait=0.2, cell_size=6)
starting_state = setup.setup_particle(100, 30, "dead", "alive")
controller = GameOfLifeController(variant="B3/S238")
runner = Runner(parallel=True)
result = runner.run(starting_state.state, controller, 150, structure=starting_state.structure, verbose=False)
artist.jupyter_show(result.last_step, cell_size=5)
DiscreteSquareGridResultArtist(artist, result).to_gif("8life.gif", wait=0.2, cell_size=6)
100%|██████████████████████████████████████| 10000/10000 [00:00<00:00, 71312.42it/s] 100%|█████████████████████████████████████████████| 150/150 [00:07<00:00, 20.32it/s]
In [ ]:
Copied!