/// <summary>
        /// Append adaptation mapping file.
        /// </summary>
        /// <param name="filePath">The given file name.</param>
        public void Append(string filePath)
        {
            Helper.ThrowIfFileNotExist(filePath);

            using (StreamReader sr = new StreamReader(filePath))
            {
                string line = null;
                while ((line = sr.ReadLine()) != null)
                {
                    AdaptationMapping oneMapping = new AdaptationMapping();

                    string[] items = line.Split(new char[] { '\t', ' ' });
                    AdaptationTransformType type = (AdaptationTransformType)Enum.Parse(typeof(AdaptationTransformType), items[0], true);
                    int transformNum = int.Parse(items[1]);
                    
                    for (int i = 0; i < transformNum; ++i)
                    {
                        line = sr.ReadLine();
                        items = line.Split(new char[] { '\t', ' ' });

                        Collection<string> modelCollection = new Collection<string>();
                        int transformIndex = int.Parse(items[0]);
                        int modelNum = int.Parse(items[1]);
                        for (int j = 0; j < modelNum; ++j)
                        {
                            modelCollection.Add(items[j + 2]);
                        }

                        oneMapping.Transform2ModelMapping.Add(transformIndex, modelCollection);
                    }

                    _adaptationMappings.Add(type, oneMapping);
                }
            }
        }
        /// <summary>
        /// Creates mapping relationship between transform matrix and shared streams.
        /// </summary>
        /// <param name="mmfFile">The HMM model file, including unseen model.</param>
        /// <param name="regressionBaseFile">The regression base class definition file.</param>
        /// <param name="xformFile">The transform matrix file.</param>
        /// <returns>The mapping relationship between transform matrix and shared streams.</returns>
        public static AdaptationMapping CreateXformStreamMapping(string mmfFile, string regressionBaseFile, string xformFile)
        {
            Dictionary<string, string[,]> hmmStateMapping = HmmReader.GetHmmAndStateMapping(mmfFile);

            HtsRegressionBaseFile baseClassFile = new HtsRegressionBaseFile();
            baseClassFile.Load(regressionBaseFile);

            HtsTransformFile transformFile = new HtsTransformFile();
            transformFile.Load(xformFile);

            AdaptationMapping adaptationMapping = new AdaptationMapping();
            foreach (KeyValuePair<int, Collection<int>> pair in transformFile.MeanFormMapping)
            {
                int xFormIndex = pair.Key;
                Debug.Assert(!adaptationMapping.Transform2ModelMapping.ContainsKey(xFormIndex));
                adaptationMapping.Transform2ModelMapping.Add(xFormIndex, new Collection<string>());

                foreach (int baseClassIndex in pair.Value)
                {
                    foreach (var baseItem in baseClassFile.ClassDef[baseClassIndex])
                    {
                        string[,] streamList = hmmStateMapping[baseItem.Name];
                        string streamName = streamList[0, 0]; // for duration model
                        if (baseItem.StreamIndex > 0)
                        {
                            streamName = streamList[baseItem.StateIndex - 2, baseItem.StreamIndex - 1];
                        }

                        if (!adaptationMapping.Transform2ModelMapping[xFormIndex].Contains(streamName))
                        {
                            adaptationMapping.Transform2ModelMapping[xFormIndex].Add(streamName);
                        }
                    }
                }
            }

            return adaptationMapping;
        }