Home | History | Annotate | Download | only in fst
      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 // Copyright 2005-2010 Google, Inc.
     16 // Author: riley (at) google.com (Michael Riley)
     17 //
     18 // \file
     19 //
     20 // Commonly used Fst arc types.
     21 
     22 #ifndef FST_LIB_ARC_H__
     23 #define FST_LIB_ARC_H__
     24 
     25 #include <string>
     26 
     27 
     28 #include <fst/expectation-weight.h>
     29 #include <fst/float-weight.h>
     30 #include <fst/lexicographic-weight.h>
     31 #include <fst/power-weight.h>
     32 #include <fst/product-weight.h>
     33 #include <fst/signed-log-weight.h>
     34 #include <fst/sparse-power-weight.h>
     35 #include <iostream>
     36 #include <fstream>
     37 #include <sstream>
     38 #include <fst/string-weight.h>
     39 
     40 
     41 namespace fst {
     42 
     43 template <class W>
     44 class ArcTpl {
     45  public:
     46   typedef W Weight;
     47   typedef int Label;
     48   typedef int StateId;
     49 
     50   ArcTpl(Label i, Label o, const Weight& w, StateId s)
     51       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
     52 
     53   ArcTpl() {}
     54 
     55   static const string &Type(void) {
     56     static const string type =
     57         (Weight::Type() == "tropical") ? "standard" : Weight::Type();
     58     return type;
     59   }
     60 
     61   Label ilabel;
     62   Label olabel;
     63   Weight weight;
     64   StateId nextstate;
     65 };
     66 
     67 typedef ArcTpl<TropicalWeight> StdArc;
     68 typedef ArcTpl<LogWeight> LogArc;
     69 typedef ArcTpl<Log64Weight> Log64Arc;
     70 typedef ArcTpl<SignedLogWeight> SignedLogArc;
     71 typedef ArcTpl<SignedLog64Weight> SignedLog64Arc;
     72 typedef ArcTpl<MinMaxWeight> MinMaxArc;
     73 
     74 
     75 // Arc with integer labels and state Ids and string weights.
     76 template <StringType S = STRING_LEFT>
     77 class StringArc {
     78  public:
     79   typedef int Label;
     80   typedef StringWeight<int, S> Weight;
     81   typedef int StateId;
     82 
     83   StringArc(Label i, Label o, Weight w, StateId s)
     84       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
     85 
     86   StringArc() {}
     87 
     88   static const string &Type() {  // Arc type name
     89     static const string type =
     90         S == STRING_LEFT ? "standard_string" :
     91         (S == STRING_RIGHT ? "right_standard_string" :
     92          (S == STRING_LEFT_RESTRICT ? "restricted_string" :
     93           "right_restricted_string"));
     94     return type;
     95   }
     96 
     97   Label ilabel;       // Transition input label
     98   Label olabel;       // Transition output label
     99   Weight weight;      // Transition weight
    100   StateId nextstate;  // Transition destination state
    101 };
    102 
    103 
    104 // Arc with label and state Id type the same as template arg and with
    105 // weights over the Gallic semiring w.r.t the output labels and weights of A.
    106 template <class A, StringType S = STRING_LEFT>
    107 struct GallicArc {
    108   typedef A Arc;
    109   typedef typename A::Label Label;
    110   typedef typename A::StateId StateId;
    111   typedef GallicWeight<Label, typename A::Weight, S> Weight;
    112 
    113   GallicArc() {}
    114 
    115   GallicArc(Label i, Label o, Weight w, StateId s)
    116       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    117 
    118   GallicArc(const A &arc)
    119       : ilabel(arc.ilabel), olabel(arc.ilabel),
    120         weight(arc.olabel, arc.weight), nextstate(arc.nextstate) {}
    121 
    122   static const string &Type() {  // Arc type name
    123     static const string type =
    124         (S == STRING_LEFT ? "gallic_" :
    125          (S == STRING_RIGHT ? "right_gallic_" :
    126           (S == STRING_LEFT_RESTRICT ? "restricted_gallic_" :
    127            "right_restricted_gallic_"))) + A::Type();
    128     return type;
    129   }
    130 
    131   Label ilabel;       // Transition input label
    132   Label olabel;       // Transition output label
    133   Weight weight;      // Transition weight
    134   StateId nextstate;  // Transition destination state
    135 };
    136 
    137 
    138 // Arc with the reverse of the weight found in its template arg.
    139 template <class A> struct ReverseArc {
    140   typedef A Arc;
    141   typedef typename A::Label Label;
    142   typedef typename A::Weight AWeight;
    143   typedef typename AWeight::ReverseWeight Weight;
    144   typedef typename A::StateId StateId;
    145 
    146   ReverseArc(Label i, Label o, Weight w, StateId s)
    147       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    148 
    149   ReverseArc() {}
    150 
    151   static const string &Type() {  // Arc type name
    152     static const string type = "reverse_" + Arc::Type();
    153     return type;
    154   }
    155 
    156   Label ilabel;       // Transition input label
    157   Label olabel;       // Transition output label
    158   Weight weight;      // Transition weight
    159   StateId nextstate;  // Transition destination state
    160 };
    161 
    162 
    163 // Arc with integer labels and state Ids and lexicographic weights.
    164 template<class W1, class W2>
    165 struct LexicographicArc {
    166   typedef int Label;
    167   typedef LexicographicWeight<W1, W2> Weight;
    168   typedef int StateId;
    169 
    170   LexicographicArc(Label i, Label o, Weight w, StateId s)
    171       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    172 
    173   LexicographicArc() {}
    174 
    175   static const string &Type() {  // Arc type name
    176     static const string type = Weight::Type();
    177     return type;
    178   }
    179 
    180   Label ilabel;       // Transition input label
    181   Label olabel;       // Transition output label
    182   Weight weight;      // Transition weight
    183   StateId nextstate;  // Transition destination state
    184 };
    185 
    186 
    187 // Arc with integer labels and state Ids and product weights.
    188 template<class W1, class W2>
    189 struct ProductArc {
    190   typedef int Label;
    191   typedef ProductWeight<W1, W2> Weight;
    192   typedef int StateId;
    193 
    194   ProductArc(Label i, Label o, Weight w, StateId s)
    195       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    196 
    197   ProductArc() {}
    198 
    199   static const string &Type() {  // Arc type name
    200     static const string type = Weight::Type();
    201     return type;
    202   }
    203 
    204   Label ilabel;       // Transition input label
    205   Label olabel;       // Transition output label
    206   Weight weight;      // Transition weight
    207   StateId nextstate;  // Transition destination state
    208 };
    209 
    210 
    211 // Arc with label and state Id type the same as first template arg and with
    212 // weights over the n-th cartesian power of the weight type of the
    213 // template arg.
    214 template <class A, unsigned int n>
    215 struct PowerArc {
    216   typedef A Arc;
    217   typedef typename A::Label Label;
    218   typedef typename A::StateId StateId;
    219   typedef PowerWeight<typename A::Weight, n> Weight;
    220 
    221   PowerArc() {}
    222 
    223   PowerArc(Label i, Label o, Weight w, StateId s)
    224       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    225 
    226   static const string &Type() {  // Arc type name
    227     static string type;
    228     if (type.empty()) {
    229       string power;
    230       Int64ToStr(n, &power);
    231       type = A::Type() + "_^" + power;
    232     }
    233     return type;
    234   }
    235 
    236   Label ilabel;       // Transition input label
    237   Label olabel;       // Transition output label
    238   Weight weight;      // Transition weight
    239   StateId nextstate;  // Transition destination state
    240 };
    241 
    242 
    243 // Arc with label and state Id type the same as first template arg and with
    244 // weights over the arbitrary cartesian power of the weight type.
    245 template <class A, class K = int>
    246 struct SparsePowerArc {
    247   typedef A Arc;
    248   typedef typename A::Label Label;
    249   typedef typename A::StateId StateId;
    250   typedef SparsePowerWeight<typename A::Weight, K> Weight;
    251 
    252   SparsePowerArc() {}
    253 
    254   SparsePowerArc(Label i, Label o, Weight w, StateId s)
    255       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    256 
    257   static const string &Type() {  // Arc type name
    258     static string type;
    259     if (type.empty()) { type = A::Type() + "_^n"; }
    260     if(sizeof(K) != sizeof(uint32)) {
    261       string size;
    262       Int64ToStr(8 * sizeof(K), &size);
    263       type += "_" + size;
    264     }
    265     return type;
    266   }
    267 
    268   Label ilabel;       // Transition input label
    269   Label olabel;       // Transition output label
    270   Weight weight;      // Transition weight
    271   StateId nextstate;  // Transition destination state
    272 };
    273 
    274 
    275 // Arc with label and state Id type the same as first template arg and with
    276 // expectation weight over the first template arg weight type and the
    277 // second template arg.
    278 template <class A, class X2>
    279 struct ExpectationArc {
    280   typedef A Arc;
    281   typedef typename A::Label Label;
    282   typedef typename A::StateId StateId;
    283   typedef typename A::Weight X1;
    284   typedef ExpectationWeight<X1, X2> Weight;
    285 
    286   ExpectationArc() {}
    287 
    288   ExpectationArc(Label i, Label o, Weight w, StateId s)
    289       : ilabel(i), olabel(o), weight(w), nextstate(s) {}
    290 
    291   static const string &Type() {  // Arc type name
    292     static string type;
    293     if (type.empty()) {
    294       type = "expectation_" + A::Type() + "_" + X2::Type();
    295     }
    296     return type;
    297   }
    298 
    299   Label ilabel;       // Transition input label
    300   Label olabel;       // Transition output label
    301   Weight weight;      // Transition weight
    302   StateId nextstate;  // Transition destination state
    303 };
    304 
    305 }  // namespace fst
    306 
    307 #endif  // FST_LIB_ARC_H__
    308