Beispiel #1
0
 def probability(self, condition):
     if self._is_symbolic:
         #TODO: Implement the mechanism for handling queries for symbolic sized distributions.
         raise NotImplementedError("Currently, probability queries are not "
         "supported for random variables with symbolic sized distributions.")
     condition = rv_subs(condition)
     return FinitePSpace(self.domain, self.distribution).probability(condition)
Beispiel #2
0
 def compute_quantile(self, expr):
     if self._is_symbolic:
         raise NotImplementedError("Computing quantile for random variables "
         "with symbolic dimension because the bounds of searching the required "
         "value is undetermined.")
     expr = rv_subs(expr, self.values)
     return FinitePSpace(self.domain, self.distribution).compute_quantile(expr)
Beispiel #3
0
 def compute_cdf(self, expr):
     if self._is_symbolic:
         d = self.compute_density(expr)
         k = Dummy('k')
         ki = Dummy('ki')
         return Lambda(k, Sum(d(ki), (ki, self.args[1].low, k)))
     expr = rv_subs(expr, self.values)
     return FinitePSpace(self.domain, self.distribution).compute_cdf(expr)
Beispiel #4
0
 def compute_density(self, expr):
     expr = rv_subs(expr, self.values)
     d = FiniteDensity()
     for elem in self.domain:
         val = expr.xreplace(dict(elem))
         prob = self.prob_of(elem)
         d[val] = d.get(val, S.Zero) + prob
     return d
Beispiel #5
0
 def __new__(cls, domain, condition):
     """
     Create a new instance of ConditionalFiniteDomain class
     """
     if condition is True:
         return domain
     cond = rv_subs(condition)
     return Basic.__new__(cls, domain, cond)
Beispiel #6
0
 def compute_moment_generating_function(self, expr):
     if self._is_symbolic:
         d = self.compute_density(expr)
         t = Dummy('t', real=True)
         ki = Dummy('ki')
         return Lambda(t, Sum(d(ki)*exp(ki*t), (ki, self.args[1].low, self.args[1].high)))
     expr = rv_subs(expr, self.values)
     return FinitePSpace(self.domain, self.distribution).compute_moment_generating_function(expr)
Beispiel #7
0
    def __new__(cls, domain, condition):
        cond = rv_subs(condition)
        # Check that we aren't passed a condition like die1 == z
        # where 'z' is a symbol that we don't know about
        # We will never be able to test this equality through iteration
        if not cond.free_symbols.issubset(domain.free_symbols):
            raise ValueError('Condition "%s" contains foreign symbols \n%s.\n' % (
                condition, tuple(cond.free_symbols - domain.free_symbols)) +
                "Will be unable to iterate using this condition")

        return ConditionalDomain.__new__(cls, domain, condition)
Beispiel #8
0
 def compute_density(self, expr):
     if self._is_symbolic:
         rv = list(random_symbols(expr))[0]
         k = Dummy('k', integer=True)
         cond = True if not isinstance(expr, (Relational, Logic)) \
                  else expr.subs(rv, k)
         return Lambda(k,
         Piecewise((self.pmf(k), And(k >= self.args[1].low,
         k <= self.args[1].high, cond)), (0, True)))
     expr = rv_subs(expr, self.values)
     return FinitePSpace(self.domain, self.distribution).compute_density(expr)
Beispiel #9
0
    def __new__(cls, domain, condition):
        cond = rv_subs(condition)
        # Check that we aren't passed a condition like die1 == z
        # where 'z' is a symbol that we don't know about
        # We will never be able to test this equality through iteration
        if not cond.free_symbols.issubset(domain.free_symbols):
            raise ValueError('Condition "%s" contains foreign symbols \n%s.\n'%(
                condition, tuple(cond.free_symbols-domain.free_symbols))+
                "Will be unable to iterate using this condition")

        return ConditionalDomain.__new__(cls, domain, condition)
Beispiel #10
0
 def compute_expectation(self, expr, rvs=None, **kwargs):
     if self._is_symbolic:
         rv = random_symbols(expr)[0]
         k = Dummy('k', integer=True)
         expr = expr.subs(rv, k)
         cond = True if not isinstance(expr, (Relational, Logic)) \
                 else expr
         func = self.pmf(k) * k if cond != True else self.pmf(k) * expr
         return Sum(Piecewise((func, cond), (0, True)),
             (k, self.distribution.low, self.distribution.high)).doit()
     expr = rv_subs(expr, rvs)
     return FinitePSpace(self.domain, self.distribution).compute_expectation(expr, rvs, **kwargs)
Beispiel #11
0
 def compute_expectation(self, expr, rvs=None, **kwargs):
     rvs = rvs or self.values
     expr = rv_subs(expr, rvs)
     probs = [self.prob_of(elem) for elem in self.domain]
     if isinstance(expr, (Logic, Relational)):
         parse_domain = [tuple(elem)[0][1] for elem in self.domain]
         bools = [expr.xreplace(dict(elem)) for elem in self.domain]
     else:
         parse_domain = [expr.xreplace(dict(elem)) for elem in self.domain]
         bools = [True for elem in self.domain]
     return sum([Piecewise((prob * elem, blv), (0, True))
             for prob, elem, blv in zip(probs, parse_domain, bools)])
Beispiel #12
0
 def probability(self, condition):
     cond_symbols = frozenset(rs.symbol for rs in random_symbols(condition))
     cond = rv_subs(condition)
     if not cond_symbols.issubset(self.symbols):
         raise ValueError("Cannot compare foreign random symbols, %s"
                          %(str(cond_symbols - self.symbols)))
     if isinstance(condition, Relational) and \
         (not cond.free_symbols.issubset(self.domain.free_symbols)):
         rv = condition.lhs if isinstance(condition.rhs, Symbol) else condition.rhs
         return sum(Piecewise(
                    (self.prob_of(elem), condition.subs(rv, list(elem)[0][1])),
                    (0, True)) for elem in self.domain)
     return sum(self.prob_of(elem) for elem in self.where(condition))
Beispiel #13
0
 def compute_characteristic_function(self, expr):
     if self._is_symbolic:
         d = self.compute_density(expr)
         t = Dummy("t", real=True)
         ki = Dummy("ki")
         return Lambda(
             t,
             Sum(
                 d(ki) * exp(I * ki * t),
                 (ki, self.args[1].low, self.args[1].high)),
         )
     expr = rv_subs(expr, self.values)
     return FinitePSpace(
         self.domain,
         self.distribution).compute_characteristic_function(expr)