def merge(self, peaks: Peaks, _time: float, corpus: Corpus = None, **_kwargs) -> Peaks: if peaks.size() <= 1: return peaks self.logger.debug( f"[merge] Merging activity with {peaks.size()} peaks.") duration: float = corpus.duration() inv_duration: float = 1 / duration num_rows: int = int(duration / self._t_width.value) peaks_list: List[Peaks] = [] for transform_hash in np.unique(peaks.transform_ids): indices: np.ndarray = np.argwhere( peaks.transform_ids == transform_hash) indices = indices.reshape((indices.size, )) scores: np.ndarray = peaks.scores[indices] times: np.ndarray = peaks.times[indices] num_cols: int = scores.size row_indices: np.ndarray = np.floor(times * inv_duration * num_rows).astype(np.int32) interp_matrix: sparse.coo_matrix = sparse.coo_matrix( (np.ones(num_cols), (row_indices, np.arange(num_cols))), shape=(num_rows + 1, num_cols)) interp_matrix: sparse.csc_matrix = interp_matrix.tocsc() interpolated_scores: np.ndarray = interp_matrix.dot(scores) interpolated_times: np.ndarray = interp_matrix.dot(times) num_peaks_per_index: np.ndarray = np.array( interp_matrix.sum(axis=1)).reshape(interp_matrix.shape[0]) peak_indices: np.ndarray = interpolated_scores.nonzero()[0] scores: np.ndarray = interpolated_scores[peak_indices] times: np.ndarray = np.divide(interpolated_times[peak_indices], num_peaks_per_index[peak_indices]) transforms: np.ndarray = np.ones(peak_indices.size, dtype=np.int32) * transform_hash # print("After merge:", scores.shape, times.shape, transforms.shape) peaks_list.append(Peaks(scores, times, transforms)) merged_peaks: Peaks = Peaks.concatenate(peaks_list) self.logger.debug( f"[merge] Merge successful. Number of peaks after merge: {merged_peaks.size()}." ) return merged_peaks
def _merged_peaks(self, time: float, corpus: Corpus, **kwargs) -> Peaks: weight_sum: float = 0.0 for atom in self.atoms.values(): weight_sum += atom.weight if atom.is_enabled_and_eligible( ) else 0.0 if weight_sum < 1e-6: self.logger.warning(f"Weights are invalid. Setting weight to 1.0.") weight_sum = 1.0 peaks_list: List[Peaks] = [] for atom in self.atoms.values(): if atom.is_enabled_and_eligible(): peaks: Peaks = atom.pop_peaks() peaks.scale(atom.weight / weight_sum) peaks_list.append(peaks) all_peaks: Peaks = Peaks.concatenate(peaks_list) return self.merge_action.merge(all_peaks, time, corpus, **kwargs)