def test_removeitem(self): s = [] ts = s self.assertEqual(Utils.removeItem(s, 0), []) self.assertEqual(s, ts) s = [[30, 70, 80]] ts = s self.assertEqual(Utils.removeItem(s, 0), [[70, 80]]) self.assertEqual(s, ts) s = [[70, 80], [90]] ts = s self.assertEqual(Utils.removeItem(s, Utils.seqLength(s)-1), [[70, 80]]) self.assertEqual(s, ts)
def MSCandidateGenSPM(self, F): logging.debug('MSCandidateGenSPM: %s', F) cs = [] for s1 in F: for s2 in F: if self.MS[s1[0][0]] == self.getStrictlyMinimumMIS(s1): if (Utils.removeItem(s1, 1) == Utils.removeItem(s2, Utils.seqLength(s2)-1)) and (self.MS[s2[-1][-1]] >= self.MS[s1[0][0]]): #TODO: need to check why >= here? nc = self.extendSequence(s1, s2, MSCandidateJoinCriteria.FORWARD) for c in nc: cs.append(c) logging.debug('join: %s %s -> %s %d', s1, s2, c, MSCandidateJoinCriteria.FORWARD) elif self.MS[s2[-1][-1]] == self.getStrictlyMinimumMIS(s2): if (Utils.removeItem(s2, Utils.seqLength(s2)-2) == Utils.removeItem(s1, 0)) and (self.MS[s1[0][0]] > self.MS[s2[-1][-1]]): nc = self.extendSequence(s1, s2, MSCandidateJoinCriteria.REVERSE) for c in nc: cs.append(c) logging.debug('join: %s %s -> %s %d', s1, s2, c, MSCandidateJoinCriteria.REVERSE) else: if Utils.removeItem(s1, 0) == Utils.removeItem(s2, Utils.seqLength(s2)-1): nc = self.extendSequence(s1, s2, MSCandidateJoinCriteria.APRIORI) for c in nc: cs.append(c) logging.debug('join: %s %s -> %s %d', s1, s2, c, MSCandidateJoinCriteria.APRIORI) return [c for c in cs if self.canPrune(c) is False]
def canPrune(self, seq): sLowestMIS = self.getStrictlyMinimumMIS(seq) k = Utils.seqLength(seq) for i in range(k): item = Utils.getItem(seq, i) if self.MS[item] == sLowestMIS: continue k_1_subseq = Utils.removeItem(seq, i) count = 0 for d in self.T: if Utils.isSubsequence(k_1_subseq, d): count += 1 if float(count) / len(self.T) < self.getMinMIS(k_1_subseq): return True return False