/usr/include/lttoolbox-3.3/lttoolbox/transducer.h is in lttoolbox-dev 3.3.3~r68466-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 | /*
* Copyright (C) 2005 Universitat d'Alacant / Universidad de Alicante
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TRANSDUCTOR_
#define _TRANSDUCTOR_
#include <cstdio>
#include <map>
#include <set>
#include <lttoolbox/alphabet.h>
using namespace std;
class MatchExe;
/**
* Class to represent a letter transducer during the dictionary compilation
*/
class Transducer
{
private:
friend class MatchExe;
/**
* Initial state
*/
int initial;
/**
* Final state set
*/
set<int> finals;
/**
* Transitions of the transducer
*/
map<int, multimap<int, int> > transitions;
/**
* New state creator
* @return the new state number
*/
int newState();
/**
* Test if the intersection of two sets is empty
* @param s1 first set
* @param s2 second set
* @return true if the intersection is empty
*/
static bool isEmptyIntersection(set<int> const &s1, set<int> const &s2);
/**
* Copy function
* @param t the transducer to be copied
*/
void copy(Transducer const &t);
/**
* Empty transducer
*/
void destroy();
public:
/**
* Constructor
*/
Transducer();
/**
* Destructor
*/
~Transducer();
/**
* Copy constructor
* @param t transducer to be copied
*/
Transducer(Transducer const &t);
/**
* Assignment operator
* @param t transducer to be assigned
* @return the object result of the assignment
*/
Transducer & operator =(Transducer const &t);
/**
* Insertion of a single transduction, creating a new target state
* if needed
* @param tag the tag of the transduction being inserted
* @param source the source state of the new transduction
* @return the target state
*/
int insertSingleTransduction(int const tag, int const source);
/**
* Insertion of a single transduction, forcing create a new target
* state
* @param tag the tag of the transduction being inserted
* @param source the source state of the new transduction
* @return the target state
*/
int insertNewSingleTransduction(int const tag, int const source);
/**
* Insertion of a transducer in a given source state, unifying their
* final states using a optionally given epsilon tag
* @param source the source state
* @param t the transducer being inserted
* @param epsilon_tag the epsilon tag
* @return the new target state
*/
int insertTransducer(int const source, Transducer &t,
int const epsilon_tag = 0);
/**
* Link two existing states by a transduction
* @param source the source state
* @param target the target state
* @param tag the tag of the transduction
*/
void linkStates(int const source, int const target, int const tag);
/**
* Test if the state is a final state
* @param state the state
* @return true if is a final state
*/
bool isFinal(int const state) const;
/**
* Test if a pattern is recognised by the FST
* @param a widestring of the pattern to be recognised
* @return true if the pattern is recognised by the transducer
*/
bool recognise(wstring patro, Alphabet &a, FILE *err = stderr);
/**
* Set the state as a final or not, yes by default
* @param state the state
* @param value if true, the state is set as final state
*/
void setFinal(int const state, bool value = true);
/**
* Returns the initial state of a transducer
* @return the initial state identifier
*/
int getInitial() const;
/**
* Returns the epsilon closure of a given state
* @param state the state
* @param epsilon_tag the tag to take as epsilon
* @return the epsilon-connected states
*/
set<int> closure(int const state, int const epsilon_tag = 0);
/**
* Join all finals in one using epsilon transductions
* @param epsilon_tag the tag to take as epsilon
*/
void joinFinals(int const epsilon_tag = 0);
/**
* Reverse all the transductions of a transducer
* @param epsilon_tag the tag to take as epsilon
*/
void reverse(int const epsilon_tag = 0);
/**
* Print all the transductions of a transducer in ATT format
* @param epsilon_tag the tag to take as epsilon
*/
void show(Alphabet const &a, FILE *output = stdout, int const epsilon_tag = 0) const;
/**
* Determinize the transducer
* @param epsilon_tag the tag to take as epsilon
*/
void determinize(int const epsilon_tag = 0);
/**
* Minimize = reverse + determinize + reverse + determinize
* @param epsilon_tag the tag to take as epsilon
*/
void minimize(int const epsilon_tag = 0);
/**
* Make a transducer optional (link initial state with final states with
* empty transductions)
* @param epsilon_tag the tag to take as epsilon
*/
void optional(int const epsilon_tag = 0);
/**
* Make a transducer cyclic (link final states with initial state with
* empty transductions)
* @param epsilon_tag the tag to take as epsilon
*/
void oneOrMore(int const epsilon_tag = 0);
/**
* zeroOrMore = oneOrMore + optional
* @param epsilon_tag the tag to take as epsilon
*/
void zeroOrMore(int const epsilon_tag = 0);
/**
* Clear transducer
*/
void clear();
/**
* Check if the transducer is empty
* @return true if the transducer is empty
*/
bool isEmpty() const;
/**
* Check if the transducer has no final state(s)
* @return true if the set of final states is empty
*/
bool hasNoFinals() const;
/**
* Returns the number of states of the transducer
* @return the number of states
*/
int size() const;
/**
* Returns the number of transitions of the transducer
* @return the number of transitions
*/
int numberOfTransitions() const;
/**
* Checks if a state is empty (not outgoing transductions)
* @param state the state to check
* @return true if the state is empty
*/
bool isEmpty(int const state) const;
/**
* Returns the number of transitions from a given state
* @return the number of transitions
*/
int getStateSize(int const state);
/**
* Write method
* @param output the stream to write to
* @param decalage offset to sum to the tags
*/
void write(FILE *output, int const decalage = 0);
/**
* Read method
* @param input the stream to read from
* @param decalage offset to sum to the tags
*/
void read(FILE *input, int const decalage = 0);
/**
* Insert another transducer into this, unifying source and targets.
* Does not minimize.
*
* @param t the transducer being inserted
* @param epsilon_tag the epsilon tag
*/
void unionWith(Alphabet &my_a,
Transducer &t,
int const epsilon_tag = 0);
/**
* Converts this class into a "prefix transducer", ie. for any final
* state, appends a transition to itself for all of the loopback
* symbols (typically all tags). So if the original transducer
* accepts "foo<tag1>" and loopback_symbols includes <tag2>, the
* prefix transducer will accept "foo<tag1><tag2>" as well as
* "foo<tag1>".
*
* @param loopback_symbols a set of symbols of the alphabet for this class,
* all of the input and output tags of which are set equal
* @param epsilon_tag the tag to take as epsilon
* @return the prefix transducer
*/
Transducer appendDotStar(set<int> const &loopback_symbols,
int const epsilon_tag = 0);
/**
* Turn "foo# bar<tag1><tag2>" into "foo<tag1><tag2># bar". Only
* regards the input (left) side, output side will be in wrong
* order. Used on bidixes when trimming.
*
* @param alphabet the alphabet of this transducer, also used for returned Transducer
* @param epsilon_tag the tag to take as epsilon
* @return the prefix transducer
*/
Transducer moveLemqsLast(Alphabet const &alphabet,
int const epsilon_tag = 0);
/**
* Helper for moveLemqsLast. Starting from a certain state, make all
* the tags go before the non-tags, so if " bar<tag1><tag2>" is a
* posible path, we get "<tag1><tag2> bar" in the returned
* transducer.
*
* @param start the state (in this Transducer) to start from
* @param group_label the label of the "#" symbol we saw
* @param alphabet the alphabet of this transducer
* @param epsilon_tag the tag to take as epsilon
* @return a transducer of all paths going from start, but with tags first.
*/
Transducer copyWithTagsFirst(int start,
int group_label,
Alphabet const &alphabet,
int const epsilon_tag = 0);
/**
* Intersects two finite-state transducers
*
* The returned transducer is not minimized! Minimization will exit
* with failure if there are no finals, but we might want to
* continue with intersecting the other sections.
*
* @param t the Transducer with which this class is intersected
* @param my_a the alphabet of this transducer
* @param t_a the alphabet of the transducer t
* @return the trimmed transducer
*/
Transducer intersect(Transducer &t,
Alphabet const &my_a,
Alphabet const &t_a,
int const epsilon_tag = 0);
};
#endif
|