Skip to content

Commit 4ca5f4d

Browse files
committed
DEV: add distance ratio as part of distance insertion test
1 parent a9ffadd commit 4ca5f4d

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

py/dynesty/dynamicsampler.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,7 @@ def _configure_batch_sampler(main_sampler,
605605
saved_scale = np.array(main_sampler.saved_run['scale'])
606606
saved_blobs = np.array(main_sampler.saved_run['blob'])
607607
saved_distances_indices = np.array(main_sampler.saved_run["distance_insertion_index"])
608+
saved_log_distance_ratios = np.array(main_sampler.saved_run["log_distance_ratio"])
608609
saved_likelihood_indices = np.array(main_sampler.saved_run["likelihood_insertion_index"])
609610
first_points = []
610611

@@ -724,6 +725,7 @@ def _configure_batch_sampler(main_sampler,
724725

725726
live_scale = saved_scale[subset0[0]]
726727
live_distance_index = saved_distances_indices[subset0[0]]
728+
live_log_distance_ratio = saved_log_distance_ratios[subset0[0]]
727729
live_likelihood_index = saved_likelihood_indices[subset0[0]]
728730
# set the scale based on the lowest point
729731

@@ -776,6 +778,7 @@ def _configure_batch_sampler(main_sampler,
776778
batch_sampler.scale = live_scale
777779
batch_sampler.live_blobs = live_blobs
778780
batch_sampler.distance_insertion_index = live_distance_index
781+
batch_sampler.log_distance_ratio = live_log_distance_ratio
779782
batch_sampler.likelihood_insertion_index = live_likelihood_index
780783

781784
batch_sampler.update_bound_if_needed(logl_min)
@@ -1111,7 +1114,7 @@ def results(self):
11111114
('bound_iter', np.array(self.saved_run['bounditer'])))
11121115
results.append(
11131116
('samples_bound', np.array(self.saved_run['boundidx'])))
1114-
for key in ['scale', 'distance_insertion_index', 'likelihood_insertion_index']:
1117+
for key in ['scale', 'distance_insertion_index', 'log_distance_ratio', 'likelihood_insertion_index']:
11151118
results.append((key, np.array(self.saved_run[key])))
11161119

11171120
return Results(results)
@@ -1367,6 +1370,7 @@ def sample_initial(self,
13671370
bounditer=results.bounditer,
13681371
scale=self.sampler.scale,
13691372
distance_insertion_index=self.sampler.distance_insertion_index,
1373+
log_distance_ratio=self.sampler.log_distance_ratio,
13701374
likelihood_insertion_index=self.sampler.likelihood_insertion_index,
13711375
)
13721376

@@ -1415,6 +1419,7 @@ def sample_initial(self,
14151419
bounditer=results.bounditer,
14161420
scale=self.sampler.scale,
14171421
distance_insertion_index=-1,
1422+
log_distance_ratio=-1,
14181423
likelihood_insertion_index=-1,
14191424
)
14201425

@@ -1626,6 +1631,7 @@ def sample_batch(self,
16261631
bounditer=results.bounditer,
16271632
scale=batch_sampler.scale,
16281633
distance_insertion_index=batch_sampler.distance_insertion_index,
1634+
log_distance_ratio=batch_sampler.log_distance_ratio,
16291635
likelihood_insertion_index=batch_sampler.likelihood_insertion_index,
16301636
)
16311637
self.new_run.append(D)
@@ -1678,6 +1684,7 @@ def sample_batch(self,
16781684
bounditer=results.bounditer,
16791685
scale=batch_sampler.scale,
16801686
distance_insertion_index=-1,
1687+
log_distance_ratio=-1,
16811688
likelihood_insertion_index=-1,
16821689
)
16831690
self.new_run.append(D)
@@ -1713,7 +1720,9 @@ def combine_runs(self):
17131720
for k in [
17141721
'id', 'u', 'v', 'logl', 'nc', 'boundidx', 'it', 'bounditer',
17151722
'n', 'scale', 'blob', 'logvol',
1716-
'distance_insertion_index', 'likelihood_insertion_index',
1723+
'distance_insertion_index',
1724+
'log_distance_ratio',
1725+
'likelihood_insertion_index',
17171726
]:
17181727
saved_d[k] = np.array(self.saved_run[k])
17191728
new_d[k] = np.array(self.new_run[k])
@@ -1766,7 +1775,9 @@ def combine_runs(self):
17661775
for k in [
17671776
'id', 'u', 'v', 'logl', 'nc', 'boundidx', 'it',
17681777
'bounditer', 'scale', 'blob',
1769-
'distance_insertion_index', 'likelihood_insertion_index',
1778+
'distance_insertion_index',
1779+
'log_distance_ratio',
1780+
'likelihood_insertion_index',
17701781
]:
17711782
add_info[k] = add_source[k][add_idx]
17721783
self.saved_run.append(add_info)

py/dynesty/sampler.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ def __init__(self,
105105
# set to none just for qa
106106
self.scale = None
107107
self.distance_insertion_index = -1
108+
self.log_distance_ratio = -1
108109
self.likelihood_insertion_index = -1
109110
self.method = None
110111
self.kwargs = {}
@@ -263,7 +264,7 @@ def results(self):
263264
dtype=int)))
264265
results.append(('samples_bound',
265266
np.array(self.saved_run['boundidx'], dtype=int)))
266-
for key in ['scale', 'distance_insertion_index', 'likelihood_insertion_index']:
267+
for key in ['scale', 'distance_insertion_index', 'log_distance_ratio', 'likelihood_insertion_index']:
267268
results.append((key, np.array(self.saved_run.D[key])))
268269

269270
return Results(results)
@@ -425,7 +426,18 @@ def _distance_insertion_index(self, start, point):
425426
norms = np.std(self.live_u, axis=0)
426427
distance = np.linalg.norm((point - start) / norms)
427428
all_distances = np.array([np.linalg.norm((start - u) / norms) for u in self.live_u])
428-
return sum(all_distances < distance)
429+
idx = sum(all_distances < distance)
430+
if distance == 0:
431+
log_ratio = np.inf
432+
else:
433+
other = self.live_u[np.random.choice(len(self.live_u))]
434+
other_distance = np.linalg.norm((other - start) / norms)
435+
while other_distance == 0:
436+
other = self.live_u[np.random.choice(len(self.live_u))]
437+
other_distance = np.linalg.norm((other - start) / norms)
438+
alt_distance = np.linalg.norm((point - other) / norms)
439+
log_ratio = self.ndim * (np.log(other_distance / distance) + np.log(other_distance / alt_distance)) / 2
440+
return log_ratio, idx
429441

430442
def _likelihood_insertion_index(self, logl):
431443
"""
@@ -469,7 +481,7 @@ def _new_point(self, loglstar):
469481
# If it's not empty we are just accumulating the
470482
# the history of evaluations
471483
self.update_proposal(blob, update=self.nqueue <= 0)
472-
self.distance_insertion_index = self._distance_insertion_index(blob["start"], u)
484+
self.log_distance_ratio, self.distance_insertion_index = self._distance_insertion_index(blob["start"], u)
473485
self.likelihood_insertion_index = self._likelihood_insertion_index(logl)
474486

475487
# the reason I'm not using self.ncall is that it's updated at
@@ -602,6 +614,7 @@ def add_live_points(self):
602614
scale=self.scale,
603615
blob=old_blob,
604616
distance_insertion_index=-1,
617+
log_distance_ratio=-1,
605618
likelihood_insertion_index=-1,
606619
))
607620
self.eff = 100. * (self.it + i) / self.ncall # efficiency
@@ -634,7 +647,10 @@ def _remove_live_points(self):
634647
for k in [
635648
'id', 'u', 'v', 'logl', 'logvol', 'logwt', 'logz',
636649
'logzvar', 'h', 'nc', 'boundidx', 'it', 'bounditer',
637-
'scale', 'blob', 'distance_insertion_index', 'likelihood_insertion_index',
650+
'scale', 'blob',
651+
'distance_insertion_index',
652+
'log_distance_ratio',
653+
'likelihood_insertion_index',
638654
]:
639655
del self.saved_run[k][-self.nlive:]
640656
else:
@@ -926,6 +942,7 @@ def sample(self,
926942
scale=self.scale,
927943
blob=old_blob,
928944
distance_insertion_index=self.distance_insertion_index,
945+
log_distance_ratio=self.log_distance_ratio,
929946
likelihood_insertion_index=self.likelihood_insertion_index,
930947
))
931948

py/dynesty/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ def __init__(self, dynamic=False):
278278
'bounditer', # active bound at a specific iteration
279279
'scale', # scale factor at each iteration
280280
'distance_insertion_index',
281+
'log_distance_ratio',
281282
# number of points less distant from the starting point than the last inserted point
282283
'likelihood_insertion_index',
283284
# number of points with lower likelihood than the last inserted point
@@ -622,6 +623,11 @@ def print_fn_fallback(results,
622623
('distance_insertion_index', 'array[int]',
623624
"The number of live points closer to the start point than "
624625
"the new point", 'niter'),
626+
('log_distance_ratio', 'array[float]',
627+
"The log of the ratio distance of the new point to the start point to "
628+
"the distance of the start point to a random other live point. This is "
629+
"used as a diagnostic for independence of the new sample",
630+
'niter'),
625631
('likelihood_insertion_index', 'array[int]',
626632
"The number of live points with likelihood less than "
627633
"the new point", 'niter'),

0 commit comments

Comments
 (0)