def _(i): qy.py_printf("i = %i\n", i)
def _(i): # compute responsibilities r_KN = this_r_KN.using(this_r_KN_data.value) @qy.for_(N) def _(n): sample = samples.at(n) qy.value_from_any(-numpy.inf).store(total) @qy.for_(K) def _(k): responsibility = r_KN.at(k, n).data self._sub_emitter.ll( StridedArray.from_typed_pointer( out.at(k).data.gep(0, 1)), StridedArray.from_typed_pointer(sample.data), responsibility, ) log_add_double(total.load(), responsibility.load()).store(total) total_value = total.load() @qy.if_else(total_value == -numpy.inf) def _(then): if then: @qy.for_(K) def _(k): qy.value_from_any(1.0 / K).store( r_KN.at(k, n).data) else: @qy.for_(K) def _(k): responsibility = r_KN.at(k, n).data qy.exp(responsibility.load() - total_value).store(responsibility) # estimate new mixture and component parameters @qy.for_(K) def _(k): component = out.at(k).data self._sub_emitter.map( prior.at(k), samples, r_KN.at(k), StridedArray.from_typed_pointer(component.gep(0, 1)), ) qy.value_from_any(0.0).store(total) @qy.for_(N) def _(n): (total.load() + r_KN.at(k, n).data.load()).store(total) (total.load() / float(N)).store(component.gep(0, 0)) # check for termination last_r_KN = this_r_KN.using(last_r_KN_data.value) @qy.if_(i > 0) def _(): qy.value_from_any(0.0).store(total) @qy.for_(K) def _(k): @qy.for_(N) def _(n): delta = r_KN.at(k, n).data.load() - last_r_KN.at( k, n).data.load() (total.load() + abs(delta)).store(total) @qy.if_(total.load() < 1e-12) def _(): qy.break_() total_delta = total.load() # swap the responsibility matrices temp_r_KN_data_value = this_r_KN_data.value this_r_KN_data.set(last_r_KN_data.value) last_r_KN_data.set(temp_r_KN_data_value) # compute the ll at this step @qy.for_(N) def _(n): sample = samples.at(n) total_ll = total.load() qy.value_from_any(-numpy.inf).store(total) @qy.for_(K) def _(k): self._sub_emitter.ll( StridedArray.from_typed_pointer( out.at(k).data.gep(0, 1)), StridedArray.from_typed_pointer(sample.data), component_ll, ) log_add_double( total.load(), qy.log(out.at(k).data.gep(0, 0).load()) + component_ll.load(), ) \ .store(total) (total_ll + total.load()).store(total) total_ll = total.load() # be informative qy.py_printf("after EM step %i: delta %s; ll %s\n", i, total_delta, total_ll)
def _(i): # compute responsibilities r_KN = this_r_KN.using(this_r_KN_data.value) @qy.for_(N) def _(n): sample = samples.at(n) qy.value_from_any(-numpy.inf).store(total) @qy.for_(K) def _(k): responsibility = r_KN.at(k, n).data self._sub_emitter.ll( StridedArray.from_typed_pointer(out.at(k).data.gep(0, 1)), StridedArray.from_typed_pointer(sample.data), responsibility, ) log_add_double(total.load(), responsibility.load()).store(total) total_value = total.load() @qy.if_else(total_value == -numpy.inf) def _(then): if then: @qy.for_(K) def _(k): qy.value_from_any(1.0 / K).store(r_KN.at(k, n).data) else: @qy.for_(K) def _(k): responsibility = r_KN.at(k, n).data qy.exp(responsibility.load() - total_value).store(responsibility) # estimate new mixture and component parameters @qy.for_(K) def _(k): component = out.at(k).data self._sub_emitter.map( prior.at(k), samples, r_KN.at(k), StridedArray.from_typed_pointer(component.gep(0, 1)), ) qy.value_from_any(0.0).store(total) @qy.for_(N) def _(n): (total.load() + r_KN.at(k, n).data.load()).store(total) (total.load() / float(N)).store(component.gep(0, 0)) # check for termination last_r_KN = this_r_KN.using(last_r_KN_data.value) @qy.if_(i > 0) def _(): qy.value_from_any(0.0).store(total) @qy.for_(K) def _(k): @qy.for_(N) def _(n): delta = r_KN.at(k, n).data.load() - last_r_KN.at(k, n).data.load() (total.load() + abs(delta)).store(total) @qy.if_(total.load() < 1e-12) def _(): qy.break_() total_delta = total.load() # swap the responsibility matrices temp_r_KN_data_value = this_r_KN_data.value this_r_KN_data.set(last_r_KN_data.value) last_r_KN_data.set(temp_r_KN_data_value) # compute the ll at this step @qy.for_(N) def _(n): sample = samples.at(n) total_ll = total.load() qy.value_from_any(-numpy.inf).store(total) @qy.for_(K) def _(k): self._sub_emitter.ll( StridedArray.from_typed_pointer(out.at(k).data.gep(0, 1)), StridedArray.from_typed_pointer(sample.data), component_ll, ) log_add_double( total.load(), qy.log(out.at(k).data.gep(0, 0).load()) + component_ll.load(), ) \ .store(total) (total_ll + total.load()).store(total) total_ll = total.load() # be informative qy.py_printf("after EM step %i: delta %s; ll %s\n", i, total_delta, total_ll)