Skip to content
Snippets Groups Projects
Commit 8d94cdd3 authored by Bruce Edelman's avatar Bruce Edelman
Browse files

added check for minimum samples in constraint nomralizationa nd propoerlly...

added check for minimum samples in constraint nomralizationa nd propoerlly normalize lnprob as well as prob
parent 41f729a7
No related branches found
No related tags found
1 merge request!704Resolve #430 (Add normalisation flag to constrained prior)
......@@ -381,8 +381,15 @@ class PriorDict(dict):
@lru_cache()
def normalize_constraint_factor(self, keys):
samples = self.sample_subset(keys=keys, size=1000)
min_accept = 50
sampling_chunk = 250
samples = self.sample_subset(keys=keys, size=sampling_chunk)
keep = np.array(self.evaluate_constraints(samples))
while np.count_nonzero(keep) < min_accept:
new_samples = self.sample_subset(keys=keys, size=sampling_chunk)
for key in samples:
samples[key] = np.concatenate(samples[key], new_samples[key])
keep = np.array(self.evaluate_constraints(samples))
return len(keep) / np.count_nonzero(keep)
def prob(self, sample, **kwargs):
......@@ -444,6 +451,14 @@ class PriorDict(dict):
ln_prob = np.sum([self[key].ln_prob(sample[key])
for key in sample], axis=axis)
ratio = 1
outsample = self.conversion_function(sample)
# Check if there is a constraint in sample/outsample
if (np.any(isinstance([self[key] for key in sample.keys()], Constraint)) or
np.any(isinstance([self[key] for key in outsample.keys()], Constraint))):
# If constraint exists in keys, caclulate the cached normalization constant
ratio = self.normalize_constraint_factor(sample.keys())
if np.all(np.isinf(ln_prob)):
return ln_prob
else:
......@@ -455,7 +470,7 @@ class PriorDict(dict):
else:
constrained_ln_prob = -np.inf * np.ones_like(ln_prob)
keep = np.array(self.evaluate_constraints(sample), dtype=bool)
constrained_ln_prob[keep] = ln_prob[keep]
constrained_ln_prob[keep] = ln_prob[keep] + np.log(ratio)
return constrained_ln_prob
def rescale(self, keys, theta):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment