/* FILE: netw_arc.h * 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. * * * *---------------------------------------------------------------------------*/ #ifndef __netw_arc_h__ #define __netw_arc_h__ #undef assert #define assert(X) #include <cstdio> class GRXMLDoc; class NUANArc { public: friend class SubGraph; /* Constructors */ /* Create arc with only input and output labels */ NUANArc (int iLabel, int oLabel) { inputLabel= iLabel; outputLabel= oLabel; centre= -1; left= -1; right= -1; return; }; /* Create arc with full data */ NUANArc (int iLabel, int oLabel, int from, int to) { inputLabel= iLabel; outputLabel= oLabel; fromId= from; toId= to; left= -1; right= -1; centre= -1; return; }; /* Copy an arc */ NUANArc (NUANArc *arcsrc) { inputLabel= arcsrc->inputLabel; outputLabel= arcsrc->outputLabel; fromId= arcsrc->fromId; toId= arcsrc->toId; left= arcsrc->left; right= arcsrc->right; centre= arcsrc->centre; return; }; /* Create arc based on another arc */ NUANArc (NUANArc *arcsrc, int offset, int startId, int newStartId, int endId, int newEndId) { inputLabel= arcsrc->inputLabel; outputLabel= arcsrc->outputLabel; if (arcsrc->fromId == startId && newStartId >= 0) fromId= newStartId; else fromId= arcsrc->fromId + offset; if (arcsrc->toId == endId && newEndId >= 0) toId= newEndId; else toId= arcsrc->toId + offset; left= -1; right= -1; centre= -1; return; }; /* Assign non-terminal vertices */ void AssignFromId (int Id) { fromId= Id; }; /* Assign non-terminal vertices */ void AssignToId (int Id) { toId= Id; }; void AssignInput (int Id) { inputLabel= Id; }; void AssignOutput (int Id) { outputLabel= Id; }; /* Assign centre context */ void AssignCentre (int centreData) { centre= centreData; }; /* Assign left context */ void AssignLeft (int leftData) { left= leftData; }; /* Assign right context */ void AssignRight (int rightData) { right= rightData; }; /* Access functions */ /* Get input label */ int GetInput() { return inputLabel; }; /* Get output label */ int GetOutput() { return outputLabel; }; /* Get from Vertex */ int GetFromId() { return fromId; }; /* Get to Vertex */ int GetToId() { return toId; }; /* Get centre context */ int GetCentre() { return centre; }; /* Get left context */ int GetLeft() { return left; }; /* Get right context */ int GetRight() { return right; }; /* Transduction */ int Transduce (int iLabel) { if (inputLabel == iLabel) return outputLabel; else return -1; }; /* Similarity checks */ int Compare (NUANArc *test) { if (fromId > test->fromId) return 1; else if (fromId < test->fromId) return -1; else if (toId > test->toId) return 1; else if (toId < test->toId) return -1; else if (inputLabel > test->inputLabel) return 1; else if (inputLabel < test->inputLabel) return -1; else if (outputLabel > test->outputLabel) return 1; else if (outputLabel < test->outputLabel) return -1; else return 0; } int CompareSymbol (NUANArc *test) { if (inputLabel > test->inputLabel) return 1; else if (inputLabel < test->inputLabel) return -1; else if (outputLabel > test->outputLabel) return 1; else if (outputLabel < test->outputLabel) return -1; else return 0; } int CompareReverse (NUANArc *test) { if (toId > test->toId) return 1; else if (toId < test->toId) return -1; else if (fromId > test->fromId) return 1; else if (fromId < test->fromId) return -1; else if (inputLabel > test->inputLabel) return 1; else if (inputLabel < test->inputLabel) return -1; else if (outputLabel > test->outputLabel) return 1; else if (outputLabel < test->outputLabel) return -1; else return 0; } int CompareForMin (NUANArc *test) { if (fromId > test->fromId) return 1; else if (fromId < test->fromId) return -1; else if (inputLabel > test->inputLabel) return 1; else if (inputLabel < test->inputLabel) return -1; else if (outputLabel > test->outputLabel) return 1; else if (outputLabel < test->outputLabel) return -1; else if (toId > test->toId) return 1; else if (toId < test->toId) return -1; else return 0; } int CompareWithContext (NUANArc *test) { if (fromId > test->fromId) return 1; else if (fromId < test->fromId) return -1; else if (toId > test->toId) return 1; else if (toId < test->toId) return -1; else if (inputLabel > test->inputLabel) return 1; else if (inputLabel < test->inputLabel) return -1; else if (outputLabel > test->outputLabel) return 1; else if (outputLabel < test->outputLabel) return -1; else if (left > test->left) return 1; else if (left < test->left) return -1; else if (right > test->right) return 1; else if (right < test->right) return -1; else return 0; } bool IsSame (NUANArc *test) { if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId && toId == test->toId) return true; else return false; }; bool HasSameLabels (NUANArc *test) { if (inputLabel == test->inputLabel && outputLabel == test->outputLabel) return true; else return false; }; bool HasSameLabelsAndTo (NUANArc *test) { if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && toId == test->toId) return true; else return false; }; bool HasSameLabelsAndFrom (NUANArc *test) { if (inputLabel == test->inputLabel && outputLabel == test->outputLabel && fromId == test->fromId) return true; else return false; }; /* Print */ void Print() { printf ("%d %d %d %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre); return; }; void PrintText() { printf ("%d %d %c %d (%d)\n", fromId, toId, inputLabel, outputLabel, centre); return; }; void Dump (GRXMLDoc &p_Doc ); protected: int inputLabel; /* input label */ int outputLabel; /* output label */ int fromId; /* from node */ int toId; /* to node */ int centre; /* left context */ int left; /* left context */ int right; /* right context */ }; #endif // __netw_arc_h__