| /* 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; |
| } |
| |
| |
| |