1/* FILE:		netw_dump.cpp
2 *  DATE MODIFIED:	31-Aug-07
3 *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
4 *
5 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
6 *                                                                           *
7 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
8 *  you may not use this file except in compliance with the License.         *
9 *                                                                           *
10 *  You may obtain a copy of the License at                                  *
11 *      http://www.apache.org/licenses/LICENSE-2.0                           *
12 *                                                                           *
13 *  Unless required by applicable law or agreed to in writing, software      *
14 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
15 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
16 *  See the License for the specific language governing permissions and      *
17 *  limitations under the License.                                           *
18 *                                                                           *
19 *---------------------------------------------------------------------------*/
20
21#include <fstream>
22#include <iostream>
23#include <sstream>
24
25#include <string>
26
27#include "netw_arc.h"
28#include "sub_grph.h"
29
30#include "grxmldoc.h"
31
32void SubGraph::RemapForSortedOutput ( GRXMLDoc &p_Doc )
33{
34    int origIndex, sortedIndex;
35
36    for (int ii= 0; ii < numArc; ii++) {
37	origIndex= arc[ii]->GetInput();
38	if (origIndex >= 0 && p_Doc.findSortedLabelIndex (origIndex, sortedIndex ))
39	    arc[ii]->AssignInput (sortedIndex);
40    }
41    return;
42}
43
44void SubGraph::WriteForwardGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
45{
46    // Creates file of forward graph  - the {name}.G.txt file
47    int loc;
48    std::string inLabel;
49    std::ofstream outfile;
50    std::string label;
51    std::string separator = "\t";
52    std::string Eps = "eps";
53
54    RemapForSortedOutput (p_Doc);
55    SortLanguageForMin ();
56    p_Doc.sortLabels();
57    outfile.open ( fileName.c_str() );
58    for (int ii= 0; ii < numArc; ii++) {
59	inLabel="";
60        loc = forwardList[ii];
61	switch ( arc[loc]->inputLabel ) {
62	    case TERMINAL_LABEL:    //  Terminal transition
63		outfile << arc[loc]->fromId << std::endl;
64		break;
65	    case NONE_LABEL:        //  Null transition
66		outfile << arc[loc]->fromId << separator << arc[loc]->toId << separator << Eps << std::endl;
67		break;
68	    case TAG_LABEL:         //  Tag transition
69	    case WB_LABEL:          //  Word boundary transition
70	    case BEGINSCOPE_LABEL:  //  Start of scope
71	    case ENDSCOPE_LABEL:    //  End of scope
72	    case BEGINRULE_LABEL:   //  Start of rule
73	    case ENDRULE_LABEL:     //  End of rule
74	    case DISCARD_LABEL:     //  Discard (internal)
75		break;
76	    default:
77		{
78		    // if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
79		    if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
80			std::stringstream ss;
81			ss << arc[loc]->inputLabel;
82			inLabel = ss.str();
83		    }
84		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << std::endl;
85		}
86		break;
87	} // switch
88
89    }
90    outfile.close();
91
92    SortLanguage ();
93    return;
94}
95
96
97void SubGraph::WriteForwardGraphWithSemantic ( std::string & fileName, GRXMLDoc &p_Doc )
98{
99    int loc;
100    std::string inLabel, outLabel;
101    std::string tag;
102    std::string Eps = "eps";
103    std::string OpenBrace = "{";
104    std::string CloseBrace = "}";
105    std::string Separator ="\t";
106
107    std::ofstream outfile;
108    std::string label;
109    std::string separator = "\t";
110    outfile.open ( fileName.c_str() );
111
112    RemapForSortedOutput (p_Doc);
113    SortLanguageForMin ();
114    p_Doc.sortLabels();
115    for ( int ii= 0; ii < numArc; ii++ ) {
116        loc= forwardList[ii];
117	inLabel = "";
118	switch ( arc[loc]->inputLabel ) {
119	    case BEGINRULE_LABEL:   //  Start of rule
120		inLabel = Eps;
121		outLabel = OpenBrace;
122		break;
123	    case ENDRULE_LABEL:     //  End of rule
124		{
125		    inLabel = Eps;
126		    if (!p_Doc.findRule( arc[loc]->outputLabel, outLabel ) ) {
127			std::stringstream ss;
128			ss << arc[loc]->outputLabel;
129			outLabel = "(" + ss.str() + ")";
130		    }
131		    outLabel = outLabel + CloseBrace;
132		}
133		break;
134	    case NONE_LABEL:        //  Null transition
135		inLabel = Eps;
136                outLabel= Eps;
137                break;
138	    case TAG_LABEL:         //  Tag transition
139		inLabel = Eps;
140                {
141		    std::stringstream ss;
142		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
143		    outLabel = ss.str();
144                }
145                break;
146	    case TERMINAL_LABEL:    //  Terminal transition
147		outLabel = "";
148		break;
149	    case WB_LABEL:          //  Word boundary transition
150	    case BEGINSCOPE_LABEL:  //  Start of scope
151	    case ENDSCOPE_LABEL:    //  End of scope
152	    case DISCARD_LABEL:     //  Discard (internal)
153		break;
154	    default:
155                //  Input label
156		// if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
157		if (!p_Doc.findSortedLabel( arc[loc]->inputLabel, inLabel ) ) {
158		    inLabel = arc[loc]->inputLabel;
159		}
160
161                //  Output label
162                if (arc[loc]->outputLabel == -1)
163                    outLabel= Eps;
164                else {
165		    std::stringstream ss;
166		    ss << SCRIPT_LABEL_PREFIX << arc[loc]->outputLabel;
167		    outLabel = ss.str();
168                }
169		break;
170	}
171	if ( outLabel.empty() )
172	    outfile << arc[loc]->fromId << std::endl;
173	else {
174	    outfile << arc[loc]->fromId << Separator << arc[loc]->toId  << Separator << inLabel.c_str() << Separator << outLabel.c_str()  << std::endl;
175	    p_Doc.addOLabelToOList( outLabel);
176	}
177    }
178    outfile.close();
179
180    return;
181}
182
183void SubGraph::WriteHMMGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
184{
185    // Creates file of forward graph  - the {name}.G.txt file
186    int loc;
187    std::string inLabel;
188    std::string outLabel;
189    std::string phLabel;
190    std::string metaname;
191    std::string wtw;
192    std::ofstream outfile;
193    std::string label;
194    std::string separator = "\t";
195    std::string Eps = "eps";
196    std::string Pau = "-pau-";
197    std::string Pau2 = "-pau2-";
198    bool bRes;
199
200    metaname = "word_penalty";
201    bRes = p_Doc.findMeta(metaname, wtw);
202
203    outfile.open ( fileName.c_str() );
204    for (int ii= 0; ii < numArc; ii++) {
205	inLabel="";
206        loc = forwardList[ii];
207	switch ( arc[loc]->inputLabel ) {
208	    case TERMINAL_LABEL:    //  Terminal transition
209		outfile << arc[loc]->fromId << std::endl;
210		break;
211	    case NONE_LABEL:        //  Null transition
212		if (arc[loc]->outputLabel >= 0) {
213		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
214			std::stringstream ss;
215			ss << arc[loc]->outputLabel;
216			outLabel = ss.str();
217		    }
218		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
219		}
220		else
221		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
222		break;
223	    case WB_LABEL:          //  Word boundary transition
224		if (arc[loc]->outputLabel >= 0) {
225		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
226			std::stringstream ss;
227			ss << arc[loc]->outputLabel;
228			outLabel = ss.str();
229		    }
230		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
231		}
232		else
233		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
234		break;
235	    case TAG_LABEL:         //  Tag transition
236	    case BEGINSCOPE_LABEL:  //  Start of scope
237	    case ENDSCOPE_LABEL:    //  End of scope
238	    case BEGINRULE_LABEL:   //  Start of rule
239	    case ENDRULE_LABEL:     //  End of rule
240	    case DISCARD_LABEL:     //  Discard (internal)
241		break;
242	    default:
243                 {
244		    if (arc[loc]->outputLabel >= 0) {
245		        if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
246			    std::stringstream ss;
247			    ss << arc[loc]->outputLabel;
248			    outLabel = ss.str();
249		        }
250		    }
251		    else if (arc[loc]->outputLabel == INITIAL_LABEL)
252			outLabel= Pau;
253		    else if (arc[loc]->outputLabel == FINAL_LABEL)
254			outLabel= Pau2;
255		    else
256		        outLabel= Eps;
257                }
258		break;
259	} // switch
260
261    }
262    outfile.close();
263    return;
264}
265
266void SubGraph::WritePhonemeGraphFile( std::string & fileName, GRXMLDoc &p_Doc )
267{
268    // Creates file of forward graph  - the {name}.G.txt file
269    int loc;
270    std::string inLabel;
271    std::string outLabel;
272    std::ofstream outfile;
273    std::string label;
274    std::string separator = "\t";
275    std::string Eps = "eps";
276
277    outfile.open ( fileName.c_str() );
278    for (int ii= 0; ii < numArc; ii++) {
279	inLabel="";
280        loc = forwardList[ii];
281	switch ( arc[loc]->inputLabel ) {
282	    case TERMINAL_LABEL:    //  Terminal transition
283		outfile << arc[loc]->fromId << std::endl;
284		break;
285	    case NONE_LABEL:        //  Null transition
286		if (arc[loc]->outputLabel >= 0) {
287		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
288			std::stringstream ss;
289			ss << arc[loc]->outputLabel;
290			outLabel = ss.str();
291		    }
292		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << outLabel.c_str() << std::endl;
293		}
294		else
295		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << Eps << separator << Eps << std::endl;
296		break;
297	    case WB_LABEL:          //  Word boundary transition
298		if (arc[loc]->outputLabel >= 0) {
299		    if (!p_Doc.findLabel( arc[loc]->outputLabel, outLabel ) ) {
300			std::stringstream ss;
301			ss << arc[loc]->outputLabel;
302			outLabel = ss.str();
303		    }
304		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << outLabel.c_str() << std::endl;
305		}
306		else
307		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << ".wb" << separator << Eps << std::endl;
308		break;
309	    case TAG_LABEL:         //  Tag transition
310	    case BEGINSCOPE_LABEL:  //  Start of scope
311	    case ENDSCOPE_LABEL:    //  End of scope
312	    case BEGINRULE_LABEL:   //  Start of rule
313	    case ENDRULE_LABEL:     //  End of rule
314	    case DISCARD_LABEL:     //  Discard (internal)
315		break;
316	    default:
317	        if ( arc[loc]->inputLabel >= 0) {
318
319		}
320                else {
321		    //  Note negative index
322		    if (!p_Doc.findLabel( -arc[loc]->inputLabel, inLabel ) ) {
323			std::stringstream ss;
324			ss << arc[loc]->inputLabel;
325			inLabel = ss.str();
326		    }
327		    outfile << arc[loc]->fromId << separator << arc[loc]->toId  << separator << inLabel.c_str() << separator << Eps << std::endl;
328                }
329		break;
330	} // switch
331
332    }
333        outfile.close();
334
335    return;
336}
337
338
339void SubGraph::PrintWithLabels( GRXMLDoc &p_Doc )
340{
341    int loc;
342    std::string inLabel, outLabel;
343    std::string label;
344
345    printf ("Graph %s (%d %d)\n", title, startId, lastId);
346    for (int ii= 0; ii < numArc; ii++) {
347        loc= forwardList[ii];
348	if (!p_Doc.findLabel( arc[loc]->inputLabel, inLabel ) ) {
349	    inLabel = arc[loc]->inputLabel;
350	    //std::stringstream  ss;
351	    //ss << arc[loc]->inputLabel;
352	    //inLabel = ss.str();
353	}
354	if (!p_Doc.findTag( arc[loc]->outputLabel, outLabel ) ) {
355	    outLabel = arc[loc]->outputLabel;
356	    //std::stringstream  ss;
357	    //ss << arc[loc]->outputLabel;
358	    //outLabel = ss.str();
359	}
360	std::cout << arc[loc]->fromId <<" " << arc[loc]->toId  << " "  << inLabel.c_str() <<" " << outLabel.c_str()  << std::endl;
361    }
362
363    return;
364}
365
366void NUANArc::Dump(GRXMLDoc &p_Doc )
367{
368    // I need  a handle to the grxml doc object in order to access labels
369    printf ("%d %d %d %d\n", fromId, toId, inputLabel, outputLabel);
370    return;
371}
372
373
374
375