Spaces:
Runtime error
Runtime error
DEVICE int sample(const float *cdf, int num_entries, float u, float *updated_u = nullptr) { | |
// Binary search the cdf | |
auto lb = 0; | |
auto len = num_entries - 1 - lb; | |
while (len > 0) { | |
auto half_len = len / 2; | |
auto mid = lb + half_len; | |
assert(mid >= 0 && mid < num_entries); | |
if (u < cdf[mid]) { | |
len = half_len; | |
} else { | |
lb = mid + 1; | |
len = len - half_len - 1; | |
} | |
} | |
lb = clamp(lb, 0, num_entries - 1); | |
if (updated_u != nullptr) { | |
if (lb > 0) { | |
*updated_u = (u - cdf[lb - 1]) / (cdf[lb] - cdf[lb - 1]); | |
} else { | |
*updated_u = u / cdf[lb]; | |
} | |
} | |
return lb; | |
} | |