def marginal_mixture_logcdf(op, value, rng, weights, *components, **kwargs): # single component if len(components) == 1: # Need to broadcast value across mixture axis mix_axis = -components[0].owner.op.ndim_supp - 1 components_logcdf = logcdf(components[0], at.expand_dims(value, mix_axis)) else: components_logcdf = at.stack( [logcdf(component, value) for component in components], axis=-1, ) mix_logcdf = at.logsumexp(at.log(weights) + components_logcdf, axis=-1) # Squeeze stack dimension # There is a Aesara bug in squeeze with negative axis # https://github.com/aesara-devs/aesara/issues/830 # mix_logp = at.squeeze(mix_logp, axis=-1) mix_logcdf = at.squeeze(mix_logcdf, axis=mix_logcdf.ndim - 1) mix_logcdf = check_parameters( mix_logcdf, 0 <= weights, weights <= 1, at.isclose(at.sum(weights, axis=-1), 1), msg="0 <= weights <= 1, sum(weights) == 1", ) return mix_logcdf
def marginal_mixture_logcdf(op, value, rng, weights, *components, **kwargs): # single component if len(components) == 1: # Need to broadcast value across mixture axis mix_axis = -components[0].owner.op.ndim_supp - 1 components_logcdf = logcdf(components[0], at.expand_dims(value, mix_axis)) else: components_logcdf = at.stack( [logcdf(component, value) for component in components], axis=-1, ) mix_logcdf = at.logsumexp(at.log(weights) + components_logcdf, axis=-1) mix_logcdf = check_parameters( mix_logcdf, 0 <= weights, weights <= 1, at.isclose(at.sum(weights, axis=-1), 1), msg="0 <= weights <= 1, sum(weights) == 1", ) return mix_logcdf
def logp(value, n, p): return check_parameters( factln(n) - factln(value).sum() + (value * at.log(p)).sum(), at.all(value >= 0), at.all(0 <= p), at.all(p <= 1), at.isclose(p.sum(), 1), )
def logp(value, n, p): return check_parameters( factln(n) - factln(value).sum() + (value * at.log(p)).sum(), value >= 0, 0 <= p, p <= 1, at.isclose(p.sum(), 1), )
def logp(value, n, p): return bound( factln(n) - factln(value).sum() + (value * at.log(p)).sum(), value >= 0, 0 <= p, p <= 1, at.isclose(p.sum(), 1), broadcast_conditions=False, )
def logp(self, value): n = self.n p = self.p return bound( factln(n) - factln(value).sum() + (value * at.log(p)).sum(), at.all(value >= 0), at.all(0 <= p), at.all(p <= 1), at.isclose(p.sum(), 1), broadcast_conditions=False, )
def logp(self, value): n = self.n p = self.p return bound( factln(n) - factln(value).sum() + (value * aet.log(p)).sum(), value >= 0, 0 <= p, p <= 1, aet.isclose(p.sum(), 1), broadcast_conditions=False, )