diff --git a/vdc_sampling.py b/vdc_sampling.py new file mode 100644 index 0000000..26a8799 --- /dev/null +++ b/vdc_sampling.py @@ -0,0 +1,34 @@ +from functools import partial + +import matplotlib.pyplot as plt +import numpy as np + + +def van_der_corput(n, base=2): + """Generate the n-th value in the Van der Corput sequence.""" + vdc, denom = 0, 1 + while n: + denom *= base + n, remainder = divmod(n, base) + vdc += remainder / denom + return vdc + + +def van_der_corput_sampling_gen(vdc_values): + """Generator function for sampling indices based on weights using the Van der Corput sequence.""" + + def gen(weights, vdc_value): + cdf = np.cumsum(weights) + sample = np.searchsorted(cdf, vdc_value) + return sample + + sample_index = 0 + # Pre-generate Van der Corput sequence + max_samples = 100000 # or any number that you find suitable + + while True: + # Generate the next value in the Van der Corput sequence + vdc_value = vdc_values[sample_index % max_samples] + # Generate a sample index based on the Van der Corput value and the CDF + yield partial(gen, vdc_value=vdc_value) + sample_index += 1