Source code for motif.contour_decoders.maximum

"""Maximum contour decoder.
"""
from __future__ import print_function
import numpy as np
from motif.core import ContourDecoder


[docs]class MaxDecoder(ContourDecoder): ''' Maximum contour decoder. ''' def __init__(self, thresh=0.5, use_salience=False): '''Init method. ''' self.use_salience = use_salience self.thresh = thresh ContourDecoder.__init__(self) def decode(self, ctr, Y): n_uniform_times = len(ctr.uniform_times) freqs = [[] for i in range(n_uniform_times)] scores = [[] for i in range(n_uniform_times)] time_idx = np.round(ctr.times * ctr.sample_rate).astype(int) time_idx[time_idx >= n_uniform_times] = n_uniform_times - 1 contour_num_map = {} for k, n in enumerate(ctr.nums): contour_num_map[n] = k for i, freq in zip(time_idx, ctr.freqs): n = ctr.index[i] k = contour_num_map[n] if Y[k] >= self.thresh: freqs[i].append(freq) else: freqs[i].append(-1.0 * freq) if self.use_salience: scores[i].append(Y[k] * ctr.salience[i]) else: scores[i].append(Y[k]) single_f0 = [] for i, f in enumerate(freqs): if len(f) > 0: single_f0.append(f[np.argmax(scores[i])]) else: single_f0.append(0.0) return np.array(ctr.uniform_times), np.array(single_f0) @classmethod def get_id(cls): return 'maximum'