1// arc.h 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14// 15// 16// \file 17// Commonly used Fst arc types. 18 19#ifndef FST_LIB_ARC_H__ 20#define FST_LIB_ARC_H__ 21 22#include "fst/lib/float-weight.h" 23#include "fst/lib/product-weight.h" 24#include "fst/lib/string-weight.h" 25 26namespace fst { 27 28// Arc with integer labels and state Ids and float weights over the 29// tropical semiring. 30struct StdArc { 31 typedef int Label; 32 typedef TropicalWeight Weight; 33 typedef int StateId; 34 35 StdArc(Label i, Label o, Weight w, StateId s) 36 : ilabel(i), olabel(o), weight(w), nextstate(s) {} 37 38 StdArc() {} 39 40 static const string &Type() { // Arc type name 41 static const string type = "standard"; 42 return type; 43 } 44 45 Label ilabel; // Transition input label 46 Label olabel; // Transition output label 47 Weight weight; // Transition weight 48 StateId nextstate; // Transition destination state 49}; 50 51 52// Arc with integer labels and state Ids and float weights over the 53// log semiring. 54struct LogArc { 55 typedef int Label; 56 typedef LogWeight Weight; 57 typedef int StateId; 58 59 LogArc(Label i, Label o, Weight w, StateId s) 60 : ilabel(i), olabel(o), weight(w), nextstate(s) {} 61 62 LogArc() {} 63 64 static const string &Type() { // Arc type name 65 static const string type = "log"; 66 return type; 67 } 68 69 Label ilabel; // Transition input label 70 Label olabel; // Transition output label 71 Weight weight; // Transition weight 72 StateId nextstate; // Transition destination state 73}; 74 75 76// Arc with integer labels and state Ids and string weights. 77template <StringType S = STRING_LEFT> 78class StringArc { 79 public: 80 typedef int Label; 81 typedef StringWeight<int, S> Weight; 82 typedef int StateId; 83 84 StringArc(Label i, Label o, Weight w, StateId s) 85 : ilabel(i), olabel(o), weight(w), nextstate(s) {} 86 87 StringArc() {} 88 89 static const string &Type() { // Arc type name 90 static const string type = 91 S == STRING_LEFT ? "standard_string" : 92 (S == STRING_RIGHT ? "right_standard_string" : 93 (S == STRING_LEFT_RESTRICT ? "restricted_string" : 94 "right_restricted_string")); 95 return type; 96 } 97 98 Label ilabel; // Transition input label 99 Label olabel; // Transition output label 100 Weight weight; // Transition weight 101 StateId nextstate; // Transition destination state 102}; 103 104 105// Arc with label and state Id type the same as template arg and with 106// weights over the Gallic semiring w.r.t the output labels and weights of A. 107template <class A, StringType S = STRING_LEFT> 108struct GallicArc { 109 typedef A Arc; 110 typedef typename A::Label Label; 111 typedef typename A::StateId StateId; 112 typedef GallicWeight<Label, typename A::Weight, S> Weight; 113 114 GallicArc() {} 115 116 GallicArc(Label i, Label o, Weight w, StateId s) 117 : ilabel(i), olabel(o), weight(w), nextstate(s) {} 118 119 GallicArc(const A &arc) 120 : ilabel(arc.ilabel), olabel(arc.ilabel), 121 weight(arc.olabel, arc.weight), nextstate(arc.nextstate) {} 122 123 static const string &Type() { // Arc type name 124 static const string type = 125 (S == STRING_LEFT ? "gallic_" : 126 (S == STRING_RIGHT ? "right_gallic_" : 127 (S == STRING_LEFT_RESTRICT ? "restricted_gallic_" : 128 "right_restricted_gallic_"))) + A::Type(); 129 return type; 130 } 131 132 Label ilabel; // Transition input label 133 Label olabel; // Transition output label 134 Weight weight; // Transition weight 135 StateId nextstate; // Transition destination state 136}; 137 138 139// Arc with the reverse of the weight found in its template arg. 140template <class A> struct ReverseArc { 141 typedef A Arc; 142 typedef typename A::Label Label; 143 typedef typename A::Weight AWeight; 144 typedef typename AWeight::ReverseWeight Weight; 145 typedef typename A::StateId StateId; 146 147 ReverseArc(Label i, Label o, Weight w, StateId s) 148 : ilabel(i), olabel(o), weight(w), nextstate(s) {} 149 150 ReverseArc() {} 151 152 static const string &Type() { // Arc type name 153 static const string type = "reverse_" + Arc::Type(); 154 return type; 155 } 156 157 Label ilabel; // Transition input label 158 Label olabel; // Transition output label 159 Weight weight; // Transition weight 160 StateId nextstate; // Transition destination state 161}; 162 163} // namespace fst; 164 165#endif // FST_LIB_ARC_H__ 166