# 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 itertools import izip
from distributions.dbg.special import log, gammaln
from distributions.dbg.random import (
    sample_discrete,
    sample_dirichlet,
    sample_beta,
)
from distributions.mixins import SharedMixin, GroupIoMixin, SharedIoMixin
    def add_value(self, shared, value):
        self.add_repeated_value(shared, value, 1)

    def remove_value(self, shared, value):
        self.add_repeated_value(shared, value, -1)

    def score_value(self, shared, value):
        """
        Adapted from dd.py, which was adapted from:
        McCallum, et. al, 'Rethinking LDA: Why Priors Matter' eqn 4
        """
        denom = shared.alpha + self.total
        if value == OTHER:
            numer = shared.beta0 * shared.alpha
        else:
            count = self.counts.get(value, 0)
            assert count >= 0, "cannot score while in debt"
            numer = shared.betas[value] * shared.alpha + count
        return log(numer / denom)

    def score_data(self, shared):
        assert len(shared.betas), 'betas is empty'
        """
        See doc/dpd.pdf Equation (3)
        """
        score = 0.
        for i, count in self.counts.iteritems():
            assert count >= 0, "cannot score while in debt"
            prior_i = shared.betas[i] * shared.alpha
            score += gammaln(prior_i + count) - gammaln(prior_i)

# 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/dpd.py
from itertools import izip
from distributions.dbg.special import log, gammaln
from distributions.dbg.random import (
    sample_discrete,
    sample_dirichlet,
    sample_beta,
)
from distributions.mixins import SharedMixin, GroupIoMixin, SharedIoMixin

    def add_value(self, shared, value):
        self.add_repeated_value(shared, value, 1)

    def remove_value(self, shared, value):
        self.add_repeated_value(shared, value, -1)

    def score_value(self, shared, value):
        """
        Adapted from dd.py, which was adapted from:
        McCallum, et. al, 'Rethinking LDA: Why Priors Matter' eqn 4
        """
        denom = shared.alpha + self.total
        if value == OTHER:
            numer = shared.beta0 * shared.alpha
        else:
            count = self.counts.get(value, 0)
            assert count >= 0, "cannot score while in debt"
            numer = shared.betas[value] * shared.alpha + count
        return log(numer / denom)

    def score_data(self, shared):
        assert len(shared.betas), 'betas is empty'
        """
        See doc/dpd.pdf Equation (3)
        """
        score = 0.
        for i, count in self.counts.iteritems():
            assert count >= 0, "cannot score while in debt"
            prior_i = shared.betas[i] * shared.alpha
            score += gammaln(prior_i + count) - gammaln(prior_i)

        score += gammaln(shared.alpha) - gammaln(shared.alpha + self.total)