void epoch(map *m, Inputs *in, int iteration, double timeCst, double *epsilon, int numEpoch) { register int i; double radius; int dst; double theta; radius = max_dbl(m->mapRadius * exp(-iteration / timeCst), 1); radius *= radius; neuron *n = find_bmu(m, in); for(i = 0; i < m->latice_size; ++i) { dst = neuron_distance_to(&(m->lattice[i]), n); if(dst < radius) { theta = exp(-dst / (2 * radius)); adjust_weights(&(m->lattice[i]), in, *epsilon, theta); } *epsilon = EPSILON * exp((double)-iteration / (numEpoch- iteration)); } }
double log_sum(const double *ptr, const size_t size) { if (size == 1) /* do special case faster */ return *ptr; else { const double max = *max_dbl(ptr, size); const double *end = ptr + size; double sum = 0; assert(size > 0); for (; ptr != end; ++ptr) sum += xexp(*ptr - max); return xlog(sum) + max; } }