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;
+ while(low<high) {
+ 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)
+ low = mid + 1;
+ else
+ high = mid - 1;
+ }
+ return mid;
}