// file: $isip/class/stat/GaussianModel/gaus_04.cc
// version: $Id: gaus_04.cc 8658 2002-08-28 20:03:59Z alphonso $
//

// isip include files
//
#include "GaussianModel.h"

// method: writeAccumulator
//
// arguments:
//  Sof& sof: (input) sof file object
//  long tag: (input) sof object instance tag
//  const String& name: (input) sof object instance name
//
// return: boolean value indicating status
//
// this method has the object write accumulators to an Sof file
//
boolean GaussianModel::writeAccumulator(Sof& sof_a, long tag_a,
				  const String& name_a) const {

  long obj_size = 0;
  
  // write the instance of the object into the Sof file
  //
  if (sof_a.isText()) {

    // set the size to by dynamic
    //
    obj_size = Sof::ANY_SIZE;
  }
  else {

    // the size index and the size of each element
    //
    obj_size = access_accum_d.sofSize() + occ_accum_d.sofSize() +
      mean_accum_d.sofSize() + covar_accum_d.sofSize();
  }

  // write the object into the sof file's index
  //
  if (!sof_a.put(name_a, tag_a, obj_size)) {
    return false;
  }

  // exit gracefully
  //
  return writeAccumulatorData(sof_a);
}

// method: writeAccumulatorData
//
// arguments:
//  Sof& sof: (input) sof file object
//  const String& pname: (input) parameter name
//
// return: boolean value indicating status
//
// this method has the object write itself to an Sof file. it assumes
// that the Sof file is already positioned correctly.
//
boolean GaussianModel::writeAccumulatorData(Sof& sof_a, const String& pname_a) const {
  
  // write a start string if necessary
  //
  sof_a.writeLabelPrefix(pname_a);
    
  // put the access count accumulator
  //
  access_accum_d.writeData(sof_a, PARAM_ACCESS_ACCUM);
  
  // put the occupancy accumulator
  //
  occ_accum_d.writeData(sof_a, PARAM_OCCUPANCY_ACCUM);

  // put the mean accumulator
  //
  mean_accum_d.writeData(sof_a, PARAM_MEAN_ACCUM);

  // put the covariance accumulator
  //
  covar_accum_d.writeData(sof_a, PARAM_COVARIANCE_ACCUM);
  
  // put an end string if necessary
  //
  sof_a.writeLabelSuffix(pname_a);
  
  // exit gracefully
  //
  return true;
}

// method: writeOccupancies
//
// arguments:
//  Sof& sof: (input) sof file object
//  long tag: (input) sof object instance tag
//  const String& name: (input) sof object instance name
//
// return: boolean value indicating status
//
// this method has the object write occupanciess to an Sof file
//
boolean GaussianModel::writeOccupancies(Sof& sof_a, long tag_a,
				  const String& name_a) const {

  long obj_size = 0;
  
  // write the instance of the object into the Sof file
  //
  if (sof_a.isText()) {

    // set the size to by dynamic
    //
    obj_size = Sof::ANY_SIZE;
  }
  else {

    // the size index and the size of each element
    //
    obj_size = occ_accum_d.sofSize();
  }

  // write the object into the sof file's index
  //
  if (!sof_a.put(name_a, tag_a, obj_size)) {
    return false;
  }

  // exit gracefully
  //
  return writeOccupanciesData(sof_a);
}

// method: writeOccupanciesData
//
// arguments:
//  Sof& sof: (input) sof file object
//  const String& pname: (input) parameter name
//
// return: boolean value indicating status
//
// this method has the object write itself to an Sof file. it assumes
// that the Sof file is already positioned correctly.
//
boolean GaussianModel::writeOccupanciesData(Sof& sof_a, const String& pname_a) const {
  
  // write a start string if necessary
  //
  sof_a.writeLabelPrefix(pname_a);
    
  // put the occupancy accumulator
  //
  occ_accum_d.writeData(sof_a, PARAM_OCCUPANCY_ACCUM);
  
  // put an end string if necessary
  //
  sof_a.writeLabelSuffix(pname_a);
  
  // exit gracefully
  //
  return true;
}

// method: write
//
// arguments:
//  Sof& sof: (input) sof file object
//  long tag: (input) sof object instance tag
//  const String& name: (input) sof object instance name
//
// return: boolean value indicating status
//
// this method has the object write itself to an Sof file
//
boolean GaussianModel::write(Sof& sof_a, long tag_a,
			     const String& name_a) const {

  long obj_size = 0;
  
  // write the instance of the object into the Sof file
  //
  if (sof_a.isText()) {

    // set the size to by dynamic
    //
    obj_size = Sof::ANY_SIZE;
  }
  else {

    // the size index and the size of each element
    //
    obj_size = sofSize();
  }

  // write the object into the sof file's index
  //
  if (!sof_a.put(name_a, tag_a, obj_size)) {
    return false;
  }
  
  // exit gracefully
  //
  return writeData(sof_a);
}

// method: writeData
//
// arguments:
//  Sof& sof: (input) sof file object
//  const String& pname: (input) parameter name
//
// return: boolean value indicating status
//
// this method has the object write itself to an Sof file. it assumes
// that the Sof file is already positioned correctly.
//
boolean GaussianModel::writeData(Sof& sof_a, const String& pname_a) const {
  
  // write a start string if necessary
  //
  sof_a.writeLabelPrefix(pname_a);

  // write the vector of means
  //
  mean_d.writeData(sof_a, PARAM_MEAN);

  // write the covariance matrix
  //
  if ((mode_d == NONE) || (!is_valid_d)) {
    covariance_d.writeData(sof_a, PARAM_COVARIANCE);
  }
  else {
    MatrixFloat tmp_cov(covariance_d);
    tmp_cov.inverse();
    tmp_cov.writeData(sof_a, PARAM_COVARIANCE);
  }

  // put an end string if necessary
  //
  sof_a.writeLabelSuffix(pname_a);
  
  // exit gracefully
  //
  return true;
}






