def distance(self, first: Instance, second: Instance, a0=None, a1=None): if a0 is None or isinstance(a0, PerformanceStats): return self.distance(first, second, float("inf"), a0) elif isinstance(a0, float): distance = 0 firstNumValues = first.numValues() secondNumValues = second.numValues() numAttributes = self.m_Data.numAttributes() classIndex = self.m_Data.classIndex() self.validate() p1 = p2 = 0 while p1 < firstNumValues or p2 < secondNumValues: if p1 >= firstNumValues: firstI = numAttributes else: firstI = first.index(p1) if p2 >= secondNumValues: secondI = numAttributes else: secondI = second.index(p2) if firstI == classIndex: p1 += 1 continue if firstI < numAttributes and not self.m_ActiveIndices[firstI]: p1 += 1 continue if secondI == classIndex: p2 += 1 continue if secondI < numAttributes and not self.m_ActiveIndices[ secondI]: p2 += 1 continue if firstI == secondI: diff = self.difference(firstI, first.valueSparse(p1), second.valueSparse(p2)) p1 += 1 p2 += 1 elif firstI > secondI: diff = self.difference(secondI, 0, second.valueSparse(p2)) p2 += 1 else: diff = self.difference(firstI, first.valueSparse(p1), 0) p1 += 1 if isinstance(a1, PerformanceStats): a1.incrCoordCount() distance = self.updateDistance(distance, diff) if distance > a0: return float('inf') return distance
def updateRanges(self, instance: Instance, ranges: List[List[float]]): numVals = instance.numValues() prevIndex = 0 for j in range(numVals): currIndex = instance.index(j) while prevIndex < currIndex: if 0 < ranges[prevIndex][self.R_MIN]: ranges[prevIndex][self.R_MIN] = 0 ranges[prevIndex][self.R_WIDTH] = ranges[prevIndex][ self.R_MAX] - ranges[prevIndex][self.R_MIN] if 0 > ranges[prevIndex][self.R_MAX]: ranges[prevIndex][self.R_MAX] = 0 ranges[prevIndex][self.R_WIDTH] = ranges[prevIndex][ self.R_MAX] - ranges[prevIndex][self.R_MIN] prevIndex += 1 prevIndex += 1 if not instance.isMissingSparse(j): val = instance.valueSparse(j) if val < ranges[currIndex][self.R_MIN]: ranges[currIndex][self.R_MIN] = val ranges[currIndex][self.R_WIDTH] = ranges[currIndex][ self.R_MAX] - ranges[currIndex][self.R_MIN] if val > ranges[currIndex][self.R_MAX]: ranges[currIndex][self.R_MAX] = val ranges[currIndex][self.R_WIDTH] = ranges[currIndex][ self.R_MAX] - ranges[currIndex][self.R_MIN] return ranges
def updateRangesFirst(self, instance: Instance, numAtt: int, ranges: List[List]): for i in range(len(ranges)): for j in range(len(ranges[i])): ranges[i][j] = 0 numVals = instance.numValues() for j in range(numVals): currIndex = instance.index(j) if not instance.isMissingSparse(j): return True return False