/*---------------------------------------------------------------------------*
 *                                   IT++			             *
 *---------------------------------------------------------------------------*
 * Copyright (c) 1995-2004 by Tony Ottosson, Thomas Eriksson, Pål Frenger,   *
 * Tobias Ringström, and Jonas Samuelsson.                                   *
 *                                                                           *
 * Permission to use, copy, modify, and distribute this software and its     *
 * documentation under the terms of the GNU General Public License is hereby *
 * granted. No representations are made about the suitability of this        *
 * software for any purpose. It is provided "as is" without expressed or     *
 * implied warranty. See the GNU General Public License for more details.    *
 *---------------------------------------------------------------------------*/

/*! 
  \file 
  \brief 
  \author Thomas Eriksson

  1.3

  2004/09/28 11:48:28
*/

#ifndef __gmm_h
#define __gmm_h

#include <string>
#include "itconfig.h"
#include "base/itassert.h"
#include <iostream>
#include "base/vec.h"
#include "base/mat.h"
#include "base/elmatfunc.h"
#include "base/array.h"
#include <cstring>

namespace itpp {


  /*! 
    \ingroup sourcecoding
    \brief Gaussian Mixture Model Class
    \author Thomas Eriksson
   */
  class GMM {
  public:
    GMM();
    GMM(int nomix, int dim);
    GMM(string filename);
    void init_from_vq(const vec &codebook, int dim);
    //	void init(const vec &w_in, const vec &m_in, const vec &sigma_in);
    void init(const vec &w_in, const mat &m_in, const mat &sigma_in);
    void load(string filename);
    void save(string filename);
    void set_weight(const vec &weights, bool compflag=true);
    void set_weight(int i, double weight, bool compflag=true);
    void set_mean(const mat &m_in);
    void set_mean(const vec &means, bool compflag=true);
    void set_mean(int i, const vec &means, bool compflag=true);
    void set_covariance(const mat &sigma_in);
    void set_covariance(const vec &covariances, bool compflag=true);
    void set_covariance(int i, const vec &covariances, bool compflag=true);
    int get_no_mixtures();
    int get_dimension();
    vec get_weight();
    double get_weight(int i);
    vec get_mean();
    vec get_mean(int i);
    vec get_covariance();
    vec get_covariance(int i);
    void marginalize(int d_new);
    void join(const GMM &newgmm);
    void clear();
    double likelihood(const vec &x);
    double likelihood_aposteriori(const vec &x, int mixture);
    vec likelihood_aposteriori(const vec &x);
    vec draw_sample();
  protected:
    vec			m,sigma,w;
    int			M,d;
  private:
    void		compute_internals();
    vec			normweight,normexp;
  };

  inline void GMM::set_weight(const vec &weights, bool compflag) {w=weights; if (compflag) compute_internals(); }
  inline void GMM::set_weight(int i, double weight, bool compflag) {w(i)=weight; if (compflag) compute_internals(); }
  inline void GMM::set_mean(const vec &means, bool compflag) {m=means; if (compflag) compute_internals(); }
  inline void GMM::set_covariance(const vec &covariances, bool compflag) {sigma=covariances; if (compflag) compute_internals(); }
  inline int GMM::get_no_mixtures() {return M;}
  inline int GMM::get_dimension() {return d;}
  inline vec GMM::get_weight() {return w;}
  inline double GMM::get_weight(int i) {return w(i);}
  inline vec GMM::get_mean() {return m;}
  inline vec GMM::get_mean(int i) {return m.mid(i*d,d);}
  inline vec GMM::get_covariance() {return sigma;}
  inline vec GMM::get_covariance(int i) {return sigma.mid(i*d,d);}

  GMM gmmtrain(Array<vec> &TrainingData, int M, int NOITER=30, bool VERBOSE=true);

} // namespace itpp

#endif // __gmm_h


syntax highlighted by Code2HTML, v. 0.9.1