-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfullsearch.py
85 lines (60 loc) · 2.13 KB
/
fullsearch.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import pickle
import cProfile
import os.path
import config
import pyroprinting
class FullSearchIndex:
def __init__(self, isolates):
self.isolates = set(isolates)
def __iter__(self):
return iter(self.isolates)
def __len__(self):
return len(self.isolates)
def pop(self):
return self.isolates.pop()
def getNeighborsOf(self, queryIsolate, radii):
result = set()
for iso in self.isolates:
if iso.isWithinRadiiOf(queryIsolate, radii):
result.add(iso)
return result - {queryIsolate}
def popNeighborsOf(self, queryIsolate, radii):
result = set()
for iso in self.isolates:
if iso.isWithinRadiiOf(queryIsolate, radii):
result.add(iso)
self.isolates -= result
return result - {queryIsolate}
class PrecomputedIndex:
def __init__(self, neighborMap):
self.neighborMap = neighborMap
def __iter__(self):
return iter(self.neighborMap.keys())
def __len__(self):
return len(self.neighborMap)
def getNeighborsOf(self, queryIsolate, radii):
return self.neighborMap[queryIsolate]
# TODO: calculate average pairwise dist
def computeNeighborsMap(isolates, cfg):
print("calculating isolate neighbors for a subset of size {}...".format(cfg.isolateSubsetSize))
neighbors = {isolate: set() for isolate in isolates}
for i, iso1 in enumerate(isolates):
print("{}/{}".format(i+1, len(isolates)))
for iso2 in isolates[i+1:]:
if iso1.isWithinRadiiOf(iso2, cfg.radii):
neighbors[iso1].add(iso2)
neighbors[iso2].add(iso1)
return neighbors
def getNeighborsMapCacheFileName(cfg):
return "neighbors{}_{}.pickle".format(cfg.isolateSubsetSize, "_".join(str(region.clusterThreshold) for region in cfg.regions))
# return "neighbors{}T{}.pickle".format(cfg.isolateSubsetSize, '_'.join(str(region.pSimThresholdAlpha) for region in cfg.regions))
def loadNeighborsMapFromFile(cacheFileName):
with open(cacheFileName, mode='r+b') as cacheFile:
neighborMap = pickle.load(cacheFile)
return neighborMap
def getNeighborsMap(isolates, cfg):
cacheFileName = getNeighborsMapCacheFileName(cfg)
if os.path.isfile(cacheFileName):
return loadNeighborsMapFromFile(cacheFileName)
else:
return computeNeighborsMap(isolates, cfg)