Advertisement
Guest User

Untitled

a guest
Apr 26th, 2018
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. import numpy as np
  2. import math
  3. class DistanceMatrix:
  4.  
  5.  
  6. def __init__(self, *args):
  7. self.arr = np.array(*args)
  8.  
  9. def __repr__(self):
  10. return 'DistanceMatrix(' + str(self.arr.tolist()) + ')'
  11.  
  12. def __str__(self):
  13. return str(self.arr.tolist())
  14.  
  15. @staticmethod
  16. def loadtxt(args):
  17. return DistanceMatrix(np.loadtxt(args))
  18.  
  19. def savetxt(self, *args, **kwargs):
  20. np.savetxt(*args, self.arr, **kwargs)
  21.  
  22. def neighbour_joining(self):
  23. nodes = [x for x in range(len(self.arr))]
  24. mapper = {x:x for x in range(len(self.arr))}
  25. return self.neighbour_joiningcalc(self.arr.copy(), len(self.arr), nodes, len(nodes), mapper)
  26.  
  27. def neighbour_joiningcalc(self, d, n, nodes, counter, mapper):
  28. if n == 2:
  29. return UnrootedTree((0, 1, d[0][1]))
  30.  
  31. totalDistance= [sum(row) for row in d]
  32. dster = [[(n-2)*d[i][j] - totalDistance[i] - totalDistance[j] for j in range(n)] for i in range(n)]
  33.  
  34. min = math.inf
  35. row = 0
  36. col = 0
  37. nodesRow = 0
  38. nodesCol = 0
  39. for i in range(len(nodes)):
  40. first = nodes[i]
  41. firstVal = mapper[first]
  42. for j in range(len(nodes)):
  43. second = nodes[j]
  44. secondVal = mapper[second]
  45. if i != j and dster[firstVal][secondVal] < min:
  46. min = dster[firstVal][secondVal]
  47. row = firstVal
  48. col = secondVal
  49. nodesRow = first
  50. nodesCol = second
  51.  
  52. delta = (totalDistance[row] - totalDistance[col])/(n-2)
  53. limbLengthi = 1/2*(d[row][col] + delta)
  54. limbLengthj = 1/2*(d[row][col] - delta)
  55.  
  56. d = np.hstack((d, [[1/2*(d[k][row] + d[k][col] - d[row][col])] for k in range(n)]))
  57. d = np.vstack((d, [1/2*(d[k][row] + d[k][col] - d[row][col]) if k != n else 0 for k in range(n+1)]))
  58.  
  59. nodes.append(counter)
  60. mapper[counter] = counter
  61.  
  62. d = np.delete(d, row, 0)
  63. d = np.delete(d, row, 1)
  64. d = np.delete(d, col, 0)
  65. d = np.delete(d, col, 1)
  66.  
  67. for node in mapper:
  68. if node > row:
  69. mapper[node] -= 1
  70. if node > col:
  71. mapper[node] -= 1
  72.  
  73.  
  74. nodes.remove(nodesRow)
  75. nodes.remove(nodesCol)
  76.  
  77. t = self.neighbour_joiningcalc(d, n-1, nodes, counter + 1, mapper)
  78.  
  79. t.add((n, row, limbLengthi))
  80. t.add((n, col, limbLengthj))
  81. return t
  82.  
  83. class UnrootedTree:
  84. def __init__(self, *args):
  85. self.edges = args
  86.  
  87. def __str__(self):
  88. return str(self.edges)
  89.  
  90. def __repr__(self):
  91. return 'UnrootedTree' + str(self.edges)
  92.  
  93.  
  94. @staticmethod
  95. def loadtxt(file):
  96. openFile = open(file, 'r')
  97. opl = list()
  98. for line in openFile:
  99. line = line.rstrip()
  100. f = line.split('<->')
  101. f[1] = f[1].split(':')
  102. opl.append((float(f[0]), float(f[1][0]), float(f[1][1])))
  103. return UnrootedTree(*tuple(opl))
  104.  
  105. def add(self, lim):
  106. self.edges += (lim,)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement