point =
surf_cpu_ti_binary_search(trace->trace->time_points, reduced_a, 0,
trace->trace->nb_points - 1);
- xbt_dynar_get_cpy(trace->power_trace->event_list, 0, &val);
+ xbt_dynar_get_cpy(trace->power_trace->event_list, point, &val);
return val.value;
}
static int surf_cpu_ti_binary_search(double *array, double a, int low,
int high)
{
- int mid = low + (high - low) / 2;
- XBT_DEBUG("a %lf low %d high %d mid %d value %lf", a, low, high, mid,
- array[mid]);
- /* a == array[mid] */
- if (array[mid] == a)
- return mid;
- /* a is between mid and mid+1 */
- if (array[mid] < a && array[mid + 1] > a)
- return mid;
-
- if (array[mid] < a)
- return surf_cpu_ti_binary_search(array, a, mid + 1, high);
- else
- return surf_cpu_ti_binary_search(array, a, low, mid - 1);
+ xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than"
+ " high (%d)", low, high);
+
+ int mid;
+ do {
+ mid = low + (high - low) / 2;
+ XBT_DEBUG("a %lf low %d high %d mid %d value %lf", a, low, high, mid,
+ array[mid]);
+
+ if (array[mid] > a)
+ high = mid;
+ else
+ low = mid;
+ }
+ while (low < high - 1);
+
+ return low;
}