#ifndef DMULTI_H_
#define DMULTI_H_

#include <distributions/Distribution.h>

/**
 * <pre>
 * X[] ~ dmulti(p[], N)
 * f(x | p, N) = prod (p^x) ; sum(x) = N
 * </pre>
 * @short Multinomial distribution
 */
class DMulti : public Distribution {
public:
  DMulti();
  ~DMulti();
  double logLikelihood(SArray const &x, 
		       std::vector<SArray const *> const &parameters) const;
  void randomSample(SArray &x,
		    std::vector<SArray const *> const &parameters) const;
  /**
   * Checks that elements of p lie in range (0,1) and 
   * and sum to 1. Checks that N >= 1
   */
  bool checkParameterValue(std::vector<SArray const *> const &parameters) const;
  /**
   * Checks that p is a vector and N is a discrete-valued scalar
   */
  bool checkParameterDim(std::vector<SArray const *> const &parameters) const;
  Index const &dim(std::vector<SArray const *> const &parameters) const;
  unsigned long df(std::vector<SArray const *> const &parameters) const;
  double lowerSupport(unsigned long i,
		      std::vector<SArray const *> const &parameters) const;
  double upperSupport(unsigned long i,
		      std::vector<SArray const *> const &parameters) const;
};

#endif /* DMULTI_H_ */


syntax highlighted by Code2HTML, v. 0.9.1