content: /* ----------------------------------------------------------------- */
  /*           The HMM-Based Speech Synthesis Engine "hts_engine API"  */
  /*           developed by HTS Working Group                          */
  /*           http://hts-engine.sourceforge.net/                      */
  /* ----------------------------------------------------------------- */
  /*                                                                   */
  /*  Copyright (c) 2001-2010  Nagoya Institute of Technology          */
  /*                           Department of Computer Science          */
  /*                                                                   */
  /*                2001-2008  Tokyo Institute of Technology           */
  /*                           Interdisciplinary Graduate School of    */
  /*                           Science and Engineering                 */
  /*                                                                   */
  /* All rights reserved.                                              */
  /*                                                                   */
  /* Redistribution and use in source and binary forms, with or        */
  /* without modification, are permitted provided that the following   */
  /* conditions are met:                                               */
  /*                                                                   */
  /* - Redistributions of source code must retain the above copyright  */
  /*   notice, this list of conditions and the following disclaimer.   */
  /* - Redistributions in binary form must reproduce the above         */
  /*   copyright notice, this list of conditions and the following     */
  /*   disclaimer in the documentation and/or other materials provided */
  /*   with the distribution.                                          */
  /* - Neither the name of the HTS working group nor the names of its  */
  /*   contributors may be used to endorse or promote products derived */
  /*   from this software without specific prior written permission.   */
  /*                                                                   */
  /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND            */
  /* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,       */
  /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF          */
  /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          */
  /* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS */
  /* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,          */
  /* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED   */
  /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     */
  /* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON */
  /* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,   */
  /* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    */
  /* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE           */
  /* POSSIBILITY OF SUCH DAMAGE.                                       */
  /* ----------------------------------------------------------------- */
  /**
   * Copyright 2011 DFKI GmbH.
   * All Rights Reserved.  Use is subject to license terms.
   * <p/>
   * This file is part of MARY TTS.
   * <p/>
   * MARY TTS is free software: you can redistribute it and/or modify
   * it under the terms of the GNU Lesser General Public License as published by
   * the Free Software Foundation, version 3 of the License.
   * <p/>
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU Lesser General Public License for more details.
   * <p/>
   * You should have received a copy of the GNU Lesser General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  
  
  package marytts.htsengine;
  
  import java.util.Arrays;
  
  import marytts.htsengine.HMMData.FeatureType;
  
  /**
   * HMM model for a particular phone (or line in context feature file)
   * This model is the unit when building a utterance model sequence.
   * For every phone (or line)in the context feature file, one of these
   * models is created.
   * <p/>
   * Java port and extension of HTS engine API version 1.04
   * Extension: mixed excitation
   *
   * @author Marcela Charfuelan
   */
  public class HTSModel {
  
      //private String name;              /* the name of this HMM, it includes ph(-2)^ph(-1)-ph(0)+ph(1)=ph(2) + context features */
      private String phoneName;         /* the name of the phone corresponding to this model, ph(0) in name */
  
      private double durError;
      private int dur[];                /* duration for each state of this HMM */
      private int totalDur;             /* total duration of this HMM in frames */
      private int totalDurMillisec;     /* total duration of this model in milliseconds */
      private double lf0Mean[][];       /* mean vector of log f0 pdfs for each state of this HMM */
      private double lf0Variance[][];   /* variance (diag) elements of log f0 for each state of this HMM */
      private double mcepMean[][];      /* mean vector of mel-cepstrum pdfs for each state of this HMM */
      private double mcepVariance[][];  /* variance (diag) elements of mel-cepstrum for each state of this HMM */
  
      private double strMean[][];       /* mean vector of strengths pdfs for each state of this HMM */
      private double strVariance[][];   /* variance (diag) elements of strengths for each state of this HMM */
      private double magMean[][];       /* mean vector of fourier magnitude pdfs for each state of this HMM */
      private double magVariance[][];   /* variance (diag) elements of fourier magnitudes for each state of this HMM */
  
      private boolean voiced[];         /* voiced/unvoiced decision for each state of this HMM */
  
      private String maryXmlDur;        /* duration in maryXML input acoustparams, format d="val" in millisec. */
      private String maryXmlF0;         /* F0 values in maryXML input acoustparams, format f0="(1,val1)...(100,val2)" (%pos in total duration, f0 Hz)*/
  
      private boolean gvSwitch;         /* GV switch, applies to all the states of this model */
  
  
      /* Constructor */
    /* Every Model is initialised with the information in ModelSet*/
      public HTSModel(int nstate) {
          int i;
          totalDur = 0;
          dur = new int[nstate];
          lf0Mean = new double[nstate][];
          lf0Variance = new double[nstate][];
          voiced = new boolean[nstate];
  
          mcepMean = new double[nstate][];
          mcepVariance = new double[nstate][];
  
          strMean = new double[nstate][];
          strVariance = new double[nstate][];
  
          magMean = new double[nstate][];
          magVariance = new double[nstate][];
  
          maryXmlDur = null;
          maryXmlF0 = null;
  
          gvSwitch = true;
  
      } /* method Model, initialise a Model object */
  
      public String getPhoneName() {
          return phoneName;
      }
  
      public void setPhoneName(String var) {
          phoneName = var;
      }
  
      public void setDur(int i, int val) {
          dur[i] = val;
      }
  
      public int getDur(int i) {
          return dur[i];
      }
  
      public double getDurError() {
          return durError;
      }
  
      public void setDurError(double e) {
          durError = e;
      }
  
      public int getTotalDur() {
          return totalDur;
      }
  
      public void setTotalDur(int val) {
          totalDur = val;
      }
  
      public void incrTotalDur(int val) {
          totalDur += val;
      }
  
      public int getTotalDurMillisec() {
          return totalDurMillisec;
      }
  
      public void setTotalDurMillisec(int val) {
          totalDurMillisec = val;
      }
  
      public void setLf0Mean(int i, int j, double val) {
          lf0Mean[i][j] = val;
      }
  
      public double getLf0Mean(int i, int j) {
          return lf0Mean[i][j];
      }
  
      public void setLf0Variance(int i, int j, double val) {
          lf0Variance[i][j] = val;
      }
  
      public double getLf0Variance(int i, int j) {
          return lf0Variance[i][j];
      }
  
      // set the vector per state
      public void setLf0Mean(int i, double val[]) {
          lf0Mean[i] = val;
      }
  
      public void setLf0Variance(int i, double val[]) {
          lf0Variance[i] = val;
      }
  
      public void setMcepMean(int i, int j, double val) {
          mcepMean[i][j] = val;
      }
  
      public double getMcepMean(int i, int j) {
          return mcepMean[i][j];
      }
  
      public void setMcepVariance(int i, int j, double val) {
          mcepVariance[i][j] = val;
      }
  
      public double getMcepVariance(int i, int j) {
          return mcepVariance[i][j];
      }
  
      // set the vector per state
      public void setMcepMean(int i, double val[]) {
          mcepMean[i] = val;
      }
  
      public void setMcepVariance(int i, double val[]) {
          mcepVariance[i] = val;
      }
  
      public double[] getMean(FeatureType type, int i) {
          switch (type) {
              case MGC:
                  return Arrays.copyOf(mcepMean[i], mcepMean[i].length);
              case STR:
                  return Arrays.copyOf(strMean[i], strMean[i].length);
              case MAG:
                  return Arrays.copyOf(magMean[i], magMean[i].length);
              case LF0:
                  return Arrays.copyOf(lf0Mean[i], lf0Mean[i].length);
              default:
                  throw new RuntimeException("You must not ask me about DUR");
          }
      }
  
      public double[] getVariance(FeatureType type, int i) {
          switch (type) {
              case MGC:
                  return Arrays.copyOf(mcepVariance[i], mcepVariance[i].length);
              case STR:
                  return Arrays.copyOf(strVariance[i], strVariance[i].length);
              case MAG:
                  return Arrays.copyOf(magVariance[i], magVariance[i].length);
              case LF0:
                  return Arrays.copyOf(lf0Variance[i], lf0Variance[i].length);
              default:
                  throw new RuntimeException("You must not ask me about DUR");
          }
      }
  
      /**
       * Print mean and variance of each state
       */
      public void printMcepMean() {
          printVectors(mcepMean, mcepVariance);
      }
  
      /**
       * Print mean and variance of each state
       */
      public void printLf0Mean() {
          printVectors(lf0Mean, lf0Variance);
      }
  
      /**
       * Print mean and variance vectors
       */
      public void printVectors(double m[][], double v[][]) {
          for (int i = 0; i < v.length; i++) {
              System.out.print("  mean[" + i + "]: ");
              for (int j = 0; j < m[i].length; j++)
                  System.out.format("%.6f ", m[i][j]);
              System.out.print("\n  vari[" + i + "]: ");
              for (int j = 0; j < v[i].length; j++)
                  System.out.format("%.6f ", v[i][j]);
              System.out.println();
          }
      }
  
      public void printDuration(int numStates) {
          System.out.print("phoneName: " + phoneName + "\t");
          for (int i = 0; i < numStates; i++)
              System.out.print("dur[" + i + "]=" + dur[i] + " ");
          System.out.println("  totalDur=" + totalDur + "  totalDurMillisec=" + totalDurMillisec);
      }
  
      /**
       * NOT USED -- remove?
       * public String getShortPhoneName(){
       * String aux;
       * int l,r;
       * l = name.indexOf("-");
       * r = name.indexOf("+");
       * aux = name.substring(l+1, r);
       * <p/>
       * return aux;
       * <p/>
       * }
       */
  
      public void setStrMean(int i, int j, double val) {
          strMean[i][j] = val;
      }
  
      public double getStrMean(int i, int j) {
          return strMean[i][j];
      }
  
      public void setStrVariance(int i, int j, double val) {
          strVariance[i][j] = val;
      }
  
      public double getStrVariance(int i, int j) {
          return strVariance[i][j];
      }
  
      // set the vector per state
      public void setStrMean(int i, double val[]) {
          strMean[i] = val;
      }
  
      public void setStrVariance(int i, double val[]) {
          strVariance[i] = val;
      }
  
      public void setMagMean(int i, int j, double val) {
          magMean[i][j] = val;
      }
  
      public double getMagMean(int i, int j) {
          return magMean[i][j];
      }
  
      public void setMagVariance(int i, int j, double val) {
          magVariance[i][j] = val;
      }
  
      public double getMagVariance(int i, int j) {
          return magVariance[i][j];
      }
  
      // set the vector per state
      public void setMagMean(int i, double val[]) {
          magMean[i] = val;
      }
  
      public void setMagVariance(int i, double val[]) {
          magVariance[i] = val;
      }
  
      public void setVoiced(int i, boolean val) {
          voiced[i] = val;
      }
  
      /**
       * whether state i is voiced or not
       */
      public boolean getVoiced(int i) {
          return voiced[i];
      }
  
      public int getNumVoiced() {
          int numVoiced = 0;
          for (int i = 0; i < voiced.length; i++) {
              if (getVoiced(i))
                  numVoiced += getDur(i);
          }
          return numVoiced;
      }
  
      public String getMaryXmlDur() {
          return maryXmlDur;
      }
  
      public void setMaryXmlDur(String str) {
          maryXmlDur = str;
      }
  
      public String getMaryXmlF0() {
          return maryXmlF0;
      }
  
      public void setMaryXmlF0(String str) {
          maryXmlF0 = str;
      }
  
      public boolean getGvSwitch() {
          return gvSwitch;
      }
  
      public void setGvSwitch(boolean bv) {
          gvSwitch = bv;
      }
  
      @Override
      public String toString() {
          return getPhoneName();
      }
  
  } /* class Model */
  