/* FILE: netw_dump.cpp * DATE MODIFIED: 31-Aug-07 * DESCRIPTION: Part of the SREC graph compiler project source files. * * Copyright 2007, 2008 Nuance Communciations, Inc. * * * * Licensed under the Apache License, Version 2.0 (the 'License'); * * you may not use this file except in compliance with the License. * * * * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an 'AS IS' BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * *---------------------------------------------------------------------------*/ #include <fstream> #include <iostream> #include <sstream> #include <string> #include "netw_arc.h" #include "sub_grph.h" #include "grxmldoc.h" void SubGraph::RemapForSortedOutput ( GRXMLDoc &p_Doc ) { int origIndex, sortedIndex; for (int ii= 0; ii < numArc; ii++) { origIndex= arc[ii]->GetInput(); if (origIndex >= 0 && p_Doc.findSortedLabelIndex (origIndex, sortedIndex )) arc[ii]->AssignInput (sortedIndex); } return; } void SubGraph::WriteForwardGraphFile( std::string & fileName, GRXMLDoc &p_Doc ) { // Creates file of forward graph - the {name}.G.txt file int loc; std::string inLabel; std::ofstream outfile; std::string label; std::string separator = "\t"; std::string Eps = "eps"; RemapForSortedOutput (p_Doc); SortLanguageForMin (); p_Doc.sortLabels(); outfile.open ( fileName.c_str() ); for (int ii= 0; ii < numArc; ii++) { inLabel=""; loc = forwardList[ii]; switch ( arc[loc]->inputLabel ) { case TERMINAL_LABEL: // Terminal transition outfile << arc[loc]->fromId << std::endl; break; case NONE_LABEL: // Null transition outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << std::endl; break; case TAG_LABEL: // Tag transition case WB_LABEL: // Word boundary transition case BEGINSCOPE_LABEL: // Start of scope case ENDSCOPE_LABEL: // End of scope case BEGINRULE_LABEL: // Start of rule case ENDRULE_LABEL: // End of rule case DISCARD_LABEL: // Discard (internal) break; default: { // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) { if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) { std::stringstream ss; ss << arc[loc]->inputLabel; inLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << inLabel.c_str() << std::endl; } break; } // switch } outfile.close(); SortLanguage (); return; } void SubGraph::WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc ) { int loc; std::string inLabel, outLabel; std::string tag; std::string Eps = "eps"; std::string OpenBrace = "{"; std::string CloseBrace = "}"; std::string Separator ="\t"; std::ofstream outfile; std::string label; std::string separator = "\t"; outfile.open ( fileName.c_str() ); RemapForSortedOutput (p_Doc); SortLanguageForMin (); p_Doc.sortLabels(); for ( int ii= 0; ii < numArc; ii++ ) { loc= forwardList[ii]; inLabel = ""; switch ( arc[loc]->inputLabel ) { case BEGINRULE_LABEL: // Start of rule inLabel = Eps; outLabel = OpenBrace; break; case ENDRULE_LABEL: // End of rule { inLabel = Eps; if (!p_Doc.findRule( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = "(" + ss.str() + ")"; } outLabel = outLabel + CloseBrace; } break; case NONE_LABEL: // Null transition inLabel = Eps; outLabel= Eps; break; case TAG_LABEL: // Tag transition inLabel = Eps; { std::stringstream ss; ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel; outLabel = ss.str(); } break; case TERMINAL_LABEL: // Terminal transition outLabel = ""; break; case WB_LABEL: // Word boundary transition case BEGINSCOPE_LABEL: // Start of scope case ENDSCOPE_LABEL: // End of scope case DISCARD_LABEL: // Discard (internal) break; default: // Input label // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) { if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) { inLabel = arc[loc]->inputLabel; } // Output label if (arc[loc]->outputLabel == -1) outLabel= Eps; else { std::stringstream ss; ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel; outLabel = ss.str(); } break; } if ( outLabel.empty() ) outfile << arc[loc]->fromId << std::endl; else { outfile << arc[loc]->fromId << Separator << arc[loc]->toId << Separator << inLabel.c_str() << Separator << outLabel.c_str() << std::endl; p_Doc.addOLabelToOList( outLabel); } } outfile.close(); return; } void SubGraph::WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc ) { // Creates file of forward graph - the {name}.G.txt file int loc; std::string inLabel; std::string outLabel; std::string phLabel; std::string metaname; std::string wtw; std::ofstream outfile; std::string label; std::string separator = "\t"; std::string Eps = "eps"; std::string Pau = "-pau-"; std::string Pau2 = "-pau2-"; bool bRes; metaname = "word_penalty"; bRes = p_Doc.findMeta(metaname, wtw); outfile.open ( fileName.c_str() ); for (int ii= 0; ii < numArc; ii++) { inLabel=""; loc = forwardList[ii]; switch ( arc[loc]->inputLabel ) { case TERMINAL_LABEL: // Terminal transition outfile << arc[loc]->fromId << std::endl; break; case NONE_LABEL: // Null transition if (arc[loc]->outputLabel >= 0) { if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << outLabel.c_str() << std::endl; } else outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << Eps << std::endl; break; case WB_LABEL: // Word boundary transition if (arc[loc]->outputLabel >= 0) { if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << outLabel.c_str() << std::endl; } else outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << Eps << std::endl; break; case TAG_LABEL: // Tag transition case BEGINSCOPE_LABEL: // Start of scope case ENDSCOPE_LABEL: // End of scope case BEGINRULE_LABEL: // Start of rule case ENDRULE_LABEL: // End of rule case DISCARD_LABEL: // Discard (internal) break; default: { if (arc[loc]->outputLabel >= 0) { if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = ss.str(); } } else if (arc[loc]->outputLabel == INITIAL_LABEL) outLabel= Pau; else if (arc[loc]->outputLabel == FINAL_LABEL) outLabel= Pau2; else outLabel= Eps; } break; } // switch } outfile.close(); return; } void SubGraph::WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc ) { // Creates file of forward graph - the {name}.G.txt file int loc; std::string inLabel; std::string outLabel; std::ofstream outfile; std::string label; std::string separator = "\t"; std::string Eps = "eps"; outfile.open ( fileName.c_str() ); for (int ii= 0; ii < numArc; ii++) { inLabel=""; loc = forwardList[ii]; switch ( arc[loc]->inputLabel ) { case TERMINAL_LABEL: // Terminal transition outfile << arc[loc]->fromId << std::endl; break; case NONE_LABEL: // Null transition if (arc[loc]->outputLabel >= 0) { if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << outLabel.c_str() << std::endl; } else outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << separator << Eps << std::endl; break; case WB_LABEL: // Word boundary transition if (arc[loc]->outputLabel >= 0) { if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) { std::stringstream ss; ss << arc[loc]->outputLabel; outLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << outLabel.c_str() << std::endl; } else outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << ".wb" << separator << Eps << std::endl; break; case TAG_LABEL: // Tag transition case BEGINSCOPE_LABEL: // Start of scope case ENDSCOPE_LABEL: // End of scope case BEGINRULE_LABEL: // Start of rule case ENDRULE_LABEL: // End of rule case DISCARD_LABEL: // Discard (internal) break; default: if ( arc[loc]->inputLabel >= 0) { } else { // Note negative index if (!p_Doc.findLabel( -arc[loc]->inputLabel, inLabel ) ) { std::stringstream ss; ss << arc[loc]->inputLabel; inLabel = ss.str(); } outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << inLabel.c_str() << separator << Eps << std::endl; } break; } // switch } outfile.close(); return; } void SubGraph::PrintWithLabels( GRXMLDoc &p_Doc ) { int loc; std::string inLabel, outLabel; std::string label; printf ("Graph %s (%d %d)\n", title, startId, lastId); for (int ii= 0; ii < numArc; ii++) { loc= forwardList[ii]; if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) { inLabel = arc[loc]->inputLabel; //std::stringstream ss; //ss << arc[loc]->inputLabel; //inLabel = ss.str(); } if (!p_Doc.findTag( arc[loc]->outputLabel, outLabel ) ) { outLabel = arc[loc]->outputLabel; //std::stringstream ss; //ss << arc[loc]->outputLabel; //outLabel = ss.str(); } std::cout << arc[loc]->fromId <<" " << arc[loc]->toId << " " << inLabel.c_str() <<" " << outLabel.c_str() << std::endl; } return; } void NUANArc::Dump(GRXMLDoc &p_Doc ) { // I need a handle to the grxml doc object in order to access labels printf ("%d %d %d %d\n", fromId, toId, inputLabel, outputLabel); return; }