All pastes #1233268 Raw Edit

Unnamed

public text v1 · immutable
#1233268 ·published 2008-10-21 22:39 UTC
rendered paste body
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)