void optimise_aln(glam2_aln *best, data *d) { glam2_aln *aln = &d->aln; int no_improvement = 0; int i; aln_copy(aln, best); if (d->a.profile) fputs("Temperature, Columns, Sequences, Score:\n", d->out); for (i = 0; no_improvement < d->a.stop_after; ++i) { double temperature = d->a.temperature / xpow(d->a.cool, (double)i / d->a.stop_after); if (temperature < d->a.frozen) temperature = d->a.frozen; if (d->a.profile) fprintf(d->out, "%g\t%d\t%d\t%g\n", temperature, aln->width, aln->aligned_seq, aln->score / xlog(2)); /* print_aln(d->out, aln, d); */ update_aln(aln, d, temperature); if (aln->score > best->score) { aln_copy(best, aln); no_improvement = 0; } else ++no_improvement; } if (d->a.profile) putc('\n', d->out); if (!d->a.quiet) fprintf(stderr, "%d iterations\n", i); }
float get_max_float() { /* * IEEE 754 * * float: * sign: 1bit, exp: 8bit, frac: 23bit * * F = (-1)^sign * frac * 2^exp */ int exp_bit = 8; int frac_bit = 23; float frac = 1 - fpow(0.5, frac_bit); float true_frac = 1 + frac; int exp = xpow(2, exp_bit - 1) - 1; float times = fpow(2.0, exp); float max = true_frac * times; return max; }
void pow_dbl(double *ptr, const size_t size, const double x) { const double *end = ptr + size; assert(ptr != NULL || size == 0); for (; ptr != end; ++ptr) *ptr = xpow(*ptr, x); }
long get_max_by_size(long size) { long bits = size * CHAR_BIT; long max = xpow(2, bits - 1) - 1; return max; }