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)