| /* 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__ |