# HG changeset patch # User Eugen Sawin # Date 1293760600 -3600 # Node ID 0db344245ac2cd7ade5c9f7879ed259c8b26fd88 # Parent 95ea605276a3681e6f1c6a31bbede5d2fdd63c54 Streamlined program interface. diff -r 95ea605276a3 -r 0db344245ac2 cau/automat.py --- a/cau/automat.py Thu Dec 30 18:31:19 2010 +0100 +++ b/cau/automat.py Fri Dec 31 02:56:40 2010 +0100 @@ -3,53 +3,21 @@ import rules import gridmarshal as marshal from grid import Grid +import argparse -def ruleTest(): - rule = rules.Rule() +configs = {rules.Rule1: (((0, 0), 1), ((-1, 0), 1), ((1, 0), 1), ((0, 1), 1), +((0, -1), 1)), +rules.Rule2: (((0, 0), 1), ((-1, 0), 1), ((1, 0), 1), ((0, 1), 1), ((0, -1), 1)), +rules.PotentialGrowth: (((0, 0), 4),)} + +rulemap = {"1": rules.Rule1, "2": rules.Rule2, "3": rules.PotentialGrowth} + +def main(rule, iterations, dumpfile): grid = Grid() - grid.set((0, 0)) - grid.set((0, 1)).set((1, 0)).set((0, -1)).set((-1, 0)) + for pos, value in configs[type(rule)]: + grid.set(pos, value) + - - print "iteration radius(diff) area(diff) pi" - - iterations = int(sys.argv[1]) - - for i in range(iterations): - A = len(grid) - r = grid.width() / 2.0 - r_ideal = math.sqrt(A / math.pi) - A_ideal = r**2 * math.pi - pi = A / r**2 - print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, - A, A - A_ideal, pi) - - grid = rule.iterate(grid) - marshal.dumpGrid(grid, "grid.cfg") - #print - -def rule2Test(): - rule = rules.Rule2() - grid = Grid() - grid.set((0, 0)).set((-1, 0)).set((0, 1)) - olda = 1 - - iterations = int(sys.argv[1]) - - for i in range(iterations): - a = (float(len(grid)) - grid.width()) * 4.0 - pi = 1.0 / ((grid.width()-1)**2 / ((a + olda) / 2.0)) - print i, grid.width(), len(grid), pi - grid = rule.iterate(grid) - olda = a - marshal.dumpGrid(grid, "grid.cfg") - -def potentialTest(): - rule = rules.PotentialGrowth() - grid = Grid() - grid.set((0, 0), 4) - - iterations = int(sys.argv[1]) last_pi = 3.0 for i in range(iterations): A = len(grid) @@ -61,14 +29,14 @@ last_pi = pi print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal, A, A - A_ideal, pi) - grid = rule.iterate(grid) - marshal.dumpGrid(grid, "grid.cfg") - -def main(): - #ruleTest() - #rule2Test() - potentialTest() + if dumpfile: + marshal.dumpGrid(grid, dumpfile) if __name__ == "__main__": - main() + parser = argparse.ArgumentParser(description="cellular automaton.") + parser.add_argument("iterations", type=int, help="number of iterations") + parser.add_argument("--rule", "-r", default="3") + parser.add_argument("--persistent", "-p") + args = parser.parse_args() + main(rulemap[args.rule](), args.iterations, args.persistent) diff -r 95ea605276a3 -r 0db344245ac2 cau/rules.py --- a/cau/rules.py Thu Dec 30 18:31:19 2010 +0100 +++ b/cau/rules.py Fri Dec 31 02:56:40 2010 +0100 @@ -1,7 +1,7 @@ import copy from grid import Grid -class Rule(object): +class Rule1(object): def iterate(self, oldgrid): grid = copy.deepcopy(oldgrid) @@ -42,21 +42,19 @@ def __init__(self): random.seed() + self.potential = 4 # values 4-8 are viable def iterate(self, oldgrid): grid = oldgrid value_pos = {} - for i in range(2, 5): + for i in range(2, self.potential+1): if i in oldgrid.valuemap: value_pos[i] = copy.deepcopy(oldgrid.valuemap[i]) - for i in range(2, 5): - if i in oldgrid.valuemap: - for cell in value_pos[i]: - pos = cell - value = i - new_pos, new_value = self.grow(grid, pos) - grid.set(new_pos, new_value) - grid.set(pos, value - 1) + for value, cells in value_pos.iteritems(): + for pos in cells: + new_pos, new_value = self.grow(grid, pos) + grid.set(new_pos, new_value) + grid.set(pos, value - 1) return grid def grow(self, grid, (x, y)): @@ -69,8 +67,10 @@ neighbours = [n for n in neighbours if n not in grid.cells] if len(neighbours): pos = random.choice(neighbours) - value = 4 + value = self.potential else: pos = (x, y) value = grid.cells[pos] return pos, value + +