Streamlined program interface.
authorEugen Sawin <sawine@me73.com>
Fri, 31 Dec 2010 02:56:40 +0100
changeset 80db344245ac2
parent 7 95ea605276a3
child 9 355487ddb38a
Streamlined program interface.
cau/automat.py
cau/rules.py
     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 +