import re
dists = {}
old_dists = {}
clades = []
def distance(c1,c2):
if c1 == c2:
return 88888
elif (c1,c2) in dists:
return dists[(c1,c2)]
elif type(c1) == tuple:
return distance_clade(c1,c2)
elif type(c2) == tuple:
return distance_clade(c2,c1)
else:
return 88888
def distance_clade(c1,c2):
c1x,c1y = c1
dx, dy = distance(c1x,c2), distance(c1y,c2)
if dx == 88888:
if dy == 88888:
return 88888
else:
dx = dy
elif dy == 88888:
dy = dx
dists[((c1x,c1y),c2)] = (dx + dy - distance(c1x,c1y))/2
return dists[((c1x,c1y),c2)]
def initialize():
for line in open('C:\\Documents and Settings\\Peggy\\Desktop\\agora taxonomy raw.txt'):
match = re.compile(r'<(.*)>').match(line)
if match:
current_player = match.group(1)
clades.append(current_player)
match = re.compile(r'([^\t]*)\t([^\t]*)\t([^\t]*).*').match(line)
if match and match.group(1) != current_player:
if int(match.group(2)) + int(match.group(3)) == 0:
pass
else:
dists[(current_player,match.group(1))] = float(match.group(3))/(float(match.group(2))+float(match.group(3)))
for player in clades:
dists[(player,player)] = 88888
def add_clade(c1,c2):
clades.append((c1,c2))
for clade in clades:
distance(clade,(c1,c2))
distance((c1,c2),clade)
for x in clades:
for y in clades:
if x in [c1,c2] or y in [c1,c2]:
if (x,y) in dists:
old_dists[(x,y)] = dists[(x,y)]
print "Removing", (x,y)
del dists[(x,y)]
else:
old_dists[(x,y)] = 88888
if c1 in clades:
clades.remove(c1)
if c2 in clades:
clades.remove(c2)
def main_loop():
while dists[(x,y)] < 88888:
(x,y) = min(dists, key = lambda x: dists[x])
add_clade(x,y)