#!/usr/bin/python # Generates a rule tree using a given Python transition function # read from a file. # Based on Tim Hutton's Golly script; this script does not require Golly. import sys ESC = '\033' CSI = ESC + "[" def printat(row,col,arg=""): sys.stdout.write( CSI + str(row) + ";" + str(col) + 'H' + str(arg)) class GenerateRuleTree: def __init__(self,numStates,numNeighbors,transFunc): self.numParams = numNeighbors + 1 self.world = {} self.r = [] self.params = {} self.nodeSeq = 0 self.numStates = numStates self.numNeighbors = numNeighbors self.transFunc = transFunc self.recur(self.numParams) def getNode(self,n): if n in self.world: return self.world[n] else: new_node = self.nodeSeq self.nodeSeq += 1 self.r.append(n) self.world[n] = new_node return new_node def recur(self,at): if at == 0: return self.transFunc(self.params) n = str(at) for i in xrange(self.numStates): # report progress if at == self.numParams: printat(23, 0, 'Generating rule tree: '+str(int(100*i/self.numStates))+'%...\n') self.params[self.numParams-at] = i n += " " + str(self.recur(at-1)) return self.getNode(n) def writeRuleTree(self,path): # create a .tree file in user's rules directory f=open(path, "w") f.write("# Automatically generated by make-ruletree.py.\n") f.write("num_states=" + str(self.numStates)+"\n") f.write("num_neighbors=" + str(self.numNeighbors)+"\n") f.write("num_nodes=" + str(len(self.r))+"\n") for rule in self.r: f.write(rule+"\n") f.flush() # ensure file is complete (only on Windows?) f.close() if (len(sys.argv) < 3): print("Usage: " + sys.argv[0] + " "); else: print path1 = sys.argv[1] path2 = sys.argv[2] # exec() only works if all lines end with LF, so we need to convert # any Win line endings (CR+LF) or Mac line endings (CR) to LF CR = chr(13) LF = chr(10) f = open(path1, "r") code = f.read() f.close() exec(code.replace(CR+LF,LF).replace(CR,LF)) gen = GenerateRuleTree(n_states, n_neighbors, transition_function) gen.writeRuleTree(path2)