Here's a dirty patch for the errors you are getting: Replace lines 1054 to the end of RuleGenerator.saveContagiousLife() with this:
Code: Select all
def saveCoalesceObjects(self):
comments = """
A variant of HistoricalLife which separates a field of ash into
distinct objects.
state 0: vacuum
state 1: ON
state 2: OFF
"""
table = "n_states:3\n"
table += "neighborhood:Moore\n"
if ruletype: #Outer-totalistic
table += "symmetries:permute\n\n"
table += self.newvars(["a","b","c","d","e","f","g","h","i"], [0, 1, 2])
table += self.newvars(["da","db","dc","dd","de","df","dg","dh","di"], [0, 2])
table += self.newvars(["la","lb","lc","ld","le","lf","lg","lh","li"], [1])
minperc = 10
for i in xrange(9):
if (self.bee[i]):
if (minperc == 10):
minperc = i
table += self.scoline("l","d",0,1,i)
table += self.scoline("l","d",2,1,i)
if (self.ess[i]):
table += self.scoline("l","d",1,1,i)
table += "\n# Bridge inductors\n"
for i in xrange(9):
if (i >= minperc):
table += self.scoline("l","d",0,2,i)
table += self.scoline("","",1,2,0)
else: #Isotropic non-totalistic
rule1 = open(g.getdir("app") + "Rules/" + self.slashed + ".rule", "r")
lines1 = rule1.read().split("\n")
rule1.close()
for q in xrange(len(lines1)-1):
if lines1[q].startswith("@TABLE"):
lines1 = lines1[q:]
break
vars = []
for q in xrange(len(lines1)-1): #Copy symmetries and vars
i = lines1[q]
if i[:2] == "sy" or i[:1] == "sy":
table += i + "\n\n"
if i[:2] == "va" or i[:1] == "va":
table += self.newvar(i[4:5].replace("=", ""), [0, 1, 2])
vars.append(i[4:5].replace("=", ""))
if i != "":
if i[0] == "0" or i[0] == "1":
break
alpha = "abcdefghijklmnopqrstuvwxyz"
vars2 = []
for i in alpha:
if not i in [n[0] for n in vars]: #Create new set of vars for OFF cells
table += self.newvars([i + j for j in alpha[:9]], [0, 2])
vars2 = [i + j for j in alpha[:9]]
break
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in vars2]:
for j in xrange(5-len(vars)):
table += self.newvar(i + alpha[j], [0, 1, 2])
vars.append(i + alpha[j])
break
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1 and not i.startswith("var"):
vn = 0
vn2 = 0
for j in q[:-1]:
if j == "0":
table += vars2[vn2]
vn2 += 1
elif j == "1":
table += "1"
elif j != "#":
g.show(str(len(vars)))
table += vars[vn]
vn += 1
table += ","
table += str(2-int(q[len(q)-1]))
table += "\n"
for i in xrange(256): #Get all B3+ rules
ncells = 0
for j in xrange(8):
if (i & 2**j) > 0:
ncells += 1
if ncells == 3:
q = "0,"
vn = 0
for j in xrange(8):
if i & 2**j > 0:
q += str((i & 2**j)/2**j) + ","
else:
q += vars[vn] + ","
vn += 1
q += "2\n"
table += q
colours = """
0 0 0 0
1 255 255 255
2 127 127 127
"""
self.saverule("APG_CoalesceObjects_"+self.alphanumeric, comments, table, colours)
def saveClassifyObjects(self):
comments = """
This passively classifies objects as either still-lifes, p2 oscillators
or higher-period oscillators. It is mandatory that one first runs the
rule CoalesceObjects.
state 0: vacuum
state 1: input ON
state 2: input OFF
state 3: ON, will die
state 4: OFF, will remain off
state 5: ON, will survive
state 6: OFF, will become alive
state 7: ON, still-life
state 8: OFF, still-life
state 9: ON, p2 oscillator
state 10: OFF, p2 oscillator
state 11: ON, higher-period object
state 12: OFF, higher-period object
"""
table = "n_states:17\n"
table += "neighborhood:Moore\n"
if ruletype: #Outer-totalistic
table += "symmetries:permute\n\n"
table += self.newvars(["a","b","c","d","e","f","g","h","i"], range(0, 17, 1))
table += self.newvars(["la","lb","lc","ld","le","lf","lg","lh","li"], range(1, 17, 2))
table += self.newvars(["da","db","dc","dd","de","df","dg","dh","di"], range(0, 17, 2))
table += self.newvars(["pa","pb","pc","pd","pe","pf","pg","ph","pi"], [0, 3, 4])
table += self.newvars(["qa","qb","qc","qd","qe","qf","qg","qh","qi"], [5, 6])
#Serious modifications necessary:
for i in xrange(9):
if (self.bee[i]):
table += self.scoline("l","d",2,6,i)
table += self.scoline("q","p",3,9,i)
table += self.scoline("q","p",4,12,i)
if (self.ess[i]):
table += self.scoline("l","d",1,5,i)
table += self.scoline("q","p",5,7,i)
table += self.scoline("q","p",6,12,i)
table += self.scoline("","",2,4,0)
table += self.scoline("","",1,3,0)
table += self.scoline("","",5,11,0)
table += self.scoline("","",3,11,0)
table += self.scoline("","",4,8,0)
table += self.scoline("","",6,10,0)
else: #Isotropic non-totalistic
rule1 = open(g.getdir("app") + "Rules/" + self.slashed + ".rule", "r")
lines1 = rule1.read().split("\n")
rule1.close()
for q in xrange(len(lines1)-1):
if lines1[q].startswith("@TABLE"):
lines1 = lines1[q:]
break
if lines1[0].startswith("@TREE"):
g.warn("apgsearch v.0.54+0.1i does not support rule trees")
vars = []
for q in xrange(len(lines1)-1): #Copy symmetries and vars
i = lines1[q]
if i[:2] == "sy" or i[:1] == "sy":
table += i + "\n\n"
if i[:2] == "va" or i[:1] == "va":
table += self.newvar(i[4:5].replace("=", ""), [0, 1, 2])
vars.append(i[4:5].replace("=", ""))
if i != "":
if i[0] == "0" or i[0] == "1":
break
alpha = "abcdefghijklmnopqrstuvwxyz"
ovars = []
for i in alpha:
if not i in [n[0] for n in vars]: #Create new set of vars for ON cells
table += self.newvars([i + j for j in alpha[:9]], [1, 5, 6])
ovars = [i + j for j in alpha[:9]]
break
dvars = []
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in ovars]: #Create new set of vars for OFF cells
table += self.newvars([i + j for j in alpha[:9]], [0, 2, 3, 4])
dvars = [i + j for j in alpha[:9]]
break
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in ovars] and not i in [n[0] for n in dvars]:
for j in xrange(8-len(vars)):
table += self.newvar(i + alpha[j], [0, 1, 2, 3, 4, 5, 6])
vars.append(i + alpha[j])
break
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1:
vn = 0
ovn = 0
dvn = 0
if q[0] == "0" or q[0] == "1":
if q[0] == "0":
table += "2"
elif q[0] == "1":
table += "1"
elif q[0] != "#":
table += vars[vn]
vn += 1
table += ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += "1"
elif j != "#":
table += vars[vn]
vn += 1
table += ","
table += str(4-int(q[0])+2*int(q[len(q)-1]))
table += "\n"
elif not i.startswith("var"): #Line starts with a variable.
table += vars[vn] + ","
vn += 1
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += "1"
elif j != "#":
table += vars[vn]
vn += 1
table += ","
table += str(4+2*int(q[len(q)-1]))
table += "\n1,"
vn = 0
for j in q[1:-1]:
if j == "0":
table += "2"
elif j == "1":
table += "1"
elif j != "#":
table += vars[vn]
vn += 1
table += ","
table += str(3+2*int(q[len(q)-1]))
table += "\n"
table += "2," + ",".join(vars[:8]) + ",4\n"
table += "1," + ",".join(vars[:8]) + ",5\n"
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1:
vn = 0
ovn = 0
dvn = 0
if q[0] == "0" or q[0] == "1":
table += str(4+2*int(q[0])) + ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[0] == "0" and q[len(q)-1] == "0":
table += "8"
if q[0] == "1" and q[len(q)-1] == "0":
table += "10"
if q[0] == "0" and q[len(q)-1] == "1":
table += "12"
if q[0] == "1" and q[len(q)-1] == "1":
table += "12"
table += "\n"
elif not i.startswith("var"): #Line starts with a variable.
table += "5,"
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "7"
if q[len(q)-1] == "1":
table += "11"
table += "\n3,"
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "9"
if q[len(q)-1] == "1":
table += "11"
table += "\n"
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1:
vn = 0
ovn = 0
dvn = 0
if q[0] == "0" or q[0] == "1":
table += str(3+2*int(q[0])) + ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[0] == "0" and q[len(q)-1] == "0":
table += "11"
if q[0] == "1" and q[len(q)-1] == "0":
table += "11"
if q[0] == "0" and q[len(q)-1] == "1":
table += "9"
if q[0] == "1" and q[len(q)-1] == "1":
table += "7"
table += "\n"
elif not i.startswith("var"): #Line starts with a variable.
table += "6,"
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "12"
if q[len(q)-1] == "1":
table += "10"
table += "\n4,"
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "8"
if q[len(q)-1] == "1":
table += "12"
table += "\n"
table += "4," + ",".join(vars[:8]) + ",8\n"
table += "3," + ",".join(vars[:8]) + ",11\n"
table += "6," + ",".join(vars[:8]) + ",12\n"
table += "5," + ",".join(vars[:8]) + ",7\n"
colours = """
0 0 0 0
1 255 255 255
2 127 127 127
7 0 0 255
8 0 0 127
9 255 0 0
10 127 0 0
11 0 255 0
12 0 127 0
13 255 255 0
14 127 127 0
"""
self.saverule("APG_ClassifyObjects_"+self.alphanumeric, comments, table, colours)
def savePropagateClassifications(self):
comments = """This propagates the result of running ClassifyObjects for two generations.
"""
table = "n_states:17\n"
table += "neighborhood:Moore\n"
table += "symmetries:permute\n\n"
table += self.newvars(["a","b","c","d","e","f","g","h","i"], range(0, 17, 1))
table += """
7,11,b,c,d,e,f,g,h,11
7,12,b,c,d,e,f,g,h,11
7,9,b,c,d,e,f,g,h,9
7,10,b,c,d,e,f,g,h,9
8,11,b,c,d,e,f,g,h,12
8,12,b,c,d,e,f,g,h,12
8,9,b,c,d,e,f,g,h,10
8,10,b,c,d,e,f,g,h,10
7,13,b,c,d,e,f,g,h,11
7,14,b,c,d,e,f,g,h,11
8,13,b,c,d,e,f,g,h,14
8,14,b,c,d,e,f,g,h,14
9,13,b,c,d,e,f,g,h,11
9,14,b,c,d,e,f,g,h,11
10,13,b,c,d,e,f,g,h,14
10,14,b,c,d,e,f,g,h,14
9,11,b,c,d,e,f,g,h,11
9,12,b,c,d,e,f,g,h,11
10,11,b,c,d,e,f,g,h,12
10,12,b,c,d,e,f,g,h,12
13,11,b,c,d,e,f,g,h,11
13,12,b,c,d,e,f,g,h,11
14,11,b,c,d,e,f,g,h,12
14,12,b,c,d,e,f,g,h,12
13,9,b,c,d,e,f,g,h,11
14,9,b,c,d,e,f,g,h,12
"""
colours = """
0 0 0 0
1 255 255 255
2 127 127 127
7 0 0 255
8 0 0 127
9 255 0 0
10 127 0 0
11 0 255 0
12 0 127 0
13 255 255 0
14 127 127 0
"""
self.saverule("APG_PropagateClassification", comments, table, colours)
#foo = "" + 2
def saveContagiousLife(self):
comments = """
A variant of HistoricalLife used for detecting dependencies between
islands.
state 0: vacuum
state 1: ON
state 2: OFF
"""
table = "n_states:7\n"
table += "neighborhood:Moore\n"
if ruletype:
table += "symmetries:permute\n\n"
table += self.newvars(["a","b","c","d","e","f","g","h","i"], range(0, 7, 1))
table += self.newvars(["la","lb","lc","ld","le","lf","lg","lh","li"], range(1, 7, 2))
table += self.newvars(["da","db","dc","dd","de","df","dg","dh","di"], range(0, 7, 2))
table += self.newvar("p",[3, 4])
table += self.newvars(["ta","tb","tc","td","te","tf","tg","th","ti"], [3])
table += self.newvars(["qa","qb","qc","qd","qe","qf","qg","qh","qi"], [0, 1, 2, 4, 5, 6])
for i in xrange(9):
if (self.bee[i]):
table += self.scoline("l","d",4,3,i)
table += self.scoline("l","d",2,1,i)
table += self.scoline("l","d",0,1,i)
table += self.scoline("l","d",6,5,i)
table += self.scoline("t","q",0,4,i)
if (self.ess[i]):
table += self.scoline("l","d",3,3,i)
table += self.scoline("l","d",5,5,i)
table += self.scoline("l","d",1,1,i)
table += "# Default behaviour (death):\n"
table += self.scoline("","",1,2,0)
table += self.scoline("","",5,6,0)
table += self.scoline("","",3,4,0)
else:
rule1 = open(g.getdir("app") + "Rules/" + self.slashed + ".rule", "r")
lines1 = rule1.read().split("\n")
rule1.close()
for q in xrange(len(lines1)-1):
if lines1[q].startswith("@TABLE"):
lines1 = lines1[q:]
break
vars = []
for q in xrange(len(lines1)-1): #Copy symmetries and vars
i = lines1[q]
if i[:2] == "sy" or i[:1] == "sy":
table += i + "\n\n"
if i[:2] == "va" or i[:1] == "va":
table += self.newvar(i[4:5].replace("=", ""), [0, 1, 2])
vars.append(i[4:5].replace("=", ""))
if i != "":
if i[0] == "0" or i[0] == "1":
break
alpha = "abcdefghijklmnopqrstuvwxyz"
ovars = []
for i in alpha:
if not i in [n[0] for n in vars]: #Create new set of vars for ON cells
table += self.newvars([i + j for j in alpha[:9]], [1, 3, 5])
ovars = [i + j for j in alpha[:9]]
break
dvars = []
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in ovars]: #Create new set of vars for OFF cells
table += self.newvars([i + j for j in alpha[:9]], [0, 2, 4, 6])
dvars = [i + j for j in alpha[:9]]
break
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in ovars] and not i in [n[0] for n in dvars]:
for j in xrange(8-len(vars)):
table += self.newvar(i + alpha[j], [0, 1, 2, 3, 4, 5, 6])
vars.append(i + alpha[j])
break
qvars = []
for i in alpha:
if not i in [n[0] for n in vars] and not i in [n[0] for n in ovars] and not i in [n[0] for n in dvars]:
table += self.newvars([i + j for j in alpha[:9]], [0, 1, 2, 4, 5, 6])
qvars = [i + j for j in alpha[:9]]
break
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1 and not i.startswith("var"):
vn = 0
ovn = 0
dvn = 0
qvn = 0
table += str(2-int(q[0])) + ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "2"
if q[len(q)-1] == "1":
table += "1"
table += "\n"
vn = 0
ovn = 0
dvn = 0
qvn = 0
table += str(4-int(q[0])) + ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "4"
if q[len(q)-1] == "1":
table += "3"
table += "\n"
vn = 0
ovn = 0
dvn = 0
qvn = 0
table += str(6-int(q[0])) + ","
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "0":
table += "6"
if q[len(q)-1] == "1":
table += "5"
table += "\n"
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1:
vn = 0
ovn = 0
dvn = 0
qvn = 0
if q[0] == "0":
table += "0,"
for j in q[1:-1]:
if j == "0":
table += dvars[dvn]
dvn += 1
elif j == "1":
table += ovars[ovn]
ovn += 1
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "1":
table += "1"
table += "\n"
for i in lines1:
q = i.split("#")[0].replace(" ", "").split(",")
if len(q) > 1:
vn = 0
ovn = 0
dvn = 0
qvn = 0
if q[0] == "0":
table += "0,"
for j in q[1:-1]:
if j == "0":
table += qvars[qvn]
qvn += 1
elif j == "1":
table += "3"
elif j != "#":
table += vars[vn]
vn += 1
table += ","
if q[len(q)-1] == "1":
table += "4"
table += "\n"
colours = """
0 0 0 0
1 0 0 255
2 0 0 127
3 255 0 0
4 127 0 0
5 0 255 0
6 0 127 0
"""
self.saverule("APG_ContagiousLife_"+self.alphanumeric, comments, table, colours)
Frankly, I don't know why that error only showed up in x-rule-pre. Still don't know what else is going on with x-rule-pre, too.