neuropercolation/src/cellular_automaton/cellular_automaton.py

52 lines
1.6 KiB
Python
Raw Normal View History

2019-01-31 12:38:48 +00:00
import multiprocessing
2018-12-01 19:37:18 +00:00
from cellular_automaton.ca_rule import Rule
2019-02-09 18:06:18 +00:00
from cellular_automaton.ca_cell import Cell
2018-12-01 14:14:22 +00:00
class CellularAutomaton:
def __init__(self, cells, dimension, evolution_rule: Rule):
self.cells = cells
self.dimension = dimension
2018-12-08 21:33:13 +00:00
self.evolution_rule = evolution_rule
self.evolution_iteration_index = multiprocessing.RawValue('i', -1)
2018-12-01 14:14:22 +00:00
2018-12-01 19:37:18 +00:00
class CellularAutomatonProcessor:
2019-01-31 12:38:48 +00:00
def __init__(self, cellular_automaton, process_count: int = 1):
self.ca = cellular_automaton
2019-02-09 18:06:18 +00:00
cells = {i: (c.state, c.neighbours) for i, c in enumerate(self.ca.cells)}
self.evolve_range = range(len(self.ca.cells))
self.pool = multiprocessing.Pool(processes=process_count,
initializer=_init_process,
2019-02-09 17:16:19 +00:00
initargs=(cells,
self.ca.evolution_rule,
self.ca.evolution_iteration_index))
for cell in self.ca.cells:
2019-02-09 18:06:18 +00:00
del cell.neighbours
def evolve_x_times(self, x):
for x in range(x):
self.evolve()
def evolve(self):
self.ca.evolution_iteration_index.value += 1
self.pool.map(_process_routine, self.evolve_range)
global_cells = None
global_rule = None
global_iteration = None
def _init_process(cells, rule, index):
global global_rule, global_cells, global_iteration
global_cells = cells
global_rule = rule
global_iteration = index
def _process_routine(i):
2019-02-09 18:06:18 +00:00
Cell.evolve_if_ready(global_cells[i], global_rule.evolve_cell, global_iteration.value)