//-----------------------------------------------------------------------------
//
//  EM.h++
//
//  Definition of EM Algorithm.
//
//  Tony Jebara (Copyright (C) 1997)
//
//-----------------------------------------------------------------------------

#ifndef ExpectationMaximization_h
#define ExpectationMaximization_h


double kullbackLieblerDivergenceGaussians(int D, double *mu1, double *cov1, double *mu2, double *cov2);

double kullbackLieblerDivergenceInvertedGaussians(int D, double *mu1, double *cov1, double *mu2, double *cov2);

void   allocateGaussianMixtureModelEM (int D, int M, double **mu, double **R, double **scal);

void   freeGaussianMixtureModelEM (int D, int M, double **mu, double **R, double **scal);

void   randomInitGaussianMixtureModelEM (double *current, int N, int D, int M, double *mu, double *R, double *scal);

void   randomInitWeightedGaussianMixtureModelEM (double *current, double *weight, int N, int D, int M, double *mu, double *R, double *scal);

double updateParamsGaussianMixtureModelEM (double *current, int N, int D, int M, double *mu, double *R, double *scal, double *mixo);

double updateParamsGaussianMixtureModelEMANNEALED(double *current, int N, int D, int M, double *mu, double *R, double *scal, double T);

double updateParamsWeightedGaussianMixtureModelEM (double *current, double *weight, int N, int D, int M, double *mu, double *R, double *scal);

double updateParamsWeightedGaussianMixtureModelEMANNEALED (double *current, double *weight, int N, int D, int M, double *mu, double *R, double *scal, double T);


#endif


