// Copyright (C) 1998-1999 Jean-Marc Valin

#include "gaussian_set.h"
#include "ObjectParser.h"

using namespace std;

namespace FD {

DECLARE_TYPE(GaussianSet)
//@implements GMM

int GaussianSet::getIDFor(RCPtr<Gaussian> cov)
{
   for (int i=0;i<nb_gaussians;i++)
   {
      if (cov.get()==gaussians[i].get())
         return i;
   }
   nb_gaussians++;
   gaussians.resize(nb_gaussians);
   gaussians[nb_gaussians-1]=cov;
   return nb_gaussians-1;
}

RCPtr<Gaussian> GaussianSet::getPtrFor(int id) const
{
   if (id>=nb_gaussians)
      throw new GeneralException("Invalid gaussian ID", __FILE__, __LINE__);
   return gaussians[id];
}

void GaussianSet::toIDs(MeanSet & means, CovarianceSet & covariances)
{
   for (int i=0;i<nb_gaussians;i++)
   {
      gaussians[i]->toIDsUsing(means, covariances);
   }
}

void GaussianSet::toPtrs(const MeanSet & means, const CovarianceSet & covariances) const
{
   for (int i=0;i<nb_gaussians;i++)
   {
      gaussians[i]->toPtrsUsing(means, covariances);
   }
}

void GaussianSet::printOn(ostream &out) const
{
   out << "<GaussianSet " << endl;
   out << "<gaussians " << gaussians << ">" << endl;
   out << "<nb_gaussians " << nb_gaussians << ">" << endl;
   out << ">\n";
}

void GaussianSet::readFrom (istream &in)
{
   string tag;

   while (1)
   {
      char ch;
      in >> ch;
      if (ch == '>') break;
      else if (ch != '<') 
       throw new ParsingException ("GaussianSet::readFrom : Parse error: '<' expected");
      in >> tag;
      if (tag == "gaussians")
      {
         in >> gaussians;
      } else if (tag == "nb_gaussians")
         in >> nb_gaussians;
      else
         throw new ParsingException ("GaussianSet::readFrom : unknown argument: " + tag);

      if (!in) throw new ParsingException ("GaussianSet::readFrom : Parse error trying to build " + tag);

      in >> tag;
      if (tag != ">") 
         throw new ParsingException ("GaussianSet::readFrom : Parse error: '>' expected ");
   }
}

istream &operator >> (istream &in, GaussianSet &cov)
{
   if (!isValidType(in, "GaussianSet")) return in;
   cov.readFrom(in);
   return in;
}

}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1