// Copyright (C) 2001 Jean-Marc Valin

#include "BufferedNode.h"
#include "Buffer.h"
#include "Vector.h"
#include "gmm.h"

using namespace std;

namespace FD {

class AdaptMAP;

DECLARE_NODE(AdaptMAP)
/*Node
 *
 * @name AdaptMAP
 * @category HMM
 * @require GMM
 * @description Performs MAP adaptation (well, almost!)
 *
 * @input_name FRAMES
 * @input_type Vector<float>
 * @input_description Frame buffer
 *
 * @input_name GMM
 * @input_type GMM
 * @input_description GMM to be adapted
 *
 * @output_name OUTPUT
 * @output_type GMM
 * @output_description Adapted GMM
 *
END*/


class AdaptMAP : public BufferedNode {
   
   int framesID;
   int gmmID;
   int outputID;

public:
   AdaptMAP(string nodeName, ParameterSet params)
   : BufferedNode(nodeName, params)
   {
      framesID = addInput("FRAMES");
      gmmID = addInput("GMM");
      outputID = addOutput("OUTPUT");
   }

   void calculate(int output_id, int count, Buffer &out)
   {
      ObjectRef gmmValue = getInput(gmmID, count);

      ObjectRef framesValue = getInput(framesID, count);


      Vector<ObjectRef>  &mat = object_cast<Vector<ObjectRef> > (framesValue);
      
      GMM &gmm = object_cast<GMM> (gmmValue);
      vector <float *> data(mat.size());
      for (int i=0;i<mat.size();i++)
	 data[i]= &object_cast <Vector<float> > (mat[i])[0];

      gmm.adaptMAP(data,&gmm);
	 
      out[count] = gmmValue;

      
   }

      
};

}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1