def next(self): #if self.nsteps == self.length: raise StopIteration() nexts= {} intersections= {} nexts_distr= self._get_state_distr(self.actual_state) for state, prob in nexts_distr.iteritems(): # si las notas que vengo tocando interseccion con las que debo tocar no es vacio intersections[state]= self.now_pitches.intersection(self.must_dict[self.length-self.nsteps][state]) if len(intersections[state]) > 0: nexts[state]= prob if len(nexts) == 0: import ipdb;ipdb.set_trace() raise Exception('Impossible phrase: actual_state= %(actual_state)s, start_pitch: %(n0)s, %(n1)s end_pitch: %(nfs)s, length:%(length)s' % self.__dict__) s= sum(nexts.itervalues()) for state, prob in nexts.iteritems(): nexts[state]= prob/s next= RandomPicker(values=nexts).get_value() self.actual_state= next now_pitches= set() for p in intersections[next]: now_pitches.update(next.related_notes(p[0], p[1], self.available_notes, reverse=False)) self.now_pitches= now_pitches self.history.append((self.now_pitches, self.actual_state)) self.nsteps+=1 return next
def next(self): #if self.nsteps == self.length: raise StopIteration() nexts= {} intersections= {} nexts_distr= self._get_state_distr(self.actual_state) #for state, prob in self.hmm.nexts(self.actual_state).iteritems(): for state, prob in nexts_distr.iteritems(): # si las notas que vengo tocando interseccion con las que debo tocar hay intersections[state]= self.now_pitches.intersection(self.must_dict[self.length-self.nsteps][state]) if len(intersections[state]) > 0: nexts[state]= prob if len(nexts) == 0: raise ImpossiblePhraseException('Impossible phrase: start_pitch: %(n0)s, end_pitch: %(nf)s, length:%(length)s' % self.__dict__) s= sum(nexts.itervalues()) for state, prob in nexts.iteritems(): nexts[state]= prob/s next= RandomPicker(values=nexts, random=self.random).get_value() self.actual_state= next now_pitches= set() for p in intersections[next]: now_pitches.update(next.related_notes(p, reverse=False)) self.now_pitches= now_pitches self.history.append((self.now_pitches, self.actual_state)) self.nsteps+=1 return next