# Path: distributions/dbg/special.py

# 
# Path: distributions/dbg/random.py
# LOG = logging.getLogger(__name__)
#     S = inner(inner(z, inv(sigma)), z)
#     X = multivariate_normal(mean=numpy.zeros(d), cov=Lambda, size=nu)
#     S = numpy.dot(X.T, X)
#     T = numpy.zeros((d, d))
#     D, = mu0.shape
#     Z = 0.
# def seed(x):
# def sample_discrete_log(scores):
# def sample_bernoulli(prob):
# def sample_discrete(probs, total=None):
# def sample_normal(mu, sigmasq):
# def sample_chi2(nu):
# def sample_student_t(dof, mu, Sigma):
# def score_student_t(x, nu, mu, sigma):
# def sample_wishart_naive(nu, Lambda):
# def sample_wishart(nu, Lambda):
# def sample_wishart_v2(nu, Lambda):
# def sample_inverse_wishart(nu, S):
# def sample_normal_inverse_wishart(mu0, lambda0, psi0, nu0):
# def sample_partition_from_counts(items, counts):
# def sample_stick(gamma, tol=1e-3):
# def sample_negative_binomial(p, r):


from distributions.dbg.special import log, factorial, gammaln
from distributions.dbg.random import sample_gamma, sample_poisson
from distributions.mixins import SharedMixin, GroupIoMixin, SharedIoMixin
        self.count += 1
        self.sum += int(value)
        self.log_prod += log(factorial(value))

    def add_repeated_value(self, shared, value, count):
        self.count += count
        self.sum += int(count * value)
        self.log_prod += count * log(factorial(value))

    def remove_value(self, shared, value):
        self.count -= 1
        self.sum -= int(value)
        self.log_prod -= log(factorial(value))

    def merge(self, shared, source):
        self.count += source.count
        self.sum += source.sum
        self.log_prod += source.log_prod

    def score_value(self, shared, value):
        post = shared.plus_group(self)
        return gammaln(post.alpha + value) - gammaln(post.alpha) \
            + post.alpha * log(post.inv_beta) \
            - (post.alpha + value) * log(1. + post.inv_beta) \
            - log(factorial(value))

    def score_data(self, shared):
        post = shared.plus_group(self)
        return gammaln(post.alpha) - gammaln(shared.alpha) \
            - post.alpha * log(post.inv_beta) \

# Path: distributions/dbg/special.py

# 
# Path: distributions/dbg/random.py
# LOG = logging.getLogger(__name__)
#     S = inner(inner(z, inv(sigma)), z)
#     X = multivariate_normal(mean=numpy.zeros(d), cov=Lambda, size=nu)
#     S = numpy.dot(X.T, X)
#     T = numpy.zeros((d, d))
#     D, = mu0.shape
#     Z = 0.
# def seed(x):
# def sample_discrete_log(scores):
# def sample_bernoulli(prob):
# def sample_discrete(probs, total=None):
# def sample_normal(mu, sigmasq):
# def sample_chi2(nu):
# def sample_student_t(dof, mu, Sigma):
# def score_student_t(x, nu, mu, sigma):
# def sample_wishart_naive(nu, Lambda):
# def sample_wishart(nu, Lambda):
# def sample_wishart_v2(nu, Lambda):
# def sample_inverse_wishart(nu, S):
# def sample_normal_inverse_wishart(mu0, lambda0, psi0, nu0):
# def sample_partition_from_counts(items, counts):
# def sample_stick(gamma, tol=1e-3):
# def sample_negative_binomial(p, r):


# Path: distributions/dbg/models/gp.py
from distributions.dbg.special import log, factorial, gammaln
from distributions.dbg.random import sample_gamma, sample_poisson
from distributions.mixins import SharedMixin, GroupIoMixin, SharedIoMixin

        self.count += 1
        self.sum += int(value)
        self.log_prod += log(factorial(value))

    def add_repeated_value(self, shared, value, count):
        self.count += count
        self.sum += int(count * value)
        self.log_prod += count * log(factorial(value))

    def remove_value(self, shared, value):
        self.count -= 1
        self.sum -= int(value)
        self.log_prod -= log(factorial(value))

    def merge(self, shared, source):
        self.count += source.count
        self.sum += source.sum
        self.log_prod += source.log_prod

    def score_value(self, shared, value):
        post = shared.plus_group(self)
        return gammaln(post.alpha + value) - gammaln(post.alpha) \
            + post.alpha * log(post.inv_beta) \
            - (post.alpha + value) * log(1. + post.inv_beta) \
            - log(factorial(value))

    def score_data(self, shared):
        post = shared.plus_group(self)
        return gammaln(post.alpha) - gammaln(shared.alpha) \
            - post.alpha * log(post.inv_beta) \

            + shared.alpha * log(shared.inv_beta) \