import sys
from math import *

class Hypo(dict):
    """a hypothesis maps from each possible value of lamb to the
    likelihood of the value (or probability, if normalized).
    lamb is the parameter of the exponential distribution.
    """
    def update(self, x):
        """update this hypothesis with this datum, which is
        a measure of the distance from the source where a
        decay event was detected
        """
        # fill in this method!!!

    def normalizing_constant(self):
        """compute the normalizing constant for this hypothesis,
        which is the sum of the likelihoods of the micro-hypotheses.
        """
        return sum(self.itervalues())

    def normalize(self):
        """normalize this hypothesis so that the probabilities
        sum to 1.0
        """
        nc = self.normalizing_constant()
        for lamb in self:
            self[lamb] /= nc


def make_uniform(n=10):
    """make a hypothesis with n equally spaced micro-hypotheses
    between lamb=0+e and lamb=100, all with the same prior likelihood
    """
    h = Hypo()
    for i in range(n):
        lamb = 100.0 * (i+1) / n
        h[lamb] = 1.0
    h.normalize()
    return h


def main(name, *args):

    # make a uniform prior
    h = make_uniform(100)

    # the data from page 49
    data = [1.5, 2, 3, 4, 5, 12]

    # update the distribution and the normalize
    for x in data:
        h.update(x)
    h.normalize()

    # print the posterior distribution on logx scale
    t = h.items()
    t.sort()
    for lamb, like in t:
        print log10(lamb), like

if __name__ == '__main__':
    main(*sys.argv)
