def get_orientation(self, si, sj): """ si, sj are two number series. To compute whether these two series have same orientation or not. We combine them in the two orientation configurations and compute length of the longest monotonic series. """ if not si or not sj: return 0 # Same orientation configuration a = lms(si + sj) b = lms(sj + si) # Opposite orientation configuration c = lms(si + sj[::-1]) d = lms(sj[::-1] + si) return max(a, b)[0] - max(c, d)[0]
def colinear_evaluate_multi(tour, scfs, weights): weighted_score = 0 for scf, w in zip(scfs, weights): subtour = [x for x in tour if x in scf] series = [] for t in subtour: series.extend(scf[t]) score, diff = lms(series) weighted_score += score * w return (weighted_score, )
def colinear_evaluate_multi(tour, scfs, weights): weighted_score = 0 for scf, w in zip(scfs, weights): subtour = [x for x in tour if x in scf] series = [] for t in subtour: series.extend(scf[t]) score, diff = lms(series) weighted_score += score * w return (weighted_score,)
def fix_orientation(self, tour): """ Test each scaffold if flipping will increass longest monotonic chain length. """ orientations = dict(tour) # old configuration here scaffold_oo = defaultdict(list) scaffolds, oos = zip(*tour) for mlg in self.linkage_groups: lg = mlg.lg mapname = mlg.mapname for s, o in tour: i = scaffolds.index(s) L = [self.get_series(lg, x, xo) for x, xo in tour[:i]] U = [self.get_series(lg, x, xo) for x, xo in tour[i + 1:]] L, U = list(flatten(L)), list(flatten(U)) M = self.get_series(lg, s) plus = lms(L + M + U) minus = lms(L + M[::-1] + U) d = plus[0] - minus[0] if not d: continue scaffold_oo[s].append((d, mapname)) # reset orientation fixed = 0 for s, v in scaffold_oo.items(): d = self.weighted_mean(v) old_d = orientations[s] new_d = np.sign(d) if new_d != old_d: orientations[s] = new_d fixed += 1 tour = [(x, orientations[x]) for x in scaffolds] logging.debug("Fixed orientations for {0} scaffolds.".format(fixed)) return tour