def test_variance_condition(): base_conditions = [ MaxEntropyCondition(weight=0.001), SmoothnessCondition(), IntervalCondition(p=0.95, min=0.3, max=0.7), ] base_dist = PointDensity.from_conditions(base_conditions, verbose=True, scale=Scale(0, 1)) base_variance = base_dist.variance() increased_variance = base_variance + 0.01 # Increase in variance should decrease peak var_condition = VarianceCondition(variance=increased_variance, weight=1) var_conditions = base_conditions + [var_condition] var_dist = PointDensity.from_conditions(var_conditions, verbose=True, scale=Scale(0, 1)) assert np.max(var_dist.normed_densities) < np.max( base_dist.normed_densities) # Highly weighted variance condition should make var very close to specified var strong_condition = VarianceCondition(variance=increased_variance, weight=100000) strong_var_conditions = base_conditions + [strong_condition] strong_var_dist = PointDensity.from_conditions(strong_var_conditions, verbose=True, scale=Scale(0, 1)) assert strong_var_dist.variance() == pytest.approx( float(increased_variance), abs=0.001)
def test_variance_condition(): def get_variance(dist): xs = np.linspace(dist.scale.low, dist.scale.high, dist.ps.size) mean = np.dot(dist.ps, xs) return np.dot(dist.ps, np.square(xs - mean)) base_conditions = [ MaxEntropyCondition(weight=0.1), SmoothnessCondition(), IntervalCondition(p=0.95, min=0.3, max=0.7), ] base_dist = HistogramDist.from_conditions(base_conditions, verbose=True) base_variance = get_variance(base_dist) increased_variance = base_variance + 0.01 # Increase in variance should decrease peak var_condition = VarianceCondition(variance=increased_variance, weight=1) var_conditions = base_conditions + [var_condition] var_dist = HistogramDist.from_conditions(var_conditions, verbose=True) assert np.max(var_dist.ps) < np.max(base_dist.ps) # Highly weighted variance condition should make var very close to specified var strong_condition = VarianceCondition(variance=increased_variance, weight=1000) strong_var_conditions = base_conditions + [strong_condition] strong_var_dist = HistogramDist.from_conditions(strong_var_conditions, verbose=True) assert get_variance(strong_var_dist) == pytest.approx( float(increased_variance), abs=0.001)
def test_interval_plus_entropy(scale: Scale): conditions = [ IntervalCondition(p=0.5, max=scale.denormalize_point(0.3)), MaxEntropyCondition(weight=0.01), ] fitted_dist = PointDensity.from_conditions( conditions, scale=scale, ) # We expect at most 3 different densities: one for inside the interval, one for outside, # and one between. assert np.unique(fitted_dist.normed_densities).size <= 3
def test_density_cdf(scale: Scale): uniform_dist = PointDensity.from_conditions([MaxEntropyCondition()], scale=scale) # Off of scale assert uniform_dist.cdf(scale.denormalize_point(-0.5)) == 0 assert uniform_dist.cdf(scale.denormalize_point(1.5)) == 1 # Edges of scale assert uniform_dist.cdf(scale.denormalize_point(0.005)) < uniform_dist.cdf( scale.denormalize_point(0.015)) assert uniform_dist.cdf(scale.denormalize_point(0.985)) < uniform_dist.cdf( scale.denormalize_point(0.995)) # Denormalized onto a different scale denormalized_dist = uniform_dist.denormalize(Scale(0, 2)) assert denormalized_dist.cdf(1) == pytest.approx(0.5, abs=0.01) assert denormalized_dist.cdf(1.5) != 0 assert denormalized_dist.cdf(2.5) == 1
def test_mean_condition(): def get_mean(dist): xs = np.linspace(dist.scale.low, dist.scale.high, dist.ps.size) return np.dot(dist.ps, xs) base_conditions = [MaxEntropyCondition(weight=0.1)] base_dist = HistogramDist.from_conditions(base_conditions, verbose=True) base_mean = get_mean(base_dist) # Mean condition should move mean closer to specified mean mean_conditions = base_conditions + [MeanCondition(mean=0.25, weight=1)] mean_dist = HistogramDist.from_conditions(mean_conditions, verbose=True) assert abs(get_mean(mean_dist) - 0.25) < abs(base_mean - 0.25) # Highly weighted mean condition should make mean very close to specified mean strong_condition = MeanCondition(mean=0.25, weight=1000) strong_mean_conditions = base_conditions + [strong_condition] strong_mean_dist = HistogramDist.from_conditions(strong_mean_conditions, verbose=True) assert get_mean(strong_mean_dist) == pytest.approx(0.25, rel=0.01)
def test_mean_condition(): base_conditions = [MaxEntropyCondition(weight=0.1)] base_dist = PointDensity.from_conditions(base_conditions, verbose=True, scale=Scale(0, 1)) base_mean = base_dist.mean() # Mean condition should move mean closer to specified mean mean_conditions = base_conditions + [MeanCondition(mean=0.25, weight=1)] mean_dist = PointDensity.from_conditions(mean_conditions, verbose=True, scale=Scale(0, 1)) assert abs(mean_dist.mean() - 0.25) < abs(base_mean - 0.25) # Highly weighted mean condition should make mean very close to specified mean strong_condition = MeanCondition(mean=0.25, weight=100000) strong_mean_conditions = base_conditions + [strong_condition] strong_mean_dist = PointDensity.from_conditions(strong_mean_conditions, verbose=True, scale=Scale(0, 1)) assert strong_mean_dist.mean() == pytest.approx(0.25, rel=0.01)
def test_fit_hist_regression_1(): """ Regression test for bug: "This custom question has a weird histogram - why?" see https://elicit.ought.org/builder/gflpsSBAb for more on the bug, see https://docs.google.com/document/d/1CFklTKtbKzXi6-lRaEsX4ZiY3Yzpbfdg7i2j1NvKP34/edit#heading=h.ph1huakxn33f """ conditions = [ IntervalCondition(p=0.25, max=2.0), IntervalCondition(p=0.75, max=4.0), IntervalCondition(p=0.9, max=6.0), MaxEntropyCondition(weight=0.1), ] histogram_dist = HistogramDist.from_conditions(conditions, scale=Scale(low=0, high=52)) assert histogram_dist.cdf(2) == pytest.approx(0.25, abs=0.05) assert histogram_dist.ppf(0.9) == pytest.approx(6, abs=1)
def test_density_pdf(scale: Scale): uniform_dist = PointDensity.from_conditions([MaxEntropyCondition()], scale=scale) assert uniform_dist.pdf(scale.denormalize_point(0.5)) != 0 assert uniform_dist.pdf(scale.denormalize_point(1.5)) == 0
def test_hist_pdf(scale: Scale): uniform_dist = HistogramDist.from_conditions([MaxEntropyCondition()], scale=scale) assert uniform_dist.pdf(scale.denormalize_point(0.5)) != 0 assert uniform_dist.pdf(scale.denormalize_point(1.5)) == 0