You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.0 KiB
35 lines
1.0 KiB
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
|