14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* FILE:		netw_dump.cpp
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  DATE MODIFIED:	31-Aug-07
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <fstream>
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <iostream>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sstream>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "netw_arc.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sub_grph.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "grxmldoc.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemapForSortedOutput ( GRXMLDoc &p_Doc )
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int origIndex, sortedIndex;
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (int ii= 0; ii < numArc; ii++) {
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	origIndex= arc[ii]->GetInput();
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (origIndex >= 0 && p_Doc.findSortedLabelIndex (origIndex, sortedIndex ))
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    arc[ii]->AssignInput (sortedIndex);
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::WriteForwardGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Creates file of forward graph  - the {name}.G.txt file
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int loc;
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string inLabel;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::ofstream outfile;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string separator = "\t";
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Eps = "eps";
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    RemapForSortedOutput (p_Doc);
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SortLanguageForMin ();
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_Doc.sortLabels();
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (int ii= 0; ii < numArc; ii++) {
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	inLabel="";
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        loc = forwardList[ii];
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( arc[loc]->inputLabel ) {
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TERMINAL_LABEL:    //  Terminal transition
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outfile << arc[loc]->fromId << std::endl;
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NONE_LABEL:        //  Null transition
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << std::endl;
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TAG_LABEL:         //  Tag transition
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case WB_LABEL:          //  Word boundary transition
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINSCOPE_LABEL:  //  Start of scope
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDSCOPE_LABEL:    //  End of scope
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINRULE_LABEL:   //  Start of rule
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDRULE_LABEL:     //  End of rule
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case DISCARD_LABEL:     //  Discard (internal)
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    default:
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->inputLabel;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			inLabel = ss.str();
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << std::endl;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} // switch
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.close();
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SortLanguage ();
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc )
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int loc;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string inLabel, outLabel;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string tag;
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Eps = "eps";
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string OpenBrace = "{";
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string CloseBrace = "}";
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Separator ="\t";
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::ofstream outfile;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string separator = "\t";
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    RemapForSortedOutput (p_Doc);
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SortLanguageForMin ();
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_Doc.sortLabels();
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for ( int ii= 0; ii < numArc; ii++ ) {
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        loc= forwardList[ii];
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	inLabel = "";
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( arc[loc]->inputLabel ) {
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINRULE_LABEL:   //  Start of rule
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		inLabel = Eps;
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outLabel = OpenBrace;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDRULE_LABEL:     //  End of rule
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    inLabel = Eps;
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findRule( arc[loc]->outputLabel, outLabel ) ) {
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->outputLabel;
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel = "(" + ss.str() + ")";
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outLabel = outLabel + CloseBrace;
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NONE_LABEL:        //  Null transition
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		inLabel = Eps;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                outLabel= Eps;
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                break;
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TAG_LABEL:         //  Tag transition
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		inLabel = Eps;
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                {
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    std::stringstream ss;
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outLabel = ss.str();
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                break;
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TERMINAL_LABEL:    //  Terminal transition
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outLabel = "";
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case WB_LABEL:          //  Word boundary transition
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINSCOPE_LABEL:  //  Start of scope
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDSCOPE_LABEL:    //  End of scope
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case DISCARD_LABEL:     //  Discard (internal)
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    default:
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                //  Input label
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		// if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    inLabel = arc[loc]->inputLabel;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                //  Output label
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                if (arc[loc]->outputLabel == -1)
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                    outLabel= Eps;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                else {
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    std::stringstream ss;
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outLabel = ss.str();
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( outLabel.empty() )
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    outfile << arc[loc]->fromId << std::endl;
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else {
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    outfile << arc[loc]->fromId << Separator << arc[loc]->toId  << Separator << inLabel.c_str() << Separator << outLabel.c_str()  << std::endl;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    p_Doc.addOLabelToOList( outLabel);
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.close();
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Creates file of forward graph  - the {name}.G.txt file
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int loc;
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string inLabel;
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string outLabel;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string phLabel;
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string metaname;
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string wtw;
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::ofstream outfile;
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string separator = "\t";
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Eps = "eps";
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Pau = "-pau-";
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Pau2 = "-pau2-";
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool bRes;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    metaname = "word_penalty";
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bRes = p_Doc.findMeta(metaname, wtw);
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (int ii= 0; ii < numArc; ii++) {
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	inLabel="";
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        loc = forwardList[ii];
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( arc[loc]->inputLabel ) {
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TERMINAL_LABEL:    //  Terminal transition
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outfile << arc[loc]->fromId << std::endl;
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NONE_LABEL:        //  Null transition
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if (arc[loc]->outputLabel >= 0) {
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->outputLabel;
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel = ss.str();
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case WB_LABEL:          //  Word boundary transition
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if (arc[loc]->outputLabel >= 0) {
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->outputLabel;
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel = ss.str();
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TAG_LABEL:         //  Tag transition
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINSCOPE_LABEL:  //  Start of scope
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDSCOPE_LABEL:    //  End of scope
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINRULE_LABEL:   //  Start of rule
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDRULE_LABEL:     //  End of rule
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case DISCARD_LABEL:     //  Discard (internal)
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    default:
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                 {
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (arc[loc]->outputLabel >= 0) {
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		        if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			    std::stringstream ss;
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			    ss << arc[loc]->outputLabel;
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			    outLabel = ss.str();
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		        }
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    else if (arc[loc]->outputLabel == INITIAL_LABEL)
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel= Pau;
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    else if (arc[loc]->outputLabel == FINAL_LABEL)
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel= Pau2;
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    else
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		        outLabel= Eps;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} // switch
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.close();
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Creates file of forward graph  - the {name}.G.txt file
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int loc;
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string inLabel;
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string outLabel;
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::ofstream outfile;
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string separator = "\t";
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string Eps = "eps";
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (int ii= 0; ii < numArc; ii++) {
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	inLabel="";
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        loc = forwardList[ii];
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( arc[loc]->inputLabel ) {
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TERMINAL_LABEL:    //  Terminal transition
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		outfile << arc[loc]->fromId << std::endl;
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NONE_LABEL:        //  Null transition
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if (arc[loc]->outputLabel >= 0) {
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->outputLabel;
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel = ss.str();
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case WB_LABEL:          //  Word boundary transition
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if (arc[loc]->outputLabel >= 0) {
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->outputLabel;
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outLabel = ss.str();
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case TAG_LABEL:         //  Tag transition
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINSCOPE_LABEL:  //  Start of scope
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDSCOPE_LABEL:    //  End of scope
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case BEGINRULE_LABEL:   //  Start of rule
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case ENDRULE_LABEL:     //  End of rule
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case DISCARD_LABEL:     //  Discard (internal)
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    default:
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	        if ( arc[loc]->inputLabel >= 0) {
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                else {
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    //  Note negative index
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    if (!p_Doc.findLabel( -arc[loc]->inputLabel, inLabel ) ) {
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::stringstream ss;
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			ss << arc[loc]->inputLabel;
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			inLabel = ss.str();
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    }
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << separator << Eps << std::endl;
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                }
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} // switch
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        outfile.close();
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::PrintWithLabels( GRXMLDoc &p_Doc )
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int loc;
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string inLabel, outLabel;
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf ("Graph %s (%d %d)\n", title, startId, lastId);
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (int ii= 0; ii < numArc; ii++) {
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        loc= forwardList[ii];
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    inLabel = arc[loc]->inputLabel;
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //std::stringstream  ss;
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //ss << arc[loc]->inputLabel;
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //inLabel = ss.str();
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (!p_Doc.findTag( arc[loc]->outputLabel, outLabel ) ) {
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    outLabel = arc[loc]->outputLabel;
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //std::stringstream  ss;
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //ss << arc[loc]->outputLabel;
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    //outLabel = ss.str();
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	std::cout << arc[loc]->fromId <<" " << arc[loc]->toId  << " "  << inLabel.c_str() <<" " << outLabel.c_str()  << std::endl;
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid NUANArc::Dump(GRXMLDoc &p_Doc )
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // I need  a handle to the grxml doc object in order to access labels
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf ("%d %d %d %d\n", fromId, toId, inputLabel, outputLabel);
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
375