예제 #1
0
 def normalization_interval_condition_test(p, min, max, scale_min,
                                           scale_max):
     condition = IntervalCondition(p=p, min=min, max=max)
     assert (condition.normalize(scale_min=scale_min,
                                 scale_max=scale_max).denormalize(
                                     scale_min=scale_min,
                                     scale_max=scale_max) == condition)
예제 #2
0
def test_weights_mixture():
    conditions = [
        IntervalCondition(p=0.4, max=1, weight=0.01),
        IntervalCondition(p=0.5, max=2, weight=100),
        IntervalCondition(p=0.8, max=2.2, weight=0.01),
        IntervalCondition(p=0.9, max=2.3, weight=0.01),
    ]
    dist = LogisticMixture.from_conditions(conditions,
                                           num_components=1,
                                           verbose=True)
    assert dist.components[0].loc == pytest.approx(2, rel=0.1)
예제 #3
0
def test_mixture_from_percentiles():
    conditions = [
        IntervalCondition(p=0.1, max=1),
        IntervalCondition(p=0.5, max=2),
        IntervalCondition(p=0.6, max=3),
    ]
    dist = LogisticMixture.from_conditions(conditions,
                                           num_components=3,
                                           verbose=True)
    for condition in conditions:
        assert dist.cdf(condition.max) == pytest.approx(condition.p, rel=0.1)
예제 #4
0
def test_normalization_interval_condition():
    def normalization_interval_condition_test(p, min, max, scale_min,
                                              scale_max):
        condition = IntervalCondition(p=p, min=min, max=max)
        assert (condition.normalize(scale_min=scale_min,
                                    scale_max=scale_max).denormalize(
                                        scale_min=scale_min,
                                        scale_max=scale_max) == condition)

    # straightforward scenario
    normalization_interval_condition_test(p=0.5,
                                          min=10,
                                          max=100,
                                          scale_min=10,
                                          scale_max=1000)

    # left open
    normalization_interval_condition_test(p=0.5,
                                          min=None,
                                          max=10000,
                                          scale_min=10,
                                          scale_max=1000)

    # right open
    normalization_interval_condition_test(p=0.5,
                                          min=10,
                                          max=None,
                                          scale_min=10,
                                          scale_max=1000)

    # negative values
    normalization_interval_condition_test(p=0.5,
                                          min=-1000,
                                          max=-100,
                                          scale_min=-10000,
                                          scale_max=-1000)

    # p = 1
    normalization_interval_condition_test(p=1,
                                          min=10,
                                          max=100,
                                          scale_min=10,
                                          scale_max=1000)

    # interval bigger than scale
    normalization_interval_condition_test(p=1,
                                          min=0,
                                          max=1000,
                                          scale_min=10,
                                          scale_max=100)

    assert IntervalCondition(p=0.5, min=0, max=5).normalize(
        scale_min=0, scale_max=10) == IntervalCondition(p=0.5, min=0, max=0.5)
예제 #5
0
def test_mixture_from_percentile():
    for value in [0.01, 0.1, 1, 3]:
        conditions = [IntervalCondition(p=0.5, max=value)]
        dist = LogisticMixture.from_conditions(conditions,
                                               num_components=1,
                                               verbose=True)
        loc = dist.components[0].loc
        assert loc == pytest.approx(value, rel=0.1), loc
예제 #6
0
def test_interval_condition():
    dist = Uniform(min=-1, max=1)

    assert IntervalCondition(p=0.5, min=0, max=1).loss(dist) == 0
    assert IntervalCondition(p=0.25, min=0, max=1).loss(dist) == 0.25**2
    assert IntervalCondition(p=1, max=0).loss(dist) == 0.5**2
    assert IntervalCondition(p=1).loss(dist) == 0
    assert IntervalCondition(p=0, min=-1, max=1).loss(dist) == 1
    assert IntervalCondition(p=0, min=-1, max=1, weight=10).loss(dist) == 10

    assert (IntervalCondition(p=0.25, min=0,
                              max=1).describe_fit(dist)["loss"] == 0.25**2)
    assert (IntervalCondition(
        p=0, min=-1, max=0).describe_fit(dist)["p_in_interval"] == 0.5)
    assert (IntervalCondition(
        p=1, min=-1, max=0).describe_fit(dist)["p_in_interval"] == 0.5)
예제 #7
0
def test_most_likely_outcome_condition():
    base_conditions = [IntervalCondition(p=0.4, max=0.5)]
    base_dist = HistogramDist.from_conditions(base_conditions, verbose=True)

    # Most likely condition should increase chance of specified outcome
    outcome_conditions = base_conditions + [
        MostLikelyOutcomeCondition(outcome=0.25)
    ]
    outcome_dist = HistogramDist.from_conditions(outcome_conditions,
                                                 verbose=True)
    assert outcome_dist.pdf(0.25) > base_dist.pdf(0.25)

    # Highly weighted most likely condition should make specified outcome most likely
    strong_condition = MostLikelyOutcomeCondition(outcome=0.25, weight=1000)
    strong_outcome_conditions = base_conditions + [strong_condition]
    strong_outcome_dist = HistogramDist.from_conditions(
        strong_outcome_conditions, verbose=True)
    assert strong_condition.loss(strong_outcome_dist) == 0
예제 #8
0
def test_percentile_roundtrip():
    conditions = [
        IntervalCondition(p=0.01, max=0.61081324517545),
        IntervalCondition(p=0.1, max=0.8613634657212543),
        IntervalCondition(p=0.25, max=1),
        IntervalCondition(p=0.5, max=1.5),
        IntervalCondition(p=0.75, max=2),
        IntervalCondition(p=0.9, max=2.1386364698410034),
        IntervalCondition(p=0.99, max=2.3891870975494385),
    ]
    mixture = LogisticMixture.from_conditions(conditions,
                                              num_components=3,
                                              verbose=True)
    recovered_conditions = mixture.percentiles(
        percentiles=[condition.p for condition in conditions])
    for (condition, recovered_condition) in zip(conditions,
                                                recovered_conditions):
        assert recovered_condition.max == pytest.approx(condition.max, rel=0.1)
예제 #9
0
def test_hist_from_percentile():
    for value in [0.01, 0.1, 0.5, 0.9]:
        conditions = [IntervalCondition(p=0.5, max=value)]
        dist = HistogramDist.from_conditions(conditions)
        assert dist.ppf(0.5) == pytest.approx(value, abs=0.1)
예제 #10
0
def test_mixed_2(histogram):
    conditions = (
        HistogramCondition(histogram["xs"], histogram["densities"]),
        IntervalCondition(p=0.4, max=1),
        IntervalCondition(p=0.45, max=1.2),
        IntervalCondition(p=0.48, max=1.3),
        IntervalCondition(p=0.5, max=2),
        IntervalCondition(p=0.7, max=2.2),
        IntervalCondition(p=0.9, max=2.3),
    )
    dist = LogisticMixture.from_conditions(conditions,
                                           num_components=3,
                                           verbose=True)
    assert dist.pdf1(-5) == pytest.approx(0, abs=0.1)
    assert dist.pdf1(6) == pytest.approx(0, abs=0.1)
    my_cache = {}
    my_cache[conditions] = 3
    conditions_2 = (
        HistogramCondition(histogram["xs"], histogram["densities"]),
        IntervalCondition(p=0.4, max=1),
        IntervalCondition(p=0.45, max=1.2),
        IntervalCondition(p=0.48, max=1.3),
        IntervalCondition(p=0.5, max=2),
        IntervalCondition(p=0.7, max=2.2),
        IntervalCondition(p=0.9, max=2.3),
    )
    assert hash(conditions) == hash(conditions_2)
    assert my_cache[conditions_2] == 3
예제 #11
0
def single_interval_condition_cases():
    for lower_bound in [None, 0.3]:
        for upper_bound in [None, 0.9]:
            yield IntervalCondition(p=0.5, min=lower_bound, max=upper_bound)