Streamlined program interface.
1.1 --- a/cau/automat.py Thu Dec 30 18:31:19 2010 +0100
1.2 +++ b/cau/automat.py Fri Dec 31 02:56:40 2010 +0100
1.3 @@ -3,53 +3,21 @@
1.4 import rules
1.5 import gridmarshal as marshal
1.6 from grid import Grid
1.7 +import argparse
1.8
1.9 -def ruleTest():
1.10 - rule = rules.Rule()
1.11 +configs = {rules.Rule1: (((0, 0), 1), ((-1, 0), 1), ((1, 0), 1), ((0, 1), 1),
1.12 +((0, -1), 1)),
1.13 +rules.Rule2: (((0, 0), 1), ((-1, 0), 1), ((1, 0), 1), ((0, 1), 1), ((0, -1), 1)),
1.14 +rules.PotentialGrowth: (((0, 0), 4),)}
1.15 +
1.16 +rulemap = {"1": rules.Rule1, "2": rules.Rule2, "3": rules.PotentialGrowth}
1.17 +
1.18 +def main(rule, iterations, dumpfile):
1.19 grid = Grid()
1.20 - grid.set((0, 0))
1.21 - grid.set((0, 1)).set((1, 0)).set((0, -1)).set((-1, 0))
1.22 + for pos, value in configs[type(rule)]:
1.23 + grid.set(pos, value)
1.24 +
1.25
1.26 -
1.27 - print "iteration radius(diff) area(diff) pi"
1.28 -
1.29 - iterations = int(sys.argv[1])
1.30 -
1.31 - for i in range(iterations):
1.32 - A = len(grid)
1.33 - r = grid.width() / 2.0
1.34 - r_ideal = math.sqrt(A / math.pi)
1.35 - A_ideal = r**2 * math.pi
1.36 - pi = A / r**2
1.37 - print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal,
1.38 - A, A - A_ideal, pi)
1.39 -
1.40 - grid = rule.iterate(grid)
1.41 - marshal.dumpGrid(grid, "grid.cfg")
1.42 - #print
1.43 -
1.44 -def rule2Test():
1.45 - rule = rules.Rule2()
1.46 - grid = Grid()
1.47 - grid.set((0, 0)).set((-1, 0)).set((0, 1))
1.48 - olda = 1
1.49 -
1.50 - iterations = int(sys.argv[1])
1.51 -
1.52 - for i in range(iterations):
1.53 - a = (float(len(grid)) - grid.width()) * 4.0
1.54 - pi = 1.0 / ((grid.width()-1)**2 / ((a + olda) / 2.0))
1.55 - print i, grid.width(), len(grid), pi
1.56 - grid = rule.iterate(grid)
1.57 - olda = a
1.58 - marshal.dumpGrid(grid, "grid.cfg")
1.59 -
1.60 -def potentialTest():
1.61 - rule = rules.PotentialGrowth()
1.62 - grid = Grid()
1.63 - grid.set((0, 0), 4)
1.64 -
1.65 - iterations = int(sys.argv[1])
1.66 last_pi = 3.0
1.67 for i in range(iterations):
1.68 A = len(grid)
1.69 @@ -61,14 +29,14 @@
1.70 last_pi = pi
1.71 print "%i %f(%f) %i(%i) %f" % (i, r, r - r_ideal,
1.72 A, A - A_ideal, pi)
1.73 -
1.74 grid = rule.iterate(grid)
1.75 - marshal.dumpGrid(grid, "grid.cfg")
1.76 -
1.77 -def main():
1.78 - #ruleTest()
1.79 - #rule2Test()
1.80 - potentialTest()
1.81 + if dumpfile:
1.82 + marshal.dumpGrid(grid, dumpfile)
1.83
1.84 if __name__ == "__main__":
1.85 - main()
1.86 + parser = argparse.ArgumentParser(description="cellular automaton.")
1.87 + parser.add_argument("iterations", type=int, help="number of iterations")
1.88 + parser.add_argument("--rule", "-r", default="3")
1.89 + parser.add_argument("--persistent", "-p")
1.90 + args = parser.parse_args()
1.91 + main(rulemap[args.rule](), args.iterations, args.persistent)
2.1 --- a/cau/rules.py Thu Dec 30 18:31:19 2010 +0100
2.2 +++ b/cau/rules.py Fri Dec 31 02:56:40 2010 +0100
2.3 @@ -1,7 +1,7 @@
2.4 import copy
2.5 from grid import Grid
2.6
2.7 -class Rule(object):
2.8 +class Rule1(object):
2.9
2.10 def iterate(self, oldgrid):
2.11 grid = copy.deepcopy(oldgrid)
2.12 @@ -42,21 +42,19 @@
2.13
2.14 def __init__(self):
2.15 random.seed()
2.16 + self.potential = 4 # values 4-8 are viable
2.17
2.18 def iterate(self, oldgrid):
2.19 grid = oldgrid
2.20 value_pos = {}
2.21 - for i in range(2, 5):
2.22 + for i in range(2, self.potential+1):
2.23 if i in oldgrid.valuemap:
2.24 value_pos[i] = copy.deepcopy(oldgrid.valuemap[i])
2.25 - for i in range(2, 5):
2.26 - if i in oldgrid.valuemap:
2.27 - for cell in value_pos[i]:
2.28 - pos = cell
2.29 - value = i
2.30 - new_pos, new_value = self.grow(grid, pos)
2.31 - grid.set(new_pos, new_value)
2.32 - grid.set(pos, value - 1)
2.33 + for value, cells in value_pos.iteritems():
2.34 + for pos in cells:
2.35 + new_pos, new_value = self.grow(grid, pos)
2.36 + grid.set(new_pos, new_value)
2.37 + grid.set(pos, value - 1)
2.38 return grid
2.39
2.40 def grow(self, grid, (x, y)):
2.41 @@ -69,8 +67,10 @@
2.42 neighbours = [n for n in neighbours if n not in grid.cells]
2.43 if len(neighbours):
2.44 pos = random.choice(neighbours)
2.45 - value = 4
2.46 + value = self.potential
2.47 else:
2.48 pos = (x, y)
2.49 value = grid.cells[pos]
2.50 return pos, value
2.51 +
2.52 +