fixed wrong evolution step used in display

This commit is contained in:
Richard Feistenauer 2019-02-23 17:37:18 +01:00
parent 924a851c43
commit 4507327bd5
9 changed files with 29 additions and 25 deletions

View File

@ -15,7 +15,8 @@ limitations under the License.
"""
import multiprocessing
from multiprocessing import freeze_support
from multiprocessing.sharedctypes import RawValue
from ctypes import c_int
@ -28,10 +29,10 @@ class CellularAutomatonProcessor:
self.evolve()
def evolve(self):
self._ca.current_evolution_step += 1
i = self._ca.current_evolution_step
r = self._ca.evolution_rule.evolve_cell
list(map(lambda c: c.evolve_if_ready(r, i), tuple(self._ca.cells.values())))
self._ca.current_evolution_step += 1
def get_dimension(self):
return self._ca.dimension
@ -48,14 +49,14 @@ class CellularAutomatonProcessor:
class CellularAutomatonMultiProcessor(CellularAutomatonProcessor):
def __init__(self, cellular_automaton, process_count: int = 2):
freeze_support()
multiprocessing.freeze_support()
if process_count < 1:
raise ValueError
super().__init__(cellular_automaton)
self.evolve_range = range(len(self._ca.cells))
self._ca.current_evolution_step = multiprocessing.RawValue(c_int, self._ca.current_evolution_step)
self._ca.current_evolution_step = RawValue(c_int, self._ca.current_evolution_step)
self.__init_processes_and_clean_cell_instances(process_count)
def __init_processes_and_clean_cell_instances(self, process_count):
@ -66,8 +67,8 @@ class CellularAutomatonMultiProcessor(CellularAutomatonProcessor):
self._ca.current_evolution_step))
def evolve(self):
self.pool.map(_process_routine, self.evolve_range)
self._ca.current_evolution_step.value += 1
self.pool.map(_process_routine, self.evolve_range)
def get_current_evolution_step(self):
return self._ca.current_evolution_step.value

View File

@ -14,11 +14,11 @@ See the License for the specific language governing permissions and
limitations under the License.
"""
import cellular_automaton.cellular_automaton.cell_state as cs
from . import cell_state
class Cell:
def __init__(self, state_class: cs.CellState, neighbors):
def __init__(self, state_class: cell_state.CellState, neighbors):
self._state = state_class
self._neighbor_states = neighbors
@ -37,7 +37,7 @@ class Cell:
[list(n.get_state_of_last_evolution_step(evolution_step)) for n in self._neighbor_states])
self.set_new_state_and_activate(new_state, evolution_step)
def set_new_state_and_activate(self, new_state: cs.CellState, evolution_step):
def set_new_state_and_activate(self, new_state: cell_state.CellState, evolution_step):
changed = self._state.set_state_of_evolution_step(new_state, evolution_step)
if changed:
self._state.set_active_for_next_evolution_step(evolution_step)

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
"""
from multiprocessing import RawArray, RawValue
from multiprocessing.sharedctypes import RawArray, RawValue
from ctypes import c_float, c_bool

View File

@ -18,11 +18,11 @@ import pygame
import time
import operator
import cellular_automaton.cellular_automaton.automaton as automaton
from . import automaton
class _CASurface:
def __init__(self, grid_rect: pygame.Rect, cellular_automaton: automaton.CellularAutomatonProcessor, screen):
def __init__(self, grid_rect, cellular_automaton: automaton.CellularAutomatonProcessor, screen):
self._cellular_automaton = cellular_automaton
self.__rect = grid_rect
self.__cell_size = self._calculate_cell_display_size()
@ -33,8 +33,8 @@ class _CASurface:
return [self.__rect.width / grid_dimension[0], self.__rect.height / grid_dimension[1]]
def redraw_cellular_automaton(self):
update_rects = list(self.__cell_redraw_dirty_rectangles())
pygame.display.update(update_rects)
update_rectangles = list(self.__cell_redraw_dirty_rectangles())
pygame.display.update(update_rectangles)
def __cell_redraw_dirty_rectangles(self):
for coordinate, cell in self._cellular_automaton.get_cells().items():
@ -45,8 +45,8 @@ class _CASurface:
cell_color = self.__get_cell_color(cell)
cell_pos = self._calculate_cell_position_in_the_grid(coordinate)
surface_pos = self._calculate_cell_position_on_screen(cell_pos)
yield self._draw_the_cell_to_screen(cell_color, surface_pos)
cell.was_redrawn()
yield self._draw_the_cell_to_screen(cell_color, surface_pos)
def __get_cell_color(self, cell):
return self._cellular_automaton.get_current_rule().get_state_draw_color(

View File

@ -1,9 +1,3 @@
from . import Neighborhood, Rule
from .automaton import CellularAutomatonProcessor, CellularAutomatonMultiProcessor
from .cell import Cell
from .state import CellularAutomatonState
from .cell_state import CellState, SynchronousCellState
from typing import Type
"""
Copyright 2019 Richard Feistenauer
@ -22,6 +16,14 @@ limitations under the License.
import itertools
from typing import Type
from . import Neighborhood, Rule
from .automaton import CellularAutomatonProcessor, CellularAutomatonMultiProcessor
from .cell import Cell
from .state import CellularAutomatonState
from .cell_state import CellState, SynchronousCellState
class CAFactory:
@staticmethod

View File

@ -15,11 +15,12 @@ limitations under the License.
"""
import abc
import cellular_automaton.cellular_automaton.neighborhood as neighbour
from . import neighborhood
class Rule:
def __init__(self, neighborhood_: neighbour.Neighborhood):
def __init__(self, neighborhood_: neighborhood.Neighborhood):
self._neighborhood = neighborhood_
def _get_neighbor_by_relative_coordinate(self, neighbours, rel_coordinate):

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
"""
from cellular_automaton.cellular_automaton import Rule
from . import Rule
class CellularAutomatonState:

View File

@ -14,7 +14,7 @@ class TestRule(Rule):
def init_state(self, cell_coordinate):
rand = random.randrange(0, 16, 1)
init = max(.0, float(rand - 14))
return (init,)
return [init]
def evolve_cell(self, last_cell_state, neighbors_last_states):
new_cell_state = last_cell_state

View File

@ -10,7 +10,7 @@ class TestRule(Rule):
def init_state(self, cell_coordinate):
rand = random.randrange(0, 101, 1)
init = max(.0, float(rand - 99))
return (init,)
return [init]
def evolve_cell(self, last_cell_state, neighbors_last_states):
return self._get_neighbor_by_relative_coordinate(neighbors_last_states, (-1, -1))