Added:
/trunk/pyphon/src/pyphon_find2tlanguages.py
/trunk/pyphon/src/pyphon_twotier.py
Modified:
/trunk/pyphon/src/permutationdistance.py
/trunk/pyphon/src/pyphon/RNF.py
/trunk/pyphon/src/pyphon_recurse.py
=======================================
--- /dev/null
+++ /trunk/pyphon/src/pyphon_find2tlanguages.py Thu Feb 10 14:55:26 2011
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+
+#Give this the output filename from pyphon_twotier -- it'll give you
ERC-set pairs which together define an Input-intermediate-output
relationship consistent with the provided observations.
+
+import sys
+from pyphon import *
+from permutationdistance import getrankings, set_dif
+
+infilename = sys.argv[-1]
+if ".csv" in infilename:
+ infilename = infilename[:-4]
+
+infile = open(infilename + ".csv", 'r')
+
+seqs = []
+for line in infile:
+ if ("input form" in line):
+ continue
+ line = line[:-1]
+ seq = line.rsplit(",") #build pairs of IO mappings
+ seqs.append(seq)
+
+cohorts = []
+cohort = []
+#def next_input(erc, combos):
+
+prev = ""
+for i in range(len(seqs)):
+ if prev == "" or seqs[i][0] == prev:
+ cohort.append(seqs[i])
+ else:
+ cohorts.append(cohort)
+ cohort=[seqs[i]]
+ prev = seqs[i][0]
+cohorts.append(cohort)
+
+
+ #next_input()
+
+def print_languages(languages):
+ for language in languages:
+ print "Language:"
+ print language[0]
+ print language[1]
+ for member in language[2]:
+ print member[0], member[1], member[2]
+ print language[3], language[4]
+
+def compatible_languages(cohort, languages):
+ retlanguages = []
+ if languages == []:
+ for member in cohort:
+ retlanguages.append([member[3].rsplit("_"), member[4].rsplit("_"),
[member]])
+
+ else:
+ for language in languages:
+ for member in cohort:
+ es1 = RNF.RNF(language[0]+member[3].rsplit("_"))
+ es2 = RNF.RNF(language[1]+member[4].rsplit("_"))
+
+ #are the above really equivalent to concatenate+simplify
+
+ es1 = language[0]+member[3].rsplit("_")
+
+ es2 = language[1]+member[4].rsplit("_")
+
+ for erc in es1:
+ if not "w" in erc:
+ es1.remove(erc)
+
+ for erc in es2:
+ if not "w" in erc:
+ es2.remove(erc)
+
+
+ if (RNF.consistent(es1) and RNF.consistent(es2)):
+ #print "success"
+ retlanguages.append([es1, es2, language[2]+[member]])
+ else:
+ #print "fail"
+ print RNF.consistent(es1), es1
+ print RNF.consistent(es2), es2
+
+
+ todelete = []
+ for i in range(len(retlanguages)):
+ for j in range(i):
+ #print "checking", i, j
+ if retlanguages[i][0] == retlanguages[j][0] and retlanguages[i][1] ==
retlanguages[j][1]:
+ todelete.append(i)
+ pfretlanguages=[]
+ for i in range(len(retlanguages)):
+ if i not in todelete:
+ pfretlanguages.append(retlanguages[i])
+
+ flanguages = []
+ for language in pfretlanguages:
+ r1 = getrankings(language[0])
+ r2 = getrankings(language[1])
+ sd = set_dif(r1, r2)
+ language.append(sd[0])
+ language.append(sd[1])
+ flanguages.append(language)
+ return flanguages
+
+
+
+languages = []
+
+for cohort in cohorts:
+ #print "Adding cohort", cohort[0][0], "->", cohort[0][2]
+ #print_languages(languages)
+ languages = compatible_languages(cohort, languages)
+
+
+print_languages(languages)
=======================================
--- /dev/null
+++ /trunk/pyphon/src/pyphon_twotier.py Thu Feb 10 14:55:26 2011
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+import sys, os, re, string
+sys.path[0:0] = 'src' # puts the /foo directory at the start of your path
+from pyphon import *
+
+def writeercs(erc, con, filename):
+ # Generate ERCs - not yet used here
+ if erc != "0":
+ loutput = open(filename+'.csv','w')
+ loutput.write('\nERCS, gram\n')
+ w=[]
+ l=[]
+ e=[]
+ i=0
+ ci=0
+ while 1:
+ #order W L E
+ if i==len(erc):
+ break
+ if erc[i] == 'w':
+ w.append(con[ci])
+ elif erc[i] == 'l':
+ l.append(con[ci])
+ elif erc[i] == 'e':
+ e.append(con[ci])
+ elif erc[i] == '_':
+ loutput.write((' '.join(w)) + ", " + (' '.join(l)) + ", " +
(' '.join(e)) + "\n")
+ w=[]
+ l=[]
+ e=[]
+ ci=-1
+ i=i+1
+ ci=ci+1
+
+
+ loutput.write((' '.join(w)) + ", " + (' '.join(l)) + ", " + (' '.join(e))
+ "\n\nERCS, blank\n,,\n")
+ loutput.close()
+
+
+infilename = sys.argv[-1]
+if ".csv" in infilename:
+ infilename = infilename[:-4]
+model = sys.argv[-2]
+
+log = open(model+"_twotier.csv",'w')
+log.write("input form, intermediate form, output form, erc for cyclic
eval, erc for second eval\n")
+
+infile = open(infilename + ".csv", 'r')
+ios = []
+combinations = []
+con = []
+for line in infile:
+ if (line[0] == "#"):
+ continue
+ line = line[:-1]
+ pair = line.rsplit(", ") #build pairs of IO mappings
+ if len(pair)!= 2:
+ continue
+ ios.append(pair)
+
+for pair in ios: #For each IO pair
+ intermediates = []
+ intermediate_ercs = []
+ target = re.sub("\\\#", "", pair[1])
+ print "Analyzing pair", pair[0], target
+
+
+ # Produce the stem input
+ loutput = open(model+"_temp.csv",'w')
+ loutput.write(pair[0]+'\n')
+ loutput.close()
+
+ cmd = "pyphon_recurse.py " + model + " " + model + "_temp"
+ print cmd
+ os.system(cmd)
+
+ infile = open(model + "_" + model + "_temp_recursive_typology.csv", 'r')
+
+ loutput = open(model+"_temp.csv",'w')
+
+ for line in infile: #take these as inputs for MakeTab
+ line = line[:-1]
+ if (line[0:5] == "Input"):
+ continue
+ print line
+ sectioned = line.rsplit(', ')
+
+ intermediates.append(sectioned[0])
+ intermediate_ercs.append(sectioned[1])
+
+ print "GotInterm", sectioned[1]
+
+ #produce input line
+ loutput.write(sectioned[0]+'\n')
+
+ loutput.close()
+ infile.close()
+
+ cmd = "pyphon_maketableaux.py " + model + " " + model + "_temp.csv OT"
+ print cmd
+ os.system(cmd)
+
+ #Read tableau
+ infile = open( model + "-" + model + "_temp-OT.csv", 'r')
+
+ for line in infile: #take these as inputs for MakeTab
+ line = line[:-1]
+ if (con == [] and ",,," in line):
+ sectioned = line.rsplit(',')
+ con = sectioned[3:]
+ continue
+ if(line[0]==","):
+ continue
+
+ print "Twotier Read CON:", con
+
+ infile.close()
+
+ cmd = "pyphon_generate.py " + model + "-" + model + "_temp-OT "
+ "tiertwo_temp.csv OT"
+ print cmd
+ os.system(cmd)
+
+ cmd = "cat " + "tiertwo_temp.csv"
+ print cmd
+ os.system(cmd)
+
+ infile = open( "tiertwo_temp.csv", 'r')
+
+ for line in infile: #scan the intermediate-final form pairs
+ line = line[:-1]
+ if(line[0]=="/"):
+ seg = line.rsplit(",")
+ n = re.search('(?<=/).*(?=/)', seg[0])
+ input = n.group(0)
+ n = re.search('(?<=\[).*(?=\])', seg[1])
+ output = n.group(0)
+
+ if len(seg)>len(con)+2:
+ ercs = ",".join(seg[(len(con)+1):])
+ localercs=[]
+ for n in re.finditer('[wel]+', ercs):
+ localercs.append(n.group(0))
+ localerc = "_".join(localercs)
+ else:
+ print seg[-1]
+ localerc = 'e'*len(con)
+
+
+ if target==output:
+ for i in range(len(intermediates)):
+ if input == intermediates[i]:
+ initialerc = intermediate_ercs[i]
+ if initialerc == '0':
+ initialerc = 'e'*len(con)
+ break
+
+ print "Found output!",pair[0], input, output,initialerc,localerc,"\n"
+
log.write(pair[0]+","+input+","+output+","+initialerc+","+localerc+'\n')
+ combinations.append([pair[0], target, output, initialerc, localerc])
+ initialerc = re.sub("_", ", ", pair[1])
+ continue
+
+
+
+
+ infile.close()
+
+log.close()
=======================================
--- /trunk/pyphon/src/permutationdistance.py Wed Jan 26 20:00:09 2011
+++ /trunk/pyphon/src/permutationdistance.py Thu Feb 10 14:55:26 2011
@@ -1,9 +1,15 @@
#!/usr/bin/env python
#Very much a draft.
-#Enter ERCs to compare at the bottom
-
-import itertools
+import itertools, sys
+
+#ercset1s = sys.argv[-2]
+#ercset2s = sys.argv[-1]
+
+#ercset1 = ercset1s.rsplit("_")
+#ercset2 = ercset2s.rsplit("_")
+#print ercset1
+#print ercset2
def compatible(r, erc):
"""Check if two ERCs are compatible"""
@@ -92,26 +98,34 @@
def set_dif(rset1, rset2):
"""Get the minimum distance between rankings defined by two erc sets, and
the best rankings"""
m = -1
+ pairs = []
+ i = 0
for r1 in rset1:
+ if i%50==0:
+ print "Processing ranking", i+1,'/',len(rset1),"..."
+ i+=1
for r2 in rset2:
per = get_permutation(list(r1),list(r2))
dist = sort_and_count(per)[0]
if m > 0 and dist < m:
m = dist
- mpair = [r1, r2]
+ pairs = []
+ pairs.append([r1, r2])
elif m < 0:
m = dist
- mpair = [r1, r2]
- return [m, mpair[0], mpair[1]]
+ pairs.append([r1, r2])
+ elif dist == m:
+ pairs.append([r1, r2])
+ return [m, pairs]
#Get permutation sets, compute distances, find min
-ercset1=['lwlwe', 'lelew', 'ewlee', 'leewe']
-ercset2=['ellwl', 'elwew', 'wllel']
-
-r1 = getrankings(ercset1)
-r2 = getrankings(ercset2)
-
-print set_dif(r1, r2)
+#r1 = getrankings(ercset1)
+#r2 = getrankings(ercset2)
+
+#print r1
+#print r2
+
+#print set_dif(r1, r2)
=======================================
--- /trunk/pyphon/src/pyphon/RNF.py Wed Apr 14 11:46:58 2010
+++ /trunk/pyphon/src/pyphon/RNF.py Thu Feb 10 14:55:26 2011
@@ -172,7 +172,7 @@
sz = len(alist)
if sz <= 1:
return [alist]
- return [p[:i]+[alist[0]]+p[i:] for i in xrange(sz) for p in
perm(alist[1:])]
+ return [p[:i]+[alist[0]]+p[i:] for i in xra7nge(sz) for p in
perm(alist[1:])]
#calculates factorial and for n <=1 n! = 1
fac = lambda n: reduce(lambda a,b: a*(b+1), range(n), 1)
=======================================
--- /trunk/pyphon/src/pyphon_recurse.py Wed Jan 26 20:00:09 2011
+++ /trunk/pyphon/src/pyphon_recurse.py Thu Feb 10 14:55:26 2011
@@ -8,9 +8,9 @@
The model filename must have no suffix, and must refer both to a model
file (.mod), as built by pyphon_makemodel.py, and to a model description
file (.csv).
-The input file must be a single input on a single line, with affixes
separated by \\. and the stem deliminated by \=s:, as in:
-
-a.b.c=de=f.g
+The input file must be a single input on a single line, with affixes
separated by \. and the stem deliminated by \=s:, as in:
+
+a\.b\.c\=de\=f\.g
The output defaults to inputfile-modelfile-recursive_typology.csv.
"""
@@ -115,7 +115,7 @@
print cmd
os.system(cmd)
- cmd = "pyphon_generate.py " + model + "-" + infilename + "_ri-OT " +
infilename + "_ro.csv OT -v"
+ cmd = "pyphon_generate.py " + model + "-" + infilename + "_ri-OT " +
infilename + "_ro.csv OT"
if erc != "0":
cmd = cmd + " -f ercs -g gram"
print cmd
@@ -139,9 +139,14 @@
# Separate the affixes
sectioned = input.rsplit('\#')
-stem = sectioned[1];
-laffixes = sectioned[0].rsplit('\.') # Affixes are ordered by distance,
nor orthography, so reverse the left
-raffixes = (sectioned[2].rsplit('\.'))[::-1]
+if len(sectioned)>1:
+ stem = sectioned[1];
+ laffixes = sectioned[0].rsplit('\.') # Affixes are ordered by distance,
not orthography, so reverse the left
+ raffixes = (sectioned[2].rsplit('\.'))[::-1]
+else:
+ stem = sectioned[0] #robustness to inputs without morpheme boundries
+ laffixes = raffixes = []
+
#print stem, laffixes, raffixes
# Produce the stem input
@@ -161,7 +166,7 @@
print cmd
os.system(cmd)
-cmd = "cat " + infilename + "_ro.csv OT"
+cmd = "cat " + infilename + "_ro.csv"
print cmd
os.system(cmd)