+ double l2 = ef->min_non_zero;
+ double h2 = ef->max;
+ double l1 = 1.0;
+ double h1 = MAX_INT_FREQ;
+
+ double *fs = malloc(set_count(freqs) * sizeof(fs[0]));
+ int i, j, n = 0;
+
+ set_foreach(freqs, freq)
+ fs[n++] = freq->freq;
+
+ /*
+ * find the smallest difference of the execution frequencies
+ * we try to ressolve it with 1 integer.
+ */
+ for(i = 0; i < n; ++i) {
+ if(fs[i] <= 0.0)
+ continue;
+
+ for(j = i + 1; j < n; ++j) {
+ double diff = fabs(fs[i] - fs[j]);
+
+ if(!UNDEF(diff))
+ smallest_diff = MIN(diff, smallest_diff);
+ }
+ }
+
+ /* according to that the slope of the translation function is 1.0 / smallest diff */
+ ef->m = 1.0 / smallest_diff;
+
+ /* the abscissa is then given by */
+ ef->b = l1 - ef->m * l2;
+
+ /*
+ * if the slope is so high that the largest integer would be larger than MAX_INT_FREQ
+ * set the largest int freq to that upper limit and recompute the translation function
+ */
+ if(ef->m * h2 + ef->b > MAX_INT_FREQ) {
+ ef->m = (h1 - l1) / (h2 - l2);
+ ef->b = l1 - ef->m * l2;
+ }
+
+ // printf("smallest_diff: %g, l1: %f, h1: %f, l2: %f, h2: %f, m: %f, b: %f\n", smallest_diff, l1, h1, l2, h2, ef->m, ef->b);
+ free(fs);
+ }