def testInverse_CountLevelSetEvent(self):
     rv = self._random_variable()
     event = probability.CountLevelSetEvent({'a': 1, 'x': 1})
     result = rv.inverse(event)
     sequences = result.all_sequences()
     self.assertLen(sequences, 2)
     self.assertEqual(set(sequences), {(1, 1), (1, 3)})
    def testAllSequences(self):
        event = probability.CountLevelSetEvent({'a': 2, 'b': 4, 'c': 1})
        all_sequences = event.all_sequences()

        # Number of sequences should be 7! / (4! * 2! * 1!) = 105.
        self.assertLen(all_sequences, 105)
        # They should all be unique.
        self.assertEqual(len(all_sequences), len(set(all_sequences)))
        # And check contains one correctly generated tuple.
        self.assertIn(('a', 'b', 'c', 'b', 'b', 'a', 'b'), all_sequences)
    def testProbability_CountLevelSetEvent(self):
        base_space = probability.DiscreteProbabilitySpace({
            'a': 2,
            'b': 3,
            'c': 5
        })
        space = probability.FiniteProductSpace([base_space] * 12)
        event = probability.CountLevelSetEvent({'a': 7, 'b': 2, 'c': 3})

        # Probability should be (12 choose 7 2 3) * p(a)^7 p(b)^2 p(c)^3
        coeff = 7920
        p_a = sympy.Rational(1, 5)
        p_b = sympy.Rational(3, 10)
        p_c = sympy.Rational(1, 2)
        self.assertEqual(space.probability(event),
                         coeff * pow(p_a, 7) * pow(p_b, 2) * pow(p_c, 3))
Ejemplo n.º 4
0
def _level_set_event(values, length, verb):
    """Generates `LevelSetEvent`; see _generate_sequence_event."""
    counts = combinatorics.uniform_non_negative_integers_with_sum(
        len(values), length)
    counts_dict = dict(list(zip(values, counts)))
    event = probability.CountLevelSetEvent(counts_dict)

    shuffled_values = list(values)
    random.shuffle(shuffled_values)

    counts_and_values = [
        '{} {}'.format(counts_dict[value], value) for value in shuffled_values
        if counts_dict[value] > 0
    ]
    counts_and_values = _word_series(counts_and_values)
    template = random.choice([
        '{verbing} {counts_and_values}',
    ])
    verbing = _GERUNDS[verb]
    event_description = template.format(counts_and_values=counts_and_values,
                                        verbing=verbing)
    return event, event_description