From 369b3f6ad10a64f9f363a6a1d7ee8b67e8a25aeb Mon Sep 17 00:00:00 2001 From: kkm Date: Sun, 8 Mar 2015 20:09:09 -0700 Subject: [PATCH] Adding openfstwin-1.3.1, and testing with it. Tested with icl and full optimization, not all tests pass. --- .gitignore | 10 + extlibs/openfstwin-1.3.1/dll/openfst.dll | Bin 0 -> 3865088 bytes extlibs/openfstwin-1.3.1/dll/openfst64.dll | Bin 0 -> 4923904 bytes .../include/fst/accumulator.h | 745 +++++++++ .../include/fst/accumulator.h.bak | 745 +++++++++ extlibs/openfstwin-1.3.1/include/fst/add-on.h | 306 ++++ .../openfstwin-1.3.1/include/fst/arc-map.h | 1146 +++++++++++++ .../include/fst/arc-map.h.bak | 1146 +++++++++++++ extlibs/openfstwin-1.3.1/include/fst/arc.h | 307 ++++ .../openfstwin-1.3.1/include/fst/arcfilter.h | 99 ++ .../openfstwin-1.3.1/include/fst/arcsort.h | 203 +++ .../openfstwin-1.3.1/include/fst/bi-table.h | 396 +++++ extlibs/openfstwin-1.3.1/include/fst/cache.h | 738 +++++++++ .../openfstwin-1.3.1/include/fst/closure.h | 155 ++ .../include/fst/compact-fst.h | 1307 +++++++++++++++ extlibs/openfstwin-1.3.1/include/fst/compat.h | 153 ++ .../openfstwin-1.3.1/include/fst/compat.h.bak | 153 ++ .../openfstwin-1.3.1/include/fst/complement.h | 338 ++++ .../include/fst/compose-filter.h | 542 ++++++ .../openfstwin-1.3.1/include/fst/compose.h | 673 ++++++++ extlibs/openfstwin-1.3.1/include/fst/concat.h | 245 +++ extlibs/openfstwin-1.3.1/include/fst/config.h | 5 + .../openfstwin-1.3.1/include/fst/config.h.bak | 12 + .../openfstwin-1.3.1/include/fst/config.h.in | 11 + .../openfstwin-1.3.1/include/fst/connect.h | 319 ++++ .../openfstwin-1.3.1/include/fst/const-fst.h | 483 ++++++ .../include/fst/determinize.h | 887 ++++++++++ .../include/fst/determinize.h.bak | 887 ++++++++++ .../openfstwin-1.3.1/include/fst/dfs-visit.h | 204 +++ .../openfstwin-1.3.1/include/fst/difference.h | 189 +++ .../openfstwin-1.3.1/include/fst/edit-fst.h | 774 +++++++++ extlibs/openfstwin-1.3.1/include/fst/encode.h | 599 +++++++ .../openfstwin-1.3.1/include/fst/encode.h.bak | 599 +++++++ .../include/fst/epsnormalize.h | 74 + .../include/fst/epsnormalize.h.bak | 74 + extlibs/openfstwin-1.3.1/include/fst/equal.h | 124 ++ .../openfstwin-1.3.1/include/fst/equivalent.h | 274 ++++ .../include/fst/equivalent.h.bak | 274 ++++ .../include/fst/expanded-fst.h | 189 +++ .../include/fst/expectation-weight.h | 142 ++ .../fst/extensions/far/compile-strings.h | 305 ++++ .../fst/extensions/far/compile-strings.h.bak | 303 ++++ .../include/fst/extensions/far/create.h | 89 + .../include/fst/extensions/far/create.h.bak | 87 + .../include/fst/extensions/far/equal.h | 99 ++ .../include/fst/extensions/far/extract.h | 85 + .../include/fst/extensions/far/far.h | 492 ++++++ .../include/fst/extensions/far/farlib.h | 31 + .../include/fst/extensions/far/farscript.h | 266 +++ .../fst/extensions/far/farscript.h.bak | 266 +++ .../include/fst/extensions/far/info.h | 128 ++ .../include/fst/extensions/far/info.h.bak | 128 ++ .../include/fst/extensions/far/main.h | 48 + .../include/fst/extensions/far/main.h.bak | 43 + .../fst/extensions/far/print-strings.h | 129 ++ .../include/fst/extensions/far/stlist.h | 305 ++++ .../include/fst/extensions/far/stlist.h.bak | 305 ++++ .../include/fst/extensions/far/sttable.h | 371 +++++ .../include/fst/extensions/far/sttable.h.bak | 371 +++++ .../include/fst/extensions/pdt/collection.h | 122 ++ .../include/fst/extensions/pdt/compose.h | 146 ++ .../include/fst/extensions/pdt/expand.h | 975 +++++++++++ .../include/fst/extensions/pdt/info.h | 175 ++ .../include/fst/extensions/pdt/info.h.bak | 175 ++ .../include/fst/extensions/pdt/paren.h | 496 ++++++ .../include/fst/extensions/pdt/paren.h.bak | 496 ++++++ .../include/fst/extensions/pdt/pdt.h | 212 +++ .../include/fst/extensions/pdt/pdt.h.bak | 212 +++ .../include/fst/extensions/pdt/pdtlib.h | 30 + .../include/fst/extensions/pdt/pdtscript.h | 284 ++++ .../fst/extensions/pdt/pdtscript.h.bak | 284 ++++ .../include/fst/extensions/pdt/replace.h | 192 +++ .../include/fst/extensions/pdt/reverse.h | 58 + .../include/fst/extensions/pdt/reverse.h.bak | 58 + .../fst/extensions/pdt/shortest-path.h | 790 +++++++++ .../fst/extensions/pdt/shortest-path.h.bak | 790 +++++++++ .../include/fst/factor-weight.h | 476 ++++++ .../include/fst/factor-weight.h.bak | 476 ++++++ extlibs/openfstwin-1.3.1/include/fst/flags.h | 242 +++ .../openfstwin-1.3.1/include/fst/flags.h.bak | 224 +++ .../include/fst/float-weight.h | 598 +++++++ .../openfstwin-1.3.1/include/fst/fst-decl.h | 125 ++ extlibs/openfstwin-1.3.1/include/fst/fst.h | 943 +++++++++++ .../openfstwin-1.3.1/include/fst/fst.h.bak | 943 +++++++++++ extlibs/openfstwin-1.3.1/include/fst/fstlib.h | 152 ++ .../include/fst/generic-register.h | 163 ++ .../include/fst/generic-register.h.bak | 161 ++ extlibs/openfstwin-1.3.1/include/fst/heap.h | 206 +++ extlibs/openfstwin-1.3.1/include/fst/icu.h | 116 ++ .../openfstwin-1.3.1/include/fst/intersect.h | 172 ++ .../include/fst/interval-set.h | 381 +++++ extlibs/openfstwin-1.3.1/include/fst/invert.h | 125 ++ .../include/fst/label-reachable.h | 565 +++++++ .../include/fst/label-reachable.h.bak | 565 +++++++ .../include/fst/lexicographic-weight.h | 151 ++ extlibs/openfstwin-1.3.1/include/fst/lock.h | 81 + extlibs/openfstwin-1.3.1/include/fst/log.h | 66 + .../include/fst/lookahead-filter.h | 698 ++++++++ .../include/fst/lookahead-matcher.h | 813 +++++++++ extlibs/openfstwin-1.3.1/include/fst/map.h | 121 ++ .../include/fst/matcher-fst.h | 359 ++++ .../openfstwin-1.3.1/include/fst/matcher.h | 1116 +++++++++++++ .../openfstwin-1.3.1/include/fst/minimize.h | 584 +++++++ .../include/fst/mutable-fst.h | 378 +++++ .../include/fst/pair-weight.h | 280 ++++ .../openfstwin-1.3.1/include/fst/partition.h | 290 ++++ .../include/fst/power-weight.h | 159 ++ .../include/fst/product-weight.h | 115 ++ .../openfstwin-1.3.1/include/fst/project.h | 148 ++ .../openfstwin-1.3.1/include/fst/properties.h | 460 ++++++ .../include/fst/properties.h.bak | 460 ++++++ extlibs/openfstwin-1.3.1/include/fst/prune.h | 339 ++++ extlibs/openfstwin-1.3.1/include/fst/push.h | 175 ++ extlibs/openfstwin-1.3.1/include/fst/queue.h | 889 ++++++++++ .../include/fst/randequivalent.h | 135 ++ .../openfstwin-1.3.1/include/fst/randgen.h | 712 ++++++++ .../include/fst/random-weight.h | 348 ++++ .../openfstwin-1.3.1/include/fst/rational.h | 330 ++++ .../include/fst/rational.h.bak | 330 ++++ .../openfstwin-1.3.1/include/fst/register.h | 133 ++ .../openfstwin-1.3.1/include/fst/relabel.h | 524 ++++++ .../include/fst/relabel.h.bak | 524 ++++++ .../include/fst/replace-util.h | 550 +++++++ .../include/fst/replace-util.h.bak | 550 +++++++ .../openfstwin-1.3.1/include/fst/replace.h | 1459 +++++++++++++++++ .../include/fst/replace.h.bak | 1453 ++++++++++++++++ .../openfstwin-1.3.1/include/fst/reverse.h | 91 + .../openfstwin-1.3.1/include/fst/reweight.h | 146 ++ .../openfstwin-1.3.1/include/fst/rmepsilon.h | 601 +++++++ .../include/fst/rmepsilon.h.bak | 601 +++++++ .../include/fst/rmfinalepsilon.h | 107 ++ .../include/fst/rmfinalepsilon.h.bak | 107 ++ .../include/fst/script/arcsort.h | 49 + .../include/fst/script/arcsort.h.bak | 49 + .../include/fst/script/arg-packs.h | 240 +++ .../include/fst/script/closure.h | 41 + .../include/fst/script/closure.h.bak | 41 + .../include/fst/script/compile-impl.h | 216 +++ .../include/fst/script/compile-impl.h.bak | 216 +++ .../include/fst/script/compile.h | 92 ++ .../include/fst/script/compose.h | 63 + .../include/fst/script/compose.h.bak | 63 + .../include/fst/script/concat.h | 54 + .../include/fst/script/concat.h.bak | 54 + .../include/fst/script/connect.h | 45 + .../include/fst/script/connect.h.bak | 45 + .../include/fst/script/convert.h | 49 + .../include/fst/script/convert.h.bak | 49 + .../include/fst/script/decode.h | 46 + .../include/fst/script/decode.h.bak | 46 + .../include/fst/script/determinize.h | 68 + .../include/fst/script/determinize.h.bak | 68 + .../include/fst/script/difference.h | 67 + .../include/fst/script/difference.h.bak | 67 + .../include/fst/script/draw-impl.h | 234 +++ .../include/fst/script/draw.h | 114 ++ .../include/fst/script/draw.h.bak | 114 ++ .../include/fst/script/encode.h | 58 + .../include/fst/script/encode.h.bak | 58 + .../include/fst/script/epsnormalize.h | 44 + .../include/fst/script/epsnormalize.h.bak | 44 + .../include/fst/script/equal.h | 45 + .../include/fst/script/equal.h.bak | 45 + .../include/fst/script/equivalent.h | 47 + .../include/fst/script/equivalent.h.bak | 47 + .../include/fst/script/fst-class.h | 344 ++++ .../include/fst/script/fst-class.h.bak | 344 ++++ .../include/fst/script/fstscript-decl.h | 35 + .../include/fst/script/fstscript.h | 154 ++ .../include/fst/script/info-impl.h | 325 ++++ .../include/fst/script/info.h | 48 + .../include/fst/script/info.h.bak | 48 + .../include/fst/script/intersect.h | 65 + .../include/fst/script/intersect.h.bak | 65 + .../include/fst/script/invert.h | 43 + .../include/fst/script/invert.h.bak | 43 + .../openfstwin-1.3.1/include/fst/script/map.h | 115 ++ .../include/fst/script/map.h.bak | 115 ++ .../include/fst/script/minimize.h | 45 + .../include/fst/script/minimize.h.bak | 45 + .../include/fst/script/print-impl.h | 149 ++ .../include/fst/script/print.h | 86 + .../include/fst/script/print.h.bak | 86 + .../include/fst/script/project.h | 43 + .../include/fst/script/project.h.bak | 43 + .../include/fst/script/prune.h | 153 ++ .../include/fst/script/prune.h.bak | 153 ++ .../include/fst/script/push.h | 70 + .../include/fst/script/push.h.bak | 70 + .../include/fst/script/randequivalent.h | 105 ++ .../include/fst/script/randequivalent.h.bak | 105 ++ .../include/fst/script/randgen.h | 76 + .../include/fst/script/randgen.h.bak | 76 + .../include/fst/script/register.h | 120 ++ .../include/fst/script/relabel.h | 102 ++ .../include/fst/script/relabel.h.bak | 102 ++ .../include/fst/script/replace.h | 62 + .../include/fst/script/replace.h.bak | 62 + .../include/fst/script/reverse.h | 42 + .../include/fst/script/reverse.h.bak | 42 + .../include/fst/script/reweight.h | 53 + .../include/fst/script/reweight.h.bak | 53 + .../include/fst/script/rmepsilon.h | 211 +++ .../include/fst/script/rmepsilon.h.bak | 211 +++ .../include/fst/script/script-impl.h | 206 +++ .../include/fst/script/shortest-distance.h | 250 +++ .../fst/script/shortest-distance.h.bak | 250 +++ .../include/fst/script/shortest-path.h | 190 +++ .../include/fst/script/shortest-path.h.bak | 190 +++ .../include/fst/script/symbols.h | 20 + .../include/fst/script/synchronize.h | 42 + .../include/fst/script/synchronize.h.bak | 42 + .../include/fst/script/text-io.h | 51 + .../include/fst/script/text-io.h.bak | 51 + .../include/fst/script/topsort.h | 40 + .../include/fst/script/topsort.h.bak | 40 + .../include/fst/script/union.h | 42 + .../include/fst/script/union.h.bak | 42 + .../include/fst/script/verify.h | 40 + .../include/fst/script/weight-class.h | 216 +++ .../include/fst/shortest-distance.h | 347 ++++ .../include/fst/shortest-path.h | 501 ++++++ .../include/fst/signed-log-weight.h | 367 +++++ extlibs/openfstwin-1.3.1/include/fst/slist.h | 61 + .../include/fst/sparse-power-weight.h | 225 +++ .../include/fst/sparse-tuple-weight.h | 640 ++++++++ .../include/fst/sparse-tuple-weight.h.bak | 640 ++++++++ .../openfstwin-1.3.1/include/fst/state-map.h | 601 +++++++ .../include/fst/state-map.h.bak | 601 +++++++ .../include/fst/state-reachable.h | 198 +++ .../include/fst/state-table.h | 469 ++++++ .../openfstwin-1.3.1/include/fst/statesort.h | 97 ++ .../include/fst/string-weight.h | 560 +++++++ extlibs/openfstwin-1.3.1/include/fst/string.h | 248 +++ .../include/fst/symbol-table-ops.h | 91 + .../include/fst/symbol-table-ops.h.bak | 91 + .../include/fst/symbol-table.h | 522 ++++++ .../include/fst/symbol-table.h.bak | 522 ++++++ .../include/fst/synchronize.h | 457 ++++++ .../include/fst/synchronize.h.bak | 457 ++++++ .../include/fst/test-properties.h | 246 +++ .../include/fst/test-properties.h.bak | 246 +++ .../openfstwin-1.3.1/include/fst/topsort.h | 112 ++ .../include/fst/tuple-weight.h | 332 ++++ extlibs/openfstwin-1.3.1/include/fst/types.h | 38 + .../openfstwin-1.3.1/include/fst/union-find.h | 110 ++ extlibs/openfstwin-1.3.1/include/fst/union.h | 184 +++ .../include/fst/unordered_map.h | 7 + .../include/fst/unordered_set.h | 7 + extlibs/openfstwin-1.3.1/include/fst/util.h | 410 +++++ .../openfstwin-1.3.1/include/fst/util.h.bak | 410 +++++ .../openfstwin-1.3.1/include/fst/vector-fst.h | 727 ++++++++ extlibs/openfstwin-1.3.1/include/fst/verify.h | 126 ++ extlibs/openfstwin-1.3.1/include/fst/visit.h | 270 +++ extlibs/openfstwin-1.3.1/include/fst/weight.h | 179 ++ .../openfstwin-1.3.1/lib/Win32/openfst.lib | Bin 0 -> 399266 bytes extlibs/openfstwin-1.3.1/lib/x64/openfst.lib | Bin 0 -> 406222 bytes msbuild/kaldi.targets | 265 +-- src/base/kaldi-error-test.cc | 1 + src/bin/phones-to-prons.cc | 1 + src/latbin/lattice-oracle.cc | 1 + 261 files changed, 67524 insertions(+), 131 deletions(-) create mode 100755 extlibs/openfstwin-1.3.1/dll/openfst.dll create mode 100755 extlibs/openfstwin-1.3.1/dll/openfst64.dll create mode 100755 extlibs/openfstwin-1.3.1/include/fst/accumulator.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/accumulator.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/add-on.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/arc-map.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/arc-map.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/arc.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/arcfilter.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/arcsort.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/bi-table.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/cache.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/closure.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/compact-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/compat.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/compat.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/complement.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/compose-filter.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/compose.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/concat.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/config.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/config.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/config.h.in create mode 100755 extlibs/openfstwin-1.3.1/include/fst/connect.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/const-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/determinize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/determinize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/dfs-visit.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/difference.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/edit-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/encode.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/encode.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/equal.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/equivalent.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/equivalent.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/expanded-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/expectation-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/equal.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/extract.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/far.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/farlib.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/print-strings.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/collection.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/compose.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/expand.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtlib.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/replace.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/reverse.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/reverse.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/shortest-path.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/shortest-path.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/factor-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/factor-weight.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/flags.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/flags.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/float-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/fst-decl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/fst.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/fstlib.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/generic-register.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/generic-register.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/heap.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/icu.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/intersect.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/interval-set.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/invert.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/label-reachable.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/label-reachable.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/lexicographic-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/lock.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/log.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/lookahead-filter.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/lookahead-matcher.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/map.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/matcher-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/matcher.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/minimize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/mutable-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/pair-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/partition.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/power-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/product-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/project.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/properties.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/properties.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/prune.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/push.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/queue.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/randequivalent.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/randgen.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/random-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rational.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rational.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/register.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/relabel.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/relabel.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/replace-util.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/replace-util.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/replace.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/replace.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/reverse.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/reweight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/arg-packs.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/closure.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/closure.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/compile.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/compose.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/compose.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/concat.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/concat.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/connect.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/connect.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/convert.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/convert.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/decode.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/decode.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/determinize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/determinize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/difference.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/difference.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/draw-impl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/draw.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/draw.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/encode.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/encode.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/equal.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/equal.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/fstscript-decl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/fstscript.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/info-impl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/info.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/info.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/intersect.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/intersect.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/invert.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/invert.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/map.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/map.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/minimize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/minimize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/print-impl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/print.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/print.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/project.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/project.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/prune.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/prune.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/push.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/push.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/randgen.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/randgen.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/register.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/relabel.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/relabel.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/replace.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/replace.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/reverse.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/reverse.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/reweight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/reweight.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/script-impl.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/symbols.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/text-io.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/text-io.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/topsort.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/topsort.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/union.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/union.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/verify.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/script/weight-class.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/shortest-distance.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/shortest-path.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/signed-log-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/slist.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/sparse-power-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/state-map.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/state-map.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/state-reachable.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/state-table.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/statesort.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/string-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/string.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/symbol-table-ops.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/symbol-table-ops.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/symbol-table.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/symbol-table.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/synchronize.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/synchronize.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/test-properties.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/test-properties.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/topsort.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/tuple-weight.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/types.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/union-find.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/union.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/unordered_map.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/unordered_set.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/util.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/util.h.bak create mode 100755 extlibs/openfstwin-1.3.1/include/fst/vector-fst.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/verify.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/visit.h create mode 100755 extlibs/openfstwin-1.3.1/include/fst/weight.h create mode 100755 extlibs/openfstwin-1.3.1/lib/Win32/openfst.lib create mode 100755 extlibs/openfstwin-1.3.1/lib/x64/openfst.lib diff --git a/.gitignore b/.gitignore index a6a563aaa8c..e46f4fccca0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ *.slo *.lo *.o +*.obj # emacs saves [#]*[#] @@ -10,15 +11,24 @@ # Compiled Dynamic libraries *.so *.dylib +*.dll # Compiled Static libraries *.lai *.la *.a +*.lib # some weird thing that MacOs creates. *.dSYM +# Windows executable, symbol and some weird files. +*.exe +*.pdb +*.exp +*.manifest + + # /tools/ /tools/ATLAS/ /tools/atlas3.8.3.tar.gz diff --git a/extlibs/openfstwin-1.3.1/dll/openfst.dll b/extlibs/openfstwin-1.3.1/dll/openfst.dll new file mode 100755 index 0000000000000000000000000000000000000000..649d3d3155ce6772bec15df4c541068473418b95 GIT binary patch literal 3865088 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�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%0At9#ZY7DkBP@O>M&0R&HexZu{9 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 z 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

K3uA%z_}t+PD2rZc~Kp(3uz0T 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

n)K<7@Gss00Q@cdi(fd1)oI{g{NQj$mnV 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

qR#w%M@zXJvAuPN2|xkyyx?nl*Y z&E>cTZ=$B|xehtHy9U3(+r7dy_)VUQAg1nfsXf==%{*bCYw%W{rK>BcqTY!Zr`7Zj z>q^>!toaS7fnaLnc`nzg@oLSTqcwLHoB)G97R+ySWmll2jaQ-gcI6OeDl3}082!s= za@~I^Xi}NJ7m2Z;=^j(`0ME+imV+tAZ}=2~MdN zoU)rZW#fy)2Q?u$Wp_fkiBoDNr_{E=DFVOi+QjdP%cqwnoDBJNrG|8pPyUXQPuUQe zVdT@?S4>!MuY9ukO!6rteV;h~uN;38@ZakyGydm6c6Z49Q2BgV{OA6?1Mr_@#((0J z0&$kfG(FSwz;IrvB+}_&_Vo5o58di671Kj6eR{}mq?v(c4JDriC)XBCP-2u!hgt)9 zE9ZoMLbjK4VasK94oQ45LkNjK3<>(gaH$mk_ath99HO016?gLq0TY&(5NO`fW-gkh z+z|9e#_IZ;wek~OL#h{Ca?mxc+Evgib;l4lrW5w(hA%O{P3_9I4{@{C_zUKi`U{Y) z!d1|fvauEBJpU{6G*U&)W|90xnm~>o#{^PB6NszX1X5+0Kol$ngnTPCk8eo+ie~;u zfh552mz)2{f<;!99?mC~=!GjR0?z2MA#78a7-X)1x! zBB>gPi%+^nEa@7lIGz)CtF|2Pji;{e*;3nx$G2WKyeT`_hp&FF)|FuDpfm^4hN=f# zeQ?zZO({3hl#=IlqOCN2Qb9)haitnR{U|@RffDe8<GVvmuEvl|Z76CFGG~<~UKx^&e7bhqM1b7DI zdM%<}Z~dK?mh!yb`XAzKQuTt%4qy_w71L27=9yb*J_=-X2O_3+ZKC;TC4WJU3H4s& z!~v&*u9TDg$eimIEmsQF2JpOW*(;x`@C44v;UiMXq4HKV#R5oxN0Zc_Xp&m&bt9$a zER_eE(A~>vn$lHPF<(7yCZ-dfuNFbe>HPU>g3h`$UwOo`_=NSHJT5sy>O1SqEAQy$ ztHw6*d*bueCf`Yrm!IH_s#qkDylli;xI^Zv_n!(oU#;qh_4djOQrxqjAQ|T$Kc(ej z``bWqV^y5A{7^0>+b;Ckv35hBt%^JL4Gd+5{bz=SlLSi%eu}6)sXw2z_N3<65$$b= z1fNn(qBeo@|i`D>mfFXq^A4@{5%yWXLXM#VWkRZ(keOE1RRNuv&dZKn@#I-qiw^#AjP~29<0TNG-(hvTW9nzf1`na&eWJt%E zGj0wcAAy{@sRIOVB!1LlCsN7SsNw@mpwl-wIPTjK%$_c!KWC+1UOgrAcjH#*FASeQ#=fG1~JgA?oK z3aQJDM>0lIHrVQ$w5bCEMVVS+!QPmKrFmDSqIs%=x0Z;Mg|Jk8GqyOiYwmXhfy zUF5M9^-!{%Wn&$7?13rS4rPk-LZ9Qp$xbdGEc9#8_h%r|F!Y^f$O}&IYnr`V7+#jaa^=i`Cpom2YPwL_tT$w<~&tCnG`y{{uZ4Wk^W_-uT zM>f74Bd`1N@gOs6wDOwxEmvPpjBiCg*O<7i)8z9rXPu~g-gQ=Z#EbP)2hjhI`25H% zter^zhhFB^y^~A-=^aG>eZmie5N<+VbqxK#%jX|%agB03`24u{d|iG5o?8umXk9+l znmFQQt*?JGtYgOK{7?3@y}q{0Kl|x4MVR&UART`kpX-~w$0zFFJ7&E1Am)8l9GU5& zm3JJzLl>IidD0l~*5uzVVQc5y*m?4=*NMu%+>gT#tYth0f#}1G=Td_on)3&L&$_^j zzYdV67mlIvqy@H$uZ~7Fe+wDXrU;$+ik_ZP#D3-78l-j_i2qGpAc&DKxB= zE1uxx={PBQ(pLEzc*r&%Ljv5rciEWzQXH%q=SD4Eg1%iD)kQt#sB>(7_AHFlRCQTN z0|jC$-eq_L$0}Rr*a}tXiG|%zE$n=1&3(5yR29HiyZ*|7xbHTntz1?86UMXOk7`ga zvLoYtUr?FuIgYX|&hBu0->Sr_{uE_gk^(2XqBtdHPK@ft&O&!Gx~qOW-#^Vs68Tb< zaVgF6IhFp%H^CmrNrB67P73u&v3i=_tmHQieTxlpa_@hWxt!*EvS&`jq+3wBB+uqr z_B$#b2VlXX}mYvbg{D#$j+jo z8QK2D_RK)Ge@?t^4Tn|s0_8y()_^CFYp=?5;L%o<=@dV1`r#diOG@xTvJt~k#p!1w zW>#27XDBIch(0HhzTNyhSD<|yMbPw?T1S;m-U`gT&54}A{WbJjawilG`orU($ z*hok6NNmB_X>Kn~%Yy0z+j|aXNJ5O(Uc9wE z{@Ri4T`Sw`3Vhbb$w8a!oH?Va3sI1c;J_&EVy}#}2S(Y0BNGCnoT`oXjo`m%O|U?x zt%vJhHueWY+RylIoRnq@J!10>EPSOh)@ksxlI>P=Q;G*DOWbm=V#Z`$7c6O^V&R*YW z@~@NEH`k5P_Xi`@-}c}_JCpuK8@Z=aK4jsHc_{hN5Ytie;fu6WE+1wdci70C%y1Wx z_S$xg--Woz&oq9t^?NGEZ|T{g$1la!QR8>P&{IBsj~(l{@%zyj%lOeo@~IrZEdxT2 z-`wM$bkO?!mMc#A_V@Gnyq^EDTZEThP8{Pm=8$`U4DK z-2P$TpyWD}a~&K0{LC|#9jTjH@m&{XQw19oyNO$yPq4jSovI(T?B8$U=4Q4hd93y% z{u&iNFBO9Vd*C1?m$x?n`={I_m_Tma$DDiBnZT68M&`lu&^&Fg;=>;OL-Y1ve`yc@ z53%q+xgMNS{)bOhsP)scO&!Mn$)}$G|JC9AFYObjjQ?f(-0*!e_`jJwrepP=5d7av z-gG|yJ1qQ<<~9D;KXefPCtLWR992#!|Mw2V|A#t^|1UZ9{Qqr7^M5aCUpZC$AC&f% zlg0n%%Jw?P{?U^EpKB&>I-mdTX8s?H<~9D;KZM}_w*BK$t8(nPFWFX=!*@8tohG{o z?x(4HJQT(KkBOA6w4+j>ym8zRVW44OwD~ehUu#kC-SAxLQI1e5>R;aP~i*nk_>-DA&@b(RAsxcPC!u zwiV4PqzIijXr9LAZv8|>#;KGM38~txZ}9{vdwv{tYkL*qBpS}|r#{fMa2>7s6T-@W&O0Bhx$Ew{dTHi*50x1Rh^MFrY?91K?cm_N^C?GBipW=1d!%q(aSUap{}KOgZS7$9(vOQA*r)He zo?_uqetS_`S?#~e7JE}Dmvep}wTR~x-`#XB4)Joi+X3#RLn}6fO!wF{+=aX#&fK2b zti70`cr=#fp5F@%rRrV@mD!${`X2Bh;GPsXYGgXfj{|mj-VwMZZa{-B2X*?WHmk6+ zwL@^6DCWud5Z~hbTS3Na7p}y&njSXD>n20JHAkV((Ppa!{a9T#C8Wo)Uu) ze(B02FQqKvDcmbTy^`V%In^5F*SsoV?3f_!KUXQDc?%qVl zr(&!3Tn?E>zIB&Tkl>S$DQMj+T#Q`b++h2=!jW}+wd?nR4vE@ z93B!5xNf3=NqDMvqNj;e0O^UqA0a1R`87X8_iJ*HAWbjVu26;P$dm5J5y?OvLUe5B zHRPg~d2HkP2;yP5VIZ#;x)9yN=~ny>s&W+cNBnvN4s;?VfJ9(9un0aA&Vb)7eKJyX zpNtegd+NGR)w2iQm`q~o&ZBZgcwRpYB(l3Mtk^M@ozgk&NZXluYd}9S$ zYAu?k7fk~>LNh}bJj@64FTe#wxnne{s{0eFE#u^>7SCwrnldLou$;RC@o1LdPGG@X zCA@<&Nw&ZjCA>?DrTb6gycqWLuda^`jsba5t;%*lH3@@|OM`%c^Ya>!CV#oSWJ3~d zwsFPVs2_q{N5z*e>SZe)spL9J@4`d862lWNSE|KR(c${@G06O*Cpg<{Q%1#SjC2$` z1J}pHkC)Pm8t7T@(n#mkBja7m9N(+Ns%%ICm$r*&){qoBP`Df6tp(eH2xbE-T~s23 z7GLEo2>Aj1cTJK$xrB|EAiN_=OPp{6C)eSkDLizc?hzF5IccMx#sQO$`f~(BWanZ1 zO($+!_zZK$jnE%pfC1a0l$x0us-R{1mi|xZLiF;_(?b3Yj7+v^ax+vY zIgR?wW|Y|g%4|ki>Rm}G_!GHWx1@XyON!KYxt%4mnK>olM9e8RVNUVGoN~TyPNBD6 z(wqY2I=+4&dNoU$RAvR8nRuNPbXLRS5iji!MX=a#tI9}bnSBr@6BtaX?*-gLN5_nU zSNz+mNo6*2&Xy*XdCGQPrU)jL#q2H^s!UTV6xd71WJ1%CGQpvYagXArlmr-1kj70Z zen%izGo>Wxrj!Ifn~qC#>&`PwDMiJa86|A~s2oY93 zI;0hbQ9+5*q~RnqC!0(V!hT}EExP%Kj#fq@|GqgH^Un#$zu1=YuWQ8e4}~L;fA<(_ z#DA~++hYBqPzNw?+VLpyUwz3{9{KV9e$mQV`)?yZU*z*`Cqm#ZK{LuyNk%!;+J<0OW`Td^L za6L$&AR>{6$6;{le0`YTAc$xWILSN{;SB;MOr2+E6DX=`EbclBWZIS30B(*8WIC!w z+i7*LxYS`3P{6sYym*A-3Qpdu(p^B@YXCP1VMo{3BrcePGeIBUA$;>S@l<*`pnXjduGFxNhvaYx@w=wS7AQmoh-vr2!Q5)lTs%a25a{>IAxdhy#WDfB=dP9_}FW z9pXU6j7Ghixeq}-G}5W|PsqIhE%{z}6~fo$Z!9VVt6L`FL(Qb#sL>c~z3_|2m|%Sau?)xtxk zdAKXuuO2@U<2a>YBEn>i{q7T${L`9(=;EM!r z9PmEkxggkulek}84XX53ha24AJ2?4}I$UEm$^8x!_a7rh1KahXf84%fU^Iv1{v1a} zwxbvUK%AhoY%}{0{rKvc_66S6>H?2CTph;ZF-e2B0ASG99MLS=y9}0kE4km@ej>LTxcmh&Ggvw#OQG}(IeWj z1x8!w@$l6P?F-Id4PqS1{)ANw5#tSl7@PXoY}p{jh4%TiD2hNWRCrws#mBc0BZx9O zder1U?Sl({oT@l}vcL1>|7WLE{(lylfZzW|SONwSMoPe)DgQTV1gr@j`76fzf1{i4 z2hauF+IaJm+MPDub3Zwi<9*#Hp~w5H&8PWzFDvhm@s{(=CFc2tpX_eud~*k;#gjPS z-1~9p;k#s0*x@@p=9|jbwBc(Pe=ao3V}6pm)A)1Sho_Q1fA?YN0nRQDJHV%hJpOW{ zHoz_AG4?;o8gPuFz@+jn_9oE6cgFXhM5Oa(LFb+1O;?A(fXDZEvFznWdJopUv@ywF z61jO#?Em6lY;7juT0yvoMx^^99~OU5ez)M?`fkCsUV2s9)PJ!xDivT2IPB47k_OCy zN`eZkLzpC>GC`ZfAxvyt5zg|avbCh~0Bz*XjRrhY8OBKksSE@DOnh{6b=Vh19hU2% ze?~VyRvm>=N1Gq{N&HUZzr6QPCI6lGerW!y+<2Pv-;ZAo&wplpc;6mPA9k>}|B3k7 zx;`AQ>BAoAz!^DCO&@laF;7c<_*WCd>B9-l^kGj6efY)$d#w5}$%lkyDsk3PNQTH% z;w+^%ghQe_T;sox!okB?&nz4~7U9sAYMdoMR#d89#pZqprG!{BbK9 zvY7uO$$u(b1>Wm;ZFoM4$Ym zcBjn`DK)2ZemK4(G(kW4*RTYAdaTcU|DQ(C&DLjvtgofZ5Mf_R&1fw0DNCFXT zwzAvu8dZN;xf_<=DM^a$+}y%>qW@@#a)wARpo^O(f$ro$xh99@zw_aG3)` zC*Wy|(g#b-Q4X~R35m)MKf9neZAs8hjdoN}+oWMXg!T+mFr4dX7$mG&Z_>@WH5a&uq027%GoUhdIz=plKdOlg4T5&^kfXQ3LB;Fpo%l>n#J=@GJM}r!p|j7CS2<<-7;g_H zWng}1{TkI*UjIK58TeqZ4qDr2a8CX%opDgLZ>_@_ zVOjKCDc;hoyIW*;cV_suiSGWSS$DTkcX#scR=4P`L&8)m*~GVtwyLS~`A7nfoQvAr z8jloj$*EgRwBXyBQ+FqR!(gLE=MM{AG-nT~zaKQ{A^d$^paxuXFx|0C#V&MgAWj*L zja54)=9YK!zF&z|Rkl-7NT|DcX-Sa8_qg@@dC%Xds$~2$-_QFTrJYS%$LNn!z0-q3 z%9mmkxREs5V>xducj-;RIzjcAKQOc7!1uS9+6mlo6d)dP0(ig%QH@i{aR;*9xImZ? z`#_FoC2G!g&r~y0l*(pzhM+z=KappetaA-{V!eNZ_W!GV8;D&Hf<7=KzVzNi+)G<_ zuNUz>zD8>45)Uqb*n=k?^JCd@N|P}^t`adn@^`YkR$!6n+bNOh59a?3l@ckk7ZxHI zh#<>XDdI-`P!Y%@ec~^tYBK2CfC?Zp*U=JWN9tFwD6GrqR@A*R(@lXU#DHNb zSo}AH`k%;mv0&W!8WaPtBA)WMK z$8Y^gRTnsvvF?d%0zTA@1wrVtlO8bsbjd-CGTBkl6q~W>&V>8EL!LnkdKONt8|+s5 zB_UWzV6tO+-8=ohR9kEx^7TwZyuAJc)ZkLGlQOcs^SjNlu~GsBr|Cg>Cvv6gD)_NwQA!OSF6Ya_< zdw>Lo4Qo*caEg8R;7wntrAyFmPgrG=yOq^8#bhU$83+9%37{O+?3LrZ6xr~Z*f)-R z4u6X`->w^}qz3YjWi+~$_5u+q1xXoiyOwvsV`+)QR@|p_2?Eyitc0h5GOUhBo2)Lm zj$}vK=S|6P2MUsu8O~)N7Y$Zo!O>=QfC$niSMG9wKT%f}!00pMm0_;G<~r{C_8-4Z zxbOD2e;H$o!F%_iZ{yz{x4%R0{JE$0EPgM1_v!-A!tQU^m%X7TZ;gFBnD8F8q!c(} z-@SU2z4)A~yA-<=SD*({@RQfqUXQCw?1Ag;^$vWpL#yba;OZ5JAHVX8I?gUYQ}U02 z;xdN2mK{8bKJ^NQ$!++IYj(5^K&4E#v+P|q>=`FgB4t3*GReh|Q zO*=`vqvKr5+?YDR{aTm$*x-ADC0abf%-8{Pau>`oynBfmK96g~T0-i4d-9daWOv2! z*s)3v)Z9~vnF5p|sXjI^->r;uz&$WIhGr)!Gmpw3xC>>~!y|Q9MsaM8vICg0O#~5j z6L8QveDIrq{V|TrB;L9MICLqiF-Wu^<@g0E2fxYD(j91_4%hz_sOd!`$kB5Jba*H+ z0>7zv(b41Jxql##GHSn^SGK$B*_D8zbVteqn*4xP56=Y3+Z3+Aprk23Y9 zOmmP4--u$fDM}Gg)W-(wmSx)=9E*tdMcOLiTOHLL-^*7+=3{OJR1Rgb2N?A^$167O zzRDF~H-L4=*Rahn*6?vBtRu6aWuoE*w@TC)^g9qlVj^Ksl};(TZd3le31_e4Mbt|r ziAMzSn@fr`gTU{(+%kak%=P_@zW~XJ0%kyq;$$fzs}|8Z)huYY`Fe@V2hSAc=OC@5 zH-Sxi#Vlk8NI9qOD-bOtQ%>C{M7>oSPQ`kck6)sc?+z*7ujKL_rX06Va9=q29#8Up zf1C0hOIbH5$k}$GAm>6#5SnTDImx(nWEyN?L8uVxul(7BhnM+FSY(D3?ZxIwitu7Z zrqWv=5o8itte-8!x`uv@SrImJls&nNQXEghxze@b6+@moTgr2%kmorLtVWX^6-Q$; z^5b1A%1{OspPL9dN&G@`-85VBbeJ1PacttMHG4H=Bno8GKazfFz67R`klRFZoFka~ z47m743(?7fkrtBErTmXUc3X*x*|=v+s2+nxPY zh2td_;rK^$9c%F-DV1R4vN3lMmyBYXqw(9@1e4H~C-fubWeu~8 zc&}5<;a&^H_6?ff45Vavv6_@KVghz@xO@i5!063SZ@BLN63ng{gl^J;z~-^rig^&& zc|aruY0cGxv?9BWJx#6-S`gUWm01V@dl*St2-uJQEeca!9s;(0suun=jrEc>llccV z8{uWS>1dp}=2X<&mpy8#xm4CnnmiBw3JO3UaXvxXm{y7iuwL5M;{7N766XQ!UN#cN z;d$TB2{XF821dHH+Y?M~uxfBF4%^X zdOTXlk`ZGw(GW$9O{IM-j%Y-T)tmf2M1)#2c~o|wKCI#b5`!I zO$gLlKNWc3j6>`~oN^CM_@u+=%j5ETn(zfrytkHk!rhB>7eV_F$J<0Ac2+2fuNH5r zz^W_`wv#+>p|(dd120pt$5!?$&E^(jy@twtG`Htta}NtrNU&xKRlKnv#Xvg5!cT|q zDh`TV`=<%G@~H?xX5<&38w=38MXg+$KrXqQv~cpre=tddkMM#@HD(6D#LQZ`lfj=2 zq4~4w=dJN)cXIWx^5+yJY5aK&Zh#<~3(229l{JUv&lmn>s#);oF(hd<*B%iyx064g zK=J1M88oH+zr~-*cH&UtG8{tKQ*-qE0j{p~RYf>oeu%{~{Me=4OvwbTW^lpc;E8|ALE4T(p6IEz_zyTWpH5i1G zgfv>M#UqjrISeM}&^65&HFsWtZ5!py*f*4{YMcRdWQ_DLc4h`f`guO&ABB)W<^uC~ zAlF3pmtCM$4YI8f(`=Bj+T}UvUrubU1JS@HvItO2q-){?F2bXm$z6vAY z#}Ba?OZ+$*{Kz+FZjk(V1LsFdK1}>rK(HaL2F&Bm7!RH#Hs$O83D{!dj9CUbp%EIt z+lq51V(eoFHF=!lNS$%fRYv2T+4XVqd^b#A&IL+dwHvTx)PtN6Om9 z?`Ev1PZ@rH{ccB3C8#)(D(+P?JW3Q9Rgq7y3T^{XX`rxe>eW6P55dI zf1>*uXrE1AZ<~GcHU)g;3OIS=L|8`t&F;u}E8~($7hzF4qDt+JD)S8}~z~)=o=ZLecGzNT>8WZ%r zU+H__27l)Ky{sFe#woGE{4H>HuJUc822_69uBER-{}~@#HXE})TwGRCCbsWVz*o&0lkt;^7P{cn9qv`x zgmr(}7qJzr%a{wR$yjV(sidt|s**P=y#x8R8P)U88CmK3z!vm<5Xi6b17~|#0>Z{o zmr7V^$w9bn-H+zP7Gkqar1*?%r`$xEq33~>6wbR!6Sl9H#8>RI$1ZUwK1M63&1lVo z*4{&F@9C{Qf3aw-!0CF;J}}p{^boLtpXczSOvfIZ4AB#u{0J;NzFMUx&L){cbx_P4 zUoHPcPrDGRqm~<9|9|$r1wM-E?0b_8VS$BRAV7pDQC5j2)o6kZZqyBAH$f8E5Rzc! z)~{HRQj4$)_{t@?iDWpe(iShRw9<;Ly-Iyi5v?YG*$BKCE=9am5Y&lDHHd|P)cyX? zIWx1f$tENaY-^jJGP7r9&hr0(S&5~YTB^{hG>%|})yf`%&%w067t@HWeSw64f(JNT0Esbv>*o~7K)y_uv#eR zONNCyh>`KNlKf*W%>;9FQf;l+Lo(91U?Dcu^245aCo;Swf zp`+GoL!o-Q^8Ce?A!y0Vg>vpMy+qom0n_4$r<7x1|Pwz|jfd)Jt>F#1)jY>k5>l0EyF_lwOL8Xw(=n^z{9K z$p1*2gWH0%kH}Z)@2H6UAWl}@3H+Se97w9eL?p8Dw$vaRzL**wNez!QH2iL|+HkQA z82tvIa!S;POD)Ck729Yz0mz2s1WRC8%(<->bDnY$O(rIi zuVv#%KvJ&qBy9rVdRks=WMNl8FQHHPm(V>ezqQgr*oJYby z234p08Sx)G0dXApV*yZ~3K{r8=)V-B&BanKfhL2NO{^{J!`CsBlYp}?E3KVQ2^5+? zl@vUylY&2TQsA|xi2b|NS`J03Mh7sx{QS#WIS~^}lps$`a25-p$2N@^00j^==!>ax zf*c?>C8r10NU`eDuzTCG(u5epR5c;7DUYUWOgwp75j)(sEOa;V-Q~!q7t@RU~oOeKgD+17SSup zugGykxK}-iXyB*XpN8*&RiNJu-^Gnkq6_)f6DA&hipHiY%MHxCe0wu{Q{}+@_aai< z$Pg?DV3rojm=jZ~^yqOc6wR3dR@4se>1T6%)0e@W4z2$0Vm0w~Q7K9EJL&UUslCq~ zCwlA= zoo`!E46|M(V8NV{*a8Z_#tv-Y*QePVki%qwdMuugP7x8$GAUzz%uf@iPzknm*i-;8W>V~LV$rliPAwDd z4^XHbMi##gsRwF5Ln_6Gmb>1i=r+@JKR81I$Q($wO4TgwJEF%p!x zhCJ*{sb#Od)hA9OxnmW<7X{a#;5!q==>q7UufO_ZGOiw?+4joZjUJ{!FOhOH%`7tVwQ_!I9yJ|+f9KIxEnTO2_SKNPMJx3XF{GS6zBFf z8!K#K2U7FQIXEYjeP`st7BFFdDxzk$PZGWowATvMb3B2qwevcElf7$0zyLsLZT$G+ zWCLcCZ8h<9$r+gu(~hb_hfBMfawpnEhXkU?+>~C>6~wf$!W}+^71~%YS}&kq)?)q9Ry?fO>qYik$cs)h_lt+#=O{Y~I)Mi_IUK%g z2t}8H=DTbj#r|b;NJW~pPAMiD;sm-^mQtihA1DlL|7`f)5wl=;5$Y`q`IN@z+Tdst zT#i&(-(?1wm(x)>mV=|K{Nkz4F?KbSw zOko+6tW%zfw|xr;-=MWD02~ZrY;$_zCW*NcM8iwC%w|XRlhwvO)J)Y>yHj~Oz}u!A z%`*wFdWe1?ZAv|=%T^Af2z@}a1)|w3y;(3dQ}lyx+V{Dz5c>AreBW!45{&%LQ$^wP z2GzdJ!0W)*(v>Bx@T9 zzx4f3Xpv;lF`R(c7O{+^Z-_91*3bu?_hUaJr_P=7T;m#mzXga+0#4`Fhg@6X*Ov`}nTf2T)#9@7iYY5by&tNq zwpQ*0TxIp3O!eVJ_1Vg{0#0gYQb!4zH5-E!oDo@rM>QCm0>W3)JDAelTj}tno-^d9J7QDljdBb?3 zdeV*9l;6=&-Ww1NpP{d3;}Py3M&XvJ;(isq0KAUk2k{D3s&Wmss9Zw=ZD+u4+obk3 z0f|U$pDt3{XOf|!h9V9CFC+*Y(v~rzRxxf<)U@`-79-Qz+rTdj5(uFmC`nf6Kx15K zsGgwTh!J=qdnZuBgzvXT2?C$`o6_LY>O%&ne#+2Sxswe$sMzQZ8t;V`3?l*0Sg*?0 ze6G--qjU%$iuX0=i?}1wS;H)9Ool6+E__D^D*=@Z9Z&t*KP9=>o7KczVlIWld-mQ zoR7zEHdbPo50H>YJqG;j4D%mZMtkvmmHluLLy&?E2GF#DC%^@)K>~J2B6AU*0)LRi z83j9YCC`>>fWW{o;&~b{LtD;YsjTFjf(1`G`@kdeshmQZk_V$a00R(1w!l6qVOk4w zbB$9VQ{pUOg{(WnSV6!)#`lzw<;)F_FI!WNaPp(cpDr5)NCCn<%1=Qc5JnKciOJ#O zB?g#`{cGX-SGk8?z%PL zasAW7^OIs+|19JBCu05i8WUHjuQ4q?hSQcLD8KOQYwVwjFeN=KlZudT#H!ek z4aL750T?85gb}e3P#*zH*Z9dtHGUF=mi1i>#zf~Q`6C*va$o-o#7}m;zw6chKF#}E zZtO3A#QVF~_Ak@lb!vYf=l%5>`^z8k{$6&W`m6HmYufPZ<%76vqV*%ID}{NDB3EmrG{V+D#envCr@;(e{zY$d9;-&7CNFJ31_zKCu2zUDkL|lDEc<}c zwvxvN8SB^Nv6+VYbJhCKDvu4ri(DSNjJ{Uov3L|}^4RI^x;z#_9DC~Y*H#{Tc}4_t zVdO8mLH^gsRtpZ_SYO(O1aBI}QdV5v5xi~7?g-v`)I@!-DC z3vW*%z`YL78oV{5P^*8x3L0mHx8LDKA^+3Yn*5JK4c=DK3#$B&SH9NpHeuR@gg1@t zNI^s`)|apk@cjo^r?Y%N>2L?% z-wxrZz3;(K9Wn~XiMmGCs6)qju~pgqCum5Zvp&d*q}2X_!gp#;OOuqk-+!nD-lK=U zcM$N0^>@^Jhp-Uq9aw0VC$z9z%>J!5dBPb-y|0l@%nB78mT}Qc#^+>k#}*;*A%fH> zuAG<$FKE8N5R3HExk-5PDtj7=E-q zdD$l9yUvdHt^?7=d+>MXHQt}#^RA9})SjYCr=r%9g&XvNV7cHvGoFf=LML$;A~V#>(Wp&r%~3C%)eah9Rs~g&F32WjXz1-Xv}eW%_ByoGNl@PeOdkG2V_*my98a|OrhB-5C&7ZcDtK80q4F%Iz}vI&g>95 zgr!0EW_L7GKYT07ms%)>B^_1ohE^<_f>kd;YcvJi))m)e^n|9uPFJ*(Xi^)EwN{YV zFc~@1B#@yShQAZDSb&xRI5YtRSqtoxFeOvO6il|yWC!ueRGPbc@fpT6n`XeHIDg1z zAOSN#HmEeNIBf>_=wS-VXJD#5)1z$thd%mP^lFLFg3Z>oU^IG<<0M9pvwI%Y8RJLO z=m0ej!>Y>ir3mSRv5VNo7=J=&O*xH(o1(#J4$shF65H)TpK_J=b^)tkLV!jE&g7

xX?r#Z**43vu(oKsXD=R!9UURgeE=dMT{cR!$*@(Gc@Q-}gn2R62%e z9j!_9ikyox$#c+}8|O5B#?EWD_DyoCI0VDpj}`uwS?kTOp7#N>)tP*fBA1tZ)v3`y z4-9YhJ^vKV$)a+vubexQ4DUmp)wdWoE9eXZ@YgqP<|T&KZ7I}e<2*2DA(h*BiQ8h@ zcO3>0TK9#7MB|^1;4b>M>2IZI&ESJ4#?{YG6`+xBfg3%+j`N8)wg&ys!7)wyu=SKzYeDRj&N`=tS!ikfvCT|zz1~I zHieC}=DLlU@#ccA_awD^k($qTiVMU)>}wu`n+0?PfN6P)CM`;cazfgNT>ok8>(X}7 zRlRqOO|KIRuU-B6CDQoN4mG+Y0gr}@lY6G5dE*@5xuL!V?qpNDCPQSiU?Xp%%4ivQ zaF+SecrL-%iGikZTXTQ2GuMPC?|gk2$86H=hY4_;4EgjKiSC0CMFK*==^FTQjZKkVh_^o!w|$%2@~WYTv8(?6kGfom7GsS>YkzCbJS9TBz;Zv6iS_IIzM7;gap-Qb z!9lB2uhxrG3yhe5Nk!PvhLY`_HsT@5Yi z#}@0SQVIE%V>*iye%|3(B+=u{U~|1pZ!A&EjZ8o1!MC=`9KhKshsA@+`8+5{#?UAT zA2%&8Q=X8;&zlO!433Lg{c*Uw^0c(&#LE{hv?j4#BJ&5vGx7x|LwNiaG7mW(=j%;8 z?bJC{5Rf69DU^7|V`O;lTOY`7KfxzOhsW3z5529#TWx~j>V#VE?4Cez=XdTa0h0GL=33+Rxo)R5vu|hw`qJ^qMyKBG zG+N!cp%KmpgGSs>{A7nAdn8XW!qOUE=NaEHw42^5b!LYT{n#{x>N~Zs>in+9FcXG~ zuS;Ujf!~1Z_4pT;#EyY)#5v!8%5kySdidF^X7jPvF2SS7zsj|P(^D(ShAfrLt%k!&O&cPk6y$yJXu~}Jts5!T~R(!IX|R- zyzU?j?Sk2xU_*Lp2f1FtfjXL9?@Z<$P;+d>kI;tE`@AOwBb{uRP0D=_&>(~ zIsVP~_v4SopNt=um`Kg1u1x(b^}O_GdS`kneIWhK^poiqXEK>hne#HA%-o$>mVH+C zjBGCZ_Uz5s2eQA)F3&wXcVX_@-0iu$au4TzojW&wQT~JZPv`H;l{#e z3MUuK#fjp4@yg;mia#%&QW`DoEKQXTl)hPdvh?C|ro5?qUip*dyUWWe&#IhJ$yMH7 zxw-N{k6#wQI(}pP zGx3uX<-|l{K5=E@9f_YOPDzd?cP6Kj2a?}RKAF5Mb#>~-)MrvBr_1Sy^nCit^gGf& zPoI(*&FsufWe#M%nRznv;%p|nDSKY_li9no%W}`kosrAs-k!TT_dxDfx#jt1=P%4( zo4-AOSN`Gruk+^?E-HMm@ae*xh3^y+#q*1o6|XMdSo}=!f5U~S0AYUs=B=P?AnF3YiqaH z?y5ap`*n>Z;wg}8=f*FJe=z>(_?_|Z#1o106PG2fPTZLIOycBZIXRJ>PhOdPNAl;% zQ&JTg_JO^Vt({&=*VflwSG%qb@K>Ww5&FV$f%d7W6{Ij)nwexHHYPUlC z!MLrl*pJ|UE8?fc%ki`0*8u_^i!V)_l31O%7!Ytcaev~;#PP`nAmApj?e64*$zh29 zHL2@UH>d7Motoa1-k-iSeQo-N^peaOnXybWb5Z8<%zc^V*=%-Q_WbO=?5){{vnz6^ z<;uCUbJykW%srM{nm;AKI)8Eg#{A*@{rM;J#}^ufD+@OjZY$hfc(5>BoGM;ZyuNsI z@s8rDrA?*%rAtfKmTo95DW6duD>us*l`k*fS6*JpR@PO{uk5SbT6ws#qIz1jTs^yb zUG>iDW7Va#Q);Vg7uRmA9j@J9dy?4sDl?YH#~bl0<2S``i{Bl8Fg~1^N?en;K5=v6 zj>M_SP09VqOOw|oZ%8glosk+#HB%R*E>GQ;TAt3P*QL)-?@QmBemK1%b6TdHIXiP* z=FZGxnWfoNva7QfXK&0N1_VEuJwDgSU75QncU$i6+=IE{{8auLh~~}tJMyO%HWl_4 zE-hSJxS_D5ct&xo*eqUDyu5f{ad|0QT30&1w6An)>EY6f@@eIA`E0=Lo#n^MODm^T zR#z^r+*mnWxxeyc<@jo&dS&&d>TT7#s}EL(Yg4srYS-6puH8XwoQ=gEhX0)!-xS{; zzchYr{D%0F#2JaPL^E+w;_}3OiRH;GAocv@zT~aRhm$K(r=`lNvs2eW4nLM!nm#4H zI(>2a#`NLz{lLb@XBwF+GdDrL-ko_cGn}2uUX#5Z*!Yg@sku$L{kcnljc>>;$)Ayb zWqx1&K>n8eJ^2TLv1)}^7WNem6mBWp1F`&dp;mllabNL3@s{E}#RrSOF4jt~1WON; zZYkXZsQq=RR(@r9A28P~<-_IsfxV8eG%8nCZh}0$yYgUVxH?t6rg}ZF*B#YUYny8O zAw#dN-B2T4#l2wblK2_%v3L{M>+<-0@#TqZVjZy8zQnDGhZ8H3rvZDNoxCo2XY#S+ z($p!b)v1etvks^3Pd%ABKHUIzzA1fM`tJ0D>0w~!YckhoZqD41IThG>fA-Sswb>i8 zOMsona?RXDxgX?C%xClK^5=u4KejUSeTA>}Dlgw=+PAp!@(1M;t*pGI@?$F}-&g&b zm65Njeb~*%_nW;!J^m&u8*7PITeG*P^d}aBj@@>!$Jy;&DOjWL_To3)w9hFn7o2vV(msYQ>-cVgq zJEJyMYeGkKdF?*JF<&&}wmhDVuY;awU;Nhi!|@e~)1W7MU*cZv!SZc5#jx;s@%zdC(Q`ugyg7MC z@>J-8_NOjQU7NZgwIqE;dMw>cUzEN)eP4QcCYxE8IX|;6b8F_|%!=%3*>d*m>~+~Y zvyWw$=1$42&Rv|lF?Tq3f9}cL@%cvn%KYc@OA610`gaIo_RYedL)E*j*nl{_1^T+@ zl!qZoGv)7<|GWG|`Hw1RR`QjdmEDzBRc0!eRj#Tmt38Y8f3LZiT9VkEcthfM$q%K! zo_;L7G}F!edFCqM?ng7v&AudiPWE%zf64wl`w{3Zzmxyp{K~@C!haNg1pIY-@qyxR zipQ0nQ+feZp*NTQrt}Y`&y~Ib?0j7LDdnd_)!kgKmp4`3Te-9Hr`1nDK7X(JQ1$WZ zvf82Am87~p5{rEn)F{UP9D2yp6CX-^HgS96WyxZ4Hu<&WZHZbu=g<9eE!nX@QE^I39F21gKMe(i04}tG)D&1cCKHz(K`Q_ya z=!XuMe^~yX^2;j8+AC_4P(7}!eH?n<@6{e5{atKH>^SIspB_Io{$i*jdFb%o7=I_& zaC7_z&;^~CSeZCIQA?Z)74-bXWa3cbbBV7czMXhUa((hp@(Mu1_mlsVe0u6dsdTCc zopB>I0iDso)Ssumo_a-kGX47WhtnTVe=2=@`X}kfVGTf#@qaU~%iNy%cIL;KP1)Vq z*JZEBzBT(HsH!)?%I5okiskv2=O>_NIGq1s{(tf>E9`;({~rop1myn$@_ALURQ!|T zRnQlGqxc<&Sh}>gbXn=D(nny0^F6TnS>+9HRsKl%U(3f;Mk?LP2P(H$zFqlA z<>cz~Ag^~;UsJuhT7s_O+S=!9U#!JWS`xbwV)wcDE%CDxn-g{D6&{0*Zv|v=1Nww# zq@I(Sfe!zdsnPU~^lM->^O5wwLVxhv^o5zf$hc!PJSHD?3t2Sz^MSewa zymCqG%kaNr<0r+}$KMtIJE#mJi4P_|owzIUUx`N&r^7nr;^YUR%l^;gj@0?7x1_!V z9q4_jhf=>t#nR7CS79}IPWn&M7eZD4a{7DeJ=u3;Z!+q_Gjf+eSN2c2U%<-oWWdx5 z^YQ%I`I-Fw{Oj^>&R>^*ApdCo#KN}1OyMsJpE7XulR~WcyyA8+)!ORonn|G)B~>J`=Z!s_8AV8zbb+rX=_xarT6<9`IJ->K9SsT0!A zProbuAwa=h>60=mz-RBt{5(U}eTCfTa$f;1Se}1o{>=PvekWl3EuhV(^Z%azE=2#> z!pVi_7b=Ad3Uk1JZ!UbS@ZG|HLAKsie4@C&bVccxrDMx4C~qmhsr*>=#kEXrOYLCo z&uX8n{YULbCa(=GiG3IR`Hc9N;}4}CPaT*3Kj|~mL+Py$#ZRaI%RuFeGs(=_%sGI| zJ&>0jqj$dwy1p-G9?1MMvp;(YbbZ$WK1qf?n!O3uV)x`vC_Jq&Txb;z!n*r!3OkCQ zD}JT;?cz_1|64q%v=Vx|OMyTBvGkSFW2Ixte+U}Bteh<8%WI6)_g({?H3Dig z`t0;8(yvU>{k4wEUbylhhb?u7O%hPX7e-^sp9ISM9LoM5%`4VvU;Y=aB9_sbq zWj~euQuaTx|D8Q1cXIB`+(_>K=B9HU$g#KPuFAa|G`uBO%WpPT@Ndk&HU9zVn7<6Q z{4lH!o?7@LSjUgTI(`pSybl)s4Oa3$hL!D!#gmHh;zPy9i_1#8fYmy%j(>0I?_ouB zPwCOpAC#Y8eqlLXu9Zj18(|IDF8{3j+wwCjr&kJ<8sMl6?D86@i0=TK|E2PumB%V4 zRG(3O39Nfx2Yt-DtDmlZzWT-Lz17QV?}YsLLhYZS^8XCh5KCfrL#R%QKOgx2W$_xU zBsL^>K}Bbu%7r(`XS)@Wtmf9zvHsZdtoo@OTdud%KR|%Q08Zu|AAHUSave|Q10>E zvizyAd-c8i&!NLv0XEWV)l(qaYr zxbMNf*3!}n=;cOWzhhtN&q{w;`rFcnN?$I0we)YL|19k;j8o>1F9Jr2iS#d_PJ5AbUz~ckzeCKPbJe z^gO5|6Xn_RYs(K*9`jDOUa)Ab|zCdq`w8bJ!^9t zayx)mSHNz~3B`@TQ17ZdRNX}K;S=WgyW@YG{7`Z_ zT?4DHdo#bz{1$LF3e5eL?2B?gE`6x-c{2YOm&BmGjx}KR|A_x6UP~093cm{WT;7_z z3Tnc?B)<#Y<_cKRmQr=-IKQ0wUaAbcQEk|ZdR_X7^a+`j&~=`Z*^!xmy7f+&>2T(L zh{p@E6WMO|O^|25$-W?WdhV>;Xl_UDg4~;PUxxj-M{|FWPvnbGk-Pc7fIXQX=9d+o zS$J9DT-bB`VPQjg7x?JW@)Llz71a+wKlH5Hn%bveHU86D>>DPwUI-oKF!UAM;;)Jy zi2pV879Wp)0d_)HBvvJg&?ViKI40RmUX=V8)U*d--{C2#X8_uA5SfWoJN4Ss+kwS? znEH)TeJ_BH;@#=Lg-Y^mh*m7~yv&P?y|rn;))Pjr`6{sHK47ci+!Mgk&o8{I@FA#X zcNI=5u7F*#_W*WYT*?4${-g9GVCOR+qqabQIS>89$I7nb0GYW;ZSSfj$cqV_-yD)qffNXs018gxumsB&hd{#N{w!~=<6z@FIClYf+a zVe<53(pY`(fVJEu5TSoaW>f3Ht}CE!-wHMR@zk>P3&E0XW=&>$rk=R~s?Wj98(`1j z9hnapJhc%LtDtB8ROOuN?&_ZERZv;}6?RR2X7sMhp=NKXod;{1 z*dt3~kApq0fF5su;`7ks{UGtn#Bs?JVgKNz$v9ZCIXPqWdmn{;lWzgimZhEsU0(v~ z&H1V6)Erp!SE+Xa>PWR;kxoFL``h$0GpA-_4dp?|exc7JHs@i+)^|!U(I_uKe9@TSjnhu2DJL7)BxBBkR;tBKAmh5I9y7Q-= zm!3>UI82xZ7dF%w4|DRf@!1IU7VuW}*7DZ(#(5`D0ryH2{)JtcR`Q$ql{n6X@!+_> zl>BtOWz=z;3>(!OyoZOJQxSa2>XHSXVBTPUL{-c{pF6;^*s{v9!E(%U+49^HVy#FG z>}{Q3-DKU(Irh#PY%2xpI~oMC2G;wAt*R!loY}boBzMOd>dNU-T~1edS8dp#$?$!P zUF%$jsQ%gY;`$@l+d{0$1@3e1w4MM@LApq@r!1WI5UTtXo^=y7-j9wp&ggASfWzHw z9D(0{X9V-CE_#LzbPSV3-N}+x*7zVeT!B~EGy}@bC$)qdxKGyOUAw?4D}G6 z>$>L&&lYMNWyhI$l3Ly--d13jo)Ux4^ltYaWf#5`&sHF<=?s7VqYnx*d*S!|Ejc)? zR#?_stk#Wm>sR3NbX!?gVk>r8e-Own(CI1LHJb)Q+eN!fZ`a0tkLO75usb?Ax;w@@ zrn4H8;oqNfKK(^4aq5-z7`+EdLvb*vI2$^{!cK%=U*z84z6L)1;tushqN#XTkIg)- zIgR$_&8N+6w(g)^&$(nXoiIlqbX>W&hqW}~{lSHmR- zvfuo~{1O&K?4dZzaMoEO-)4*Tfc3QO10KMWf3*79B5hW_Qfsipds`-Ul%e$iDX!vd zzod=ie0^h2=g91c0FM=Om|=W=ME{6)j6~Vn;yA`m`c7wf47KAsJY$rzO&uFxoyA$Z1U7u1^^WZ5^4e5Rs>;-dA+{N? z|2yITZ`*#eedCl0(jv7ET0d2B#RQ5N z3+kK!zqJ~5tBSJ$xO2F32B-BQp828ki!-yUfGg5f&J_**Y(WLt>H0(e=vEEg7%tDS zXDE5!&~ie-MzPeoz9?4L;52y9?r9}2o?FRJx34Kpl=kQyLfJd5yizoDtH!7ur_@*K zC-8@0F_ys5oHt*lt_Oql-I8w|NNxA^9Zg~Frl935mYDh`=bHGUZP_kT0ppWmXPt)hZDQ$$Idr8;vT@P^=l$CG1TQGFfspA<9 z!{}-BoevoQWPOHXuN&(je*~i)EfLCtWAHp_e zg>|fmn$d$kW4U9M<1{$@zT*X$MR!)9=WFI1;#>tA^A7?ar7r^Io}(^Afp4STtw1F4 zp5b&&i`jFVJv%*zVa%?29-_i#X9rf03iC@Nmp7lc4&2#T_=3&inWm;S?d4A!<(P6w z`Hk=N1MweeI(x)LJvE{;pbdT&D+c>%jL@Jvb(&l$|zAysd|fCKfAWMlKIug zU`+QIC&5eaP|||Ek=_zs)$2hYZQ>n4|BwWNy6AlX%fOFb;_D$q-N>ZmMn#NM`YAWn zPH;6B&3UPRUg}>xG~_EYv( zb{*C)mb0iYdu6iYBCOvNYMs!3yF2Ic3@cCzZ^B+?WS`hv)m+`E6PKyk)%C{uP&&dX z`e!}RT>!LL%Uz$$>5Dr*yhCr#cvQo`Jo$}cMj2{HeWMe6)X~%)Lgic% z>u!Q~9qZ1tF|BD8kLs^vr#9A68Y`!iah5rJ1*_FbMTlV+L~B23!(mAN)=Jx3@y>^_ zvZmXYPyy~x=U#EPW@YcUaSV`(XQ*=|dgp#Py^nYn!d->HzCXIU!ZZzaO@gm~%*-t~uON%%ai1^`>iGYS~8j_7WtU!)l@SHKF$Punx8^q>ldz zoBhI?$>x9`N;T&=+dSJ6I)#07-=A#$T3$`n%EM*!N4ZU8*X+^G!}B~s?en*1v`5)H*!$T>qg7XT zG?vvM5l6-jRNTXkbB?c8guL&)L+~5q*9Z6?-kK@hNI&CJ>56 zcY;zH=`E;++o>4e-66&$?=5hYua*^7Iw)P02}+`}7GuM)R(gbZC z{e{0hyS;?H4ky-Vn42~Bvvf+44y&UYPdxx#qCYz+Q7;0^MI?oXjiCZz0sf7s}E37(wKvAOcXHN&COYl z-OPi{(@=^Y!m~u6;qh3xvhn*Rjdv9rcc4}VJPph;P?AcJwfv-2}52JmqZ_Wxb<*JSLne%=@IV2Zq@B^H=`=d zKxbbE%J}3?M^)(KnJZOG!)Q;(x|AAtjf#*KOb;t9u~HbPYP3>MDn#GVI!c2i1X@Z` z539Z9llWV*;g0yHLMP#ZxndQ{@>!de{^zLH!rl?CY=!+AeE&y!(?ELDJk$oEqW6*2 zA;j66lg1B3wA!^9J|>r*SGVh4*?~9Zdn^L&Zqviv#oQYG=vemE7WYy2DQep@c)!2h zAzukH1Zgw42x0IsAn`n;oC(okz)L5?C}1=YNUI}l1@k> zXzBrq;4MliPT0Z*s5(Lu5v;`nn3r^%OqtZ&D1QIf`t*I%rtH!wRLaE?85e+$sfCIV zM=w7I9WVtQ;R|Y@=qCo?GI&N0pNo@0(<*9B=z+J&9{3A>gW{ZIZR`W>3+aGAutpnG3YW=V5NIx|~RV0JfUmdG1qz{gg zdvPlLa8^qMZl6Z*=Y!#4L@#LLbc;u8`=ZrhXU*bF6W*Q})V`UH^^QZV*LRLg&Vt~@ zdYotjog-Mg3#lK^LHcRn`%1eSx>|Fh`I!Fyxz8BsN%CxwJF+=_?_`uspC(rb2Aac4 zNhkXxjV~Cd^n&Y6q>lWej^_6sz{fKhpV~f45%hqqR>f8WciI@(iG$$u2kfrTD6>wj z912}Sdi7smdh63kJhaC;2Gbkua6EUsMlT74%Z+lDk!-~P>flr7C#S!w;D2H%?fBHn zvjX4&9TIoVpxE>|l zkyEKBS=|xt9_}RfHurURBTsvF%vw0JbG-Zap6o_xqa3PXFQcC^-&hWU-)G#0WywZo zUP>xXBYd1-Y&xmkg>#CnRQ6LRUMdCEDr!TVlEXQ*6U{4lvR~1H+ggUe8?8sT6Z~%^ zy39MPr~souRY|P2yY%HrIH>NTh9;qf-F8%j6~FB405%`wTJL&*>Yqjr(nHajBK252 ze?92+JbELr<1U!O6u#jC z^nye5<&W@G1z0k|;O0X~5$w`H%XChH9qhDgmfM!!=vDrLDNE)np0hr%zU53Sh$>tW z^{tyNfj6*}PHV0003Av$t){)XL!4+2;F3zYs-i?!s#~ANJ14k4Hp`T z^RX&Ux!s)KPlPH0#!4sgh_BzRK^;uO!F!rF@Rt&)TGeW57j*^P^=0)r{?Od!h34(J z#NOE2;1OE{vcF2@`;0b}1-C;@Dt8Oip<$A}cm|LAlVdp5?{7zG6rgtKn&Z%1m*CyK zL&x~a`IUY+#?{6(K=$*`T_!l*!mQN#dM7H0twwL(Bs!$i>==ZJctra}kuXMp} zL07A&?)M!*&Rot&`onil@g$>NGw6aN^;&q5!`zX4ouAxco}!)_?6Lixinvdo8E=dt z-iF?0;P{~u6)vEgy5oH;xb`LKq^BUnT7VX!g=q3XVy1?s1;LZRGFD;VOX+DfqM9c(04|#0{zY@vP7J z`aV>=Fn1BRj^5BwuFpO0+u&slk3tjrl<`z~(?;LA^XUl{Ri763PS%X+sMi@$_8tkL%vXc;O(;;?GLFtVe zC-%%iU;PVGa-k(Qg_jtD^L-_p(;fCrdbKdTdNrxPbx|j&d(kaKYVFcU2~YhT_|HI+8b>J8e(=li4`0%@PAYAz{lWz zp921f(c7YlywktwBi&g&g{T8frTb!oXNTt?mHje0K^WDblrb7N$UatIY0=|e@YTO^ zs8x+&jSk|Hy^BlsHLK1~HPmRemf9?}>g7fg@S5wf3OnMN9dDkBZ+0Ck@qzg@H829b z)NE-j`}xT@g?Cv_fz_T{UgI;(COdkem*!zrmZS5C!+SXf-DkRO5gzeNtjhPGl>%Ti zJL*US^pOr)Z*2@*L2-LIPUkp#XV6MA*!rCPf&H!hvpqYWj{Go)@vsF4oaETya1=?OA&847w(3!@D^@O)zxj$z@95B8Svjs}gc2ABD2NJjV! zFDF4QMKHXtmE3B6R69*=f=)D1)|1olXqvgAxiPM=Q|4FZPiUcGmLh17%`7ve3V9Q3 zEu4!L!PbN6wNm(|U#R-UZCh=^+oaJ|_|S51>FN$;w@lRc>u+$zW_5?76e#!%x`LjE zx+l@!K7#$sAd$*4&gMMy^270UFEx^l%_!VgVFmrYnZ0@GZ{xiqz4JJm-+{@}nNF}o zgOvi{>k3lsnE=Y(O(x^1@<|B+!OWFDHB5G0xV2&ie5EM zJBC;Pv)11}mdbaAZu}(<;2a>vnt0jzzyi#1>|sY;TyJs0RH6EH=fqm9uK@MmL~+eX^|!gJ;a(8W zd&BMaR7EA}N53mHACplWCd$e)ccRx?AU)nU;XpOm`o`e1XW%nG*<)p<#^i_Ftq8k2 zn3FjLmgEcFR&mJ`4g{TChW+$Ig)N7ZcDGr4!DT#k9<3&4))=_YWV|H@Ij6tD0A#l3 zwX68KN1`!&Kmju2*I0|oC)AnKsXCpUW3@S_CsXGa^X!NCj@j`d#Q&Qo>H}PFgs$jS z;dumOun=q-B@-!Asq|Sr5%l!JeK*+q8I0w7h9Ih>P3aEG`jg*YN9Ij-NliZn{bVM3 zxag?fnKM}ma;DXzn;M9(ZW`{3ebkY+?5Ys3OGEf7p{0Db3P0&0oEGQMQheH7D=oWx zswDdszG@}#wO|qtp_zO_#V9)`oyvM@(i^Yh1bF6o<#`7y zU4lKpaPypO}Go*@{_$(Bc3k-j(r1b?U?eMijhb9?3<`VWf%BN ztxg3Tik2`1hI%Vrj2Gr279XE84L;|8QizM&eBQS<4xf)KJ1c4wY)28jB>8~pq?$J2 zK|L&8sF~bh=-#E!9fh-THOM}Pr##)$Ui9ul#t-0=Dn?x+7X4rmUF`qY^Bd=?KQ>vnKFV;;?b}-py`rQ5b?Xr8W-!J@>vd4Z zYpS0D7g`QBRPeaBZ562lmqCWTd4lzvppU8HL5@&I0l2?d@<%;zT3m;3|KM=(%Uj?+ z97*k43Eti4-0M6G>z)?3)(?15tGnvbBMCgY29-MnWcGsE9-?QX8u+UFQr!&)FFYor zQHy_euZ5r4?>-OW50DwWvYtAq`aL~;J%c?$)%)4wB*oJlmT`nJ4zzj9xQrL@yOG5k z#+jz!+pYy)vkI){C-vf6%4s!?CD>Azowd-i8`s}Cyyg!qMREK&ar}vM>>!DOSD;LP zTM6DnQ+W!^mnbW{R$QA1T0THWbzZAtZ)oq%o?1*#za4G=3C_$&hYdEg8;ays9Bd`& z5nI4nYr*KiQ*-ByxJ-qhG<7x(KV7&J#!#3yMa80^97!u#sxStOMF$5p0_JGqfy|-_s+bWN0VLIaRKe7YP{2nQ7?W3YYB%| zXSj{^?j2NiQT_J8DE$E&nhxd11`pcT7>P6Jsqlj@@%0xWxFp>u;Pp_lMk&cC5tlh( zqf`g}=)N%7!_eY(@{OL7i_2~dmEF3RfeZ_Cb_s{`jGIQTVi zz+X6@gxl1|aSp?IwjJ*2ruJ1U!71#5i|;Klz?qqMO`RI0NGOiW})RoOBsUWU5Y)AqzAL-~{L| zQ&kt>e;c9bouuMZ7&rP!ol9`s8qeR9=O3cXl&sY!FhFP3&$5)7@|<*79$N?LV)tq_ zv^H8lcF}ZgBVTL}`LG)#9l|)JbbBp(YqXT5=nB75V?ybzDuTA&JBm3=(@9zNi|%k% zmK$`EOgCE`&(b6~+MRUdmyFl+@AK)xUC0~!}#XR=IT#3R})^z>2BigN&TAVUINp;lU;EN|5ba>B~LJld~I+s9wnG=ttfqWWxSKk(L;jpV%C?xc8q#X^_c6TgmmWYTxPCf zX@W9$2t_U(DcXHj17}MVYIQ5vSXmw3G`FWKK{GIrhQMtvt~OS*88fB4g$))B}$DdLE7 zl)jB76UhBiNY@oL&WXJdSSrtm`!y*a$iXvtA7@EJkmo_tKN}t@>&G zuKpUYK^}A-FVEQ#*W56^pHLtVr}{PH_-0Ft9iaGI#sgNG$?K1wqVT`g+7fi`Gpsfk zvDbdmQ{fLDEJ3!tDv0nWYIm~CxrCWZnQN1j7)akb-Mq%Uk$P|#rqkb&ozBl|sZGru zMCZB~Jb21-6W;SL`F0A))X*X8UvNvscsn(1&28Ob0gqGrvS|?{q#NNBj^||hr}HaB zg{UcYkV$CEEAWADweRM=-L&{tH- z45Y$}qc_)PMP$-z;iJJBZfeT*Z=(9cD_t=6vaGi3;Uv9eiR8S@r8R?RSmS((MixRB z>E;}$M?D$Eo;?ne@DPXZC!88~R(&~dJ$!eg*rmrg@lek3-=&v5WE5V}8aQAF!Kuzr zcET(?C0~^tJe`8a@Qa#PuBFDD45L{|Yw!--NPUAf==??Jy!3y-(`%&L@M5apP{kJ( z$LT&Ee(MBI;wa6@$=8;Blc;qDVso? zHyzmdiR6zj(9tx~=Sb&KAg>9xEfAe-pIoiRkQ=)PwBf-{JB@%-PH; z8Cy5rL-H{=%AMSj685akzqyLOoo?hZdNo)hjRXIvq?04>Nvi+;E=z5QO{lUCBpnp1_e z(gbw@zbu3<;)^*5SFshpYE9}(4@+OL)E-j5H!Od$Ps6SGtqtHg$Kl*Ojc@C#H5o1F z3_NE|tu;DAUMhG+{D4PrtG{%lbq1pQ6oBD0)76?>o%p4C<#qGBhU`l zZ+kva+vhAt% z3Cw5b)GEgl^ut${Ofv2=h$9NLR|9{{AWp6sIc*et7DCbN=Pbgmb4DF1>25I^^=E zyO#5|Pq1TO<2@*i6Dbz&+cF$tm-YU54Hocj^U+7o^}O(O0@KvS(>o5$Vv~0VYw0`_ zIp}Q?(n}56kMs7KQW(a#Jssz8rg6*zovx+p41zJPifh6jmbFYOH_{x3>F<_s)b%zn zUqfKN?pSN!_KnA3x)@Hi5vt%IFu*r08+zbbdo|7og_EHJF7s*5*&w?O%osU@D=ZcT zGaZhV$|ONsp{@@=b(u)M_Nkr??@vGCMYdG)cINQ?O3zO3*Z8z-O>`(3a;T|i)KDI-7$xB6w#y#JS(@x>5G^Bz)q;d{` ze>=&J_9qwMa2s?zqMMseHz)L?%*ULzs3x#?B%>GH% z{6k9{>b^(``7!M#(RLCa_CxAbH+Y4eV1bXMHw3>rlZ;S#G^M4u1)}kY_QMmhfbVn! zchz8*NJi!4>@~v_Cc)ibp%O{|=f?CRMrjJdy&-s;-gsW0OY9P@4phhU_79OcdBk*t z4{A1ZE^|J#B;nOak87m>JXJF)>r7l>N8sz9qE!ln+1A<%|Mgt@(MO=@9HdSZdh9Oz z_7&)UzjD%krl+ebyA_dWoyBwff)4nMZ{>ooACLZggV{F4Vc`bgzdr650+S&0qPDIh zXqnfT3{im8V0w6-B6wQL@rC-KqTKdETAUEMS&rdb0=V(IJ=)-CAi{mVO&|`Xy%J>Hcf#9Zt!#C1%+{Uw%MW(yz;9~5J zelwr9a+>P)yX%$9rhDjZ8<6l4>6SnAzsOXE<7;%0$!_URpr>62%Xb$K#dmiwyHfX5 zAtBxZ26G(_isPPeP_72Y*AYf#92)p)$&S4?GDwX;WJ0=utd_%)?V{@k1zzy=f;q^< zl>i6NQv`c_+$KCNPdQIB;?BH-;*y44H<@!M4hP&;D&cph_|2hu6KY;>Sm5e#smtA& z(4SYqZTA9WKQT=A(o6pOosy`o!9iYz=_(H_<)ptlz?PL{xCWYRsKw$Xo(r1%75{r? zT!!NGZi4$~G^lL>o~g8sjE-EWk^SHVX5-Xdi%Z}L*^3XJ71+a+0Dt!VL?#0rhJ*j&$%kK{GU&J~NNxe|YCD=r zF8Y(w@S@|$pRNT9q?g&#oXRrgjZ$58fc@{1JX5J>l`UhfPo=+b9GucIe*bln6(6)< z`(wu|M+AN!jXk`F9qjAF3!*XVxV-C=U?0w}J%XzLnuKv0-5+m*jdM+C#x3>1u%Nf} zXPni!$c>oYl{l|!vq!q%cG?5O8{;WLF7_0;-`|7-kN@~femYY5%qf?LZ0t}=ce>3x z*4(gPt-!`T*}L;efn39L_1g9q?vWx|84y_$ttG3w2RnE>Nd6ekt4JI%I=x3Vn2A2{ zg_CeIt)Pn*$m0$UjkloC42~>h5(?*F8 z!3{K-o_djfP%rK-OC=r)Be(~(?k#?WMkx7%JlV+gc)-=|Sg~tmV&tRow^0HfO{8HO zabE5MU;K(5;%^$u({@m@n)BnJX%7cI17>NrbU4+r#M0~b0y*5lck$j*2tM!@Zv7H= zi@h(J&tcLBUzx!W1{SD~I?x4wXKT>^W?W2PoylZC&bY?&J9klO1M!#DBc)Rc-|%kF z0nZ3BN0*EUR)!THnW=z(Dkg}5Q9h?+=FDEDTF?bonYUVFY@I;uue2ZS%h)xG=+usb zX74yYI73{yKpPctD|W{tu-kPW->+a#BS@V@gJ+xSJLvS!;CCn~^V1F7t>LozxJSTb zlS-0g!vYAIfvWh&@?Ij5)+hCthnV5!8TS>tD~F^ zNA=sI-oe2Vh?}jnxjvJDI^vEeeZ|L?75+Y4E}4#*fp1-#Qzg|6XeK zF?{ClsYjVfPZq>wK2<6ZM^PaDKyNXX^_SXZdL;u>0rGIFb>JB$lAnBN?#{QJi)UjU z9O5q9X&i*%sCo(v_9Bo<9yFekbObTZCg7?$lD*!|B!!3UzKm#h1#v5=GTlFr-+!NX z{|7irsQp>ldv2=5Px!ApQq2ai3RcQY`zdzf4gDTFF&NKb5!j$7csZ)TUMG5%QRzP6 z!j3_|+l8m&6~57$xH_796GV?(+uyWSY)w4QmEjHs;;P)j461Oo1ljOk$=ZEYg%7L> zOwdpq0XtBXpW{zSXUR;8s0ZrN82Y3r>qWTHOmG8UtseZq0BtCGL}q&dcButDa}k`t zHW>ZS_64}hpQA(CsUE}0QST#tk)j8=v%B-bj1F=ahIi}9DZ0-uloyIs9e~nP0fassp7S26+-LI{i{NZ0<8CbmUU_TtMp~c~0%W88-`>)3Z7-Wy&J%(?+Jz}!C!Lv?NFrWGd*oPJgKf$kh=7Ey20)2 zutVsvH}LsI@mm`(6J-$k(r9uw+hp?Q3TpdTb8V8O9hs^(hxt^S;Rl3Y;ug;kMZUZ` zu7MRy$E#{@1cvQGUZuZt0=?jM=Xcj@nC|9u0k_-_+<%~|grT-N@qBe87cjt+fD>*5 z8I+sszvpn?Ip_s+e*aS5{#s*?^sroH_x(-1$btG-oOIH1hRDX%7dNG+J1s2l|tKW)Rw-Xmw7^+!+d~h4!zA}*`%4aDHi*%659Dz)J(XAEe zAs3`_$1`x_?;{EO7_V$eR&ose)F5pQ?C}v)nCs{iPUaodqr0C520X_J@*Ord+~p#z zQi&>gkDdCKd_;3OhhZ5Nx+%%YHO3a$1P}P5Cra}eRHBn`PR#sw{Q{pvo0!Yt)ypd9y87SIk}_dq_6yV@mk}< zO91UH0E3Fm%xTbG9eRtU`dK_qKj3I>2%b)Wm&xT(nAH4i}SN(EBSVjB+Lq9bC7;D zCz{DI`0n5F&6L8KmZ;5jt>Twm0*eOg`QS(Efa7N18~+8|FJ>dAW3Epb9Pn-3z2Jc7 zuzEhgcO=s@o}r5QF*VYc+icA$A1G(FtYV*L^k((uf{Wiqr+5eE1Ap2<--avZc%V5GJa=ET@l`lMFW~BG5BA$=X}}&mK<{mqGcr5T zbEklZ{<1YC(KLm5*9DG18EC|BB06Sp)Z@R`MwGe5%P&JdHQa!gaL-bhC>JEv8d6V=Bcg=HUqJ z77V}S!YL<^+aCOX&un>^Q1$P~?H@I&q}>M7JX)qgE`r{&<5a2$ni)nmcrR$?5gyK9 z_~oX|);rD7#7aOXMydz-MPdIf;e~^y%ECaVa&zTwrX3u*9fT!k!l&(vp=8wB>f)wAAlFhD%!@-uIdugmcb-!m0 z=no_y#PridFmn>8@D-|22)=0H{(WH7r$e0VJfV0Q1hW#HGr${&t91dZ*~q2;V!O^G}86ak#F-0mA{9zKS`v!INrXY zy=S)NMdfHhBC9iLkIAXKJS`sKXdHdL+1CO+A4#3MQGlr%75o(O(ZA&fcP5dH`J0ti7QSsBYb}tOQ@^71<|8Q^kB`SxAVBtEVQ`hP^kGL) zA%u1)vcMbQ)`XW#=r|YTERk3kDv@0gD#BVkQ?E6HHMA2pe7Iw?BP~gz7$#dLQE9KE z6tt(>tVMk~2ebN~R7z=?lx zevof@J7_hUE_pDlL@~~|OLERwSukh|rgnCRrP)c|<|K(5)=pX9+L=yux`~z)YA$Rp zW7f^(;ePANsiVFBl>@j0@_)l*)f~)8uEYfBK4dih$x0>J&ZB!KG8yhXZo@>B+Nbt$ zGUb)l83e=aaMp6RcJ_fIo(OxnoJ{U+`1=cRvNv(qY~<8?y4h*TcuK__8uD-#`*V~ZGUAlx~y<#31oMVSwB%~16Ff_I-T=3ncUq$PT;HRGZ?=Bb3yzUl|gyE z=|CsoA76%FYZs2K>$oQ$%6UhDOrNPE&*m|xmdjaBk#ukssI|SRwo^&PuSIn`fnxCj zcX=pW!T=`fh{>s!=|CRClYO&gA&a7FBbcCdUi%H+$e*-mZ_+eH9nH`w$1xA;3=_`8 zlpw+WJ!FzgUe3eHG9%edBCgRmz=T_JB0TM7cTaZ9OGV6*mM*J?pJ(JqWkw+YN56@X8-n;Dnkd7k(;cw_)fcRDex9wP=frJuV%%e>g%R| zhlfiGE;Og6?%R;%j3?CO3R*B-Nxn^<<4w zj~RNCSQ&fK1b;;pe8x1rH0XjllW6 z>&(;sL^`Ih)kR{i1D*3I96k%IOPR2+(|U?@>uq`BiHcesmV7Yz)&=bAo%DdGnYD78 ziH|?QhjVj+^oPq`a*R%nS$TpbJF5U>dtDL1I7Tp%04Y4RvIK%}VkF?erz^2SP8* z?e4&dHVP--R^H2fx{T~3_sX#fda+CYafjW;81<m z)(e7FE{f+wOfVb9dAOCc@IGBfHvDG)On?}S>u(E6*;yPm(VYHWs9y~@_eV;G{+xV6 zVj4tE_c7|$GjxlhsnZ5_qLoE5iN8C&mvA*clP7*#IFFg$_0*Ir!l};t>LB^e$P;4F5n7ieq6aO-+=I zws_`8lWJaw4{-xt=59tGUjor&x)&g|(~{)WGVyNqvkxjWyQ?wpWgv5TrjwYugs?WZ|D>^V3@kJE>Uw7C^GK~>(1@Ff1B?Iw33 zW@#LzmV`KSlXB2Ocy-yq)0s`N+_{M^<1(VQN6$XRygM4LtmU?;uPM?C`!TzMFR zp`f8zBs$iR==hsVM;PZ@I+%f3xQN52S73MEAy9oBSnNz$c z3D^l z=6M^_|g zVVMHu42d*K2pn+}P84zX$ReZf*weKSxUs<-Nr+3v3Mf=4wvSD@+4> zWzX#JpmWx9v_PNorATU1O_$K4o@GW;Iv9TovpzaW#b*;!@lTWT&PP7bs+VPj1iG{E zo~Cia?s8Y)os6dMiDC+BG_1=QG|bJ+t~`m-a|b?7>b+S4CAXi3WKSREy>gv(@`2gQ zB13VW3Xl(;=%Ym;b3cyEeG=8NJub8Hax&$wXg}$+oaB1yYGM+`6ejqr$mM`Iccxpw@DShl7++msEz>2_vtzu4* z3CHj-kVCTBV(B1faITALO4WJn8T_+}PUxpd4M%B{5 zk^LM=(({}H$Hp+Uisi7>JDAXsm-!sgDCJgiubYXp+(mNL6&=hK+SF;YV4S=~0(5kjhWy zOI3!4T50PE_j^Rkgp%%Jo=i13?iN&`rR=DkZ~^b_;wF@5Oe-%5>gz$TKAaR*B53a# zyXh5)$M&wmoF6^F3u#a{7Nd7>~YLvnGXlGnf&HiSZ|@1jbo=R zq@zDf75)>=ERg)417>qJ{P%ercE91V%fxJ*3e@JtauUH|<`4)+_$*rm+#YqAd^8E} z<0ww#26W!PI&#X)MWUQAu#?@E#+4DTL}79U236w}Zi%nxgjr#FijuEwN6Ksn9-Tx^ zmqNHFV&r`qeQ>;PgK-dDi0}tK;B>JVLzoHq&s#VT+Rci)x){t9GcaQVrH+vo9=9>6 z=><&SxsONl4ZNtoT2`&h%(NDyV|J>&z>9~NRa%FcPOq5IHyLE|ka=$kU6+{0x73!5 z1MeUVZdxsvWU+zQw;wYU50GDaA!|!PzOpYB-iy9#2Uskco~tjM$^=fD?YP{Z!!D-f zoXN{v{Iyih>u|d-I8#IMyO(3-HpC|}78dm}bL;cNGFnIzHYa&D19gA3JZ(a8_^g)m zo@RJ{WTx0QrWU-$5zSQJ~mQsID(>_0@Q^VuFmvQ7E7CKCNXo235l_pPQ#`G3?LYVIMB5GF z9B7Cxvw)6=Vv`Uky$E>~51L{_&b$H26#9i-?7u5;#(qrwEr!z~2t6j!G9Sbtrtg>G zmaR(kIJKFj(+(c^3jKgcC5SW5MW@^Xt}6jmaRRFK4$#ysSTEt8|AGAUZf0PgK@W+M zH`x><{nN)42O0>2XN=)@c18(J!SC@CtIQuRh2J79#hmK~oFs$T zrz2%zej6PBBT|I|b!!rJk6^E^hUYj-x-bpwWduEQC&|uE!jblbjB*Ahy_Cf>(VE{V z=B^3XRwC|{A~@G;Ia-6IN5Pg)WpRZ$20(=f4!icU_CRJV2(=*MPDEnTAjuXKFf}k9unV_y;p=%HsX%EvNG?WnHfY zU!TV_VZ)!<2nJ%jbrEONL2k=AZM`WIAYsgREyq1b{cZbgIp7*ra0g2UzEo4@?B4=Q z<)K4fKrO4yG^0h_U-itX!K`$m|4%0Wb{EzsBW$$?W}%Nhf!vPpe!1xP#pH@ea6xr&Aa?dwTVO{tI9KM<(o!Yt(-Qo zsC?pV-AxKOyR8UourCbs4%mTYk5@V5k(;AZfvf~V$Z#_dAFcU1WU@MobRGSd(bdaioD(Gg}g@}h@|`(@T}9v?>gslX($U39gN zgr4|1Q1Tmv(7qPnrAey>s0Cp(&746E)FEh!Q{Xu^$xfmKIH)|Q(FqurH|A2XeidN_ zM!}+Or{nEF5^JJ0ic@Jh>gZ9v^(#54^9L9KGpABLw7NlXA5X~5TKTTAQVV)d?pbI- zZRjyp(q*JLYcs`nKJ(nFaKave0}*rhGBZIeiXO4LyDq0~FD7LRM`9pcM}3|wf&L=E zo1a=8`ybC`3X)uY1e3MQD304vN$*pkW0=Q2lymjqza~lzL{pg#UlRsGEyo#q9zHOT z^*bJoG#xkTwWo8KWc!(~mw`DXBd9!2z~~{==Xl)VJK24GoRKi8ov0xTV7-50g@yg4xq@QBR(-@q50i`>7RsRpfhkAsY@c!M5sY8Pc*W&^aFAc=KEKA;4%<)-2& zp2$kDleOq-w!yYdW%kKVOEq}5)i`WFqm1VR$1j5seN8t~0G!hnufa?-+XLj(uE1`* z)a=}@P=nR)lvDM^G!=KR?0>Zluq=j_>jf zd-p5+L?KTHl%};LsNz7ZQ+SV2^cpi@xb~v2-Nb|C`|X98N3(|B>K7&?eIY@#2d=Xq z-nG`?_`L9%io8E@Ff&eO^9&n6G{3+V*5*yWwiUpGS%vw1t+-RK3y5tx_+8v7)S6jU z&+(k5r+Yffts%Lj@2MJWgg<VgT-n#Gf7GE+8&6x0y& zJoxQB<~# zw3u>omlLy*w-a7qQ|+MCSyj`S?-mDpx`{03dsuog?Y%s+&g-CVwk5AIia7*A9k~K) zBph*-;dDpi!}=MfC0yP|)`^KU!@+CmsH^>9R7Jx2CNtFD*y8B+rf}oZ6)gpJy$~pR zG|s;*^s@f={>t!0`nU#@4iNKuCjRTJDuTFT(;`(5+XbF$X!(1naLgxj(&ZkoB$A1v>S>>ecb(JO9pOdaJ+j{^Wsk{DI0ffL`J%`H3dHq5iNBv%v|=aK0a6J>RpI!HKm6 z4^Rr7)CbvrhRBI8UTreGeJG5hfl47JsdfS1PGoY=8aSzT@b@!GBCUa0*-z5#0-kCy zJE{;&>^S^~7WQZxe(_>FqPxjb1WA73ck>32_EqLOrRP-W$9&AatiU^R`a%(==hlG- z9RYG#!!J5SM)xXi_M(~vXOfslCT{KuvqzG^i36wY2a|rJZ`bJAMJo5S;}S}Vn7<=* zlC6B(oP66D9G%d6+ENp0vJD-9FNlXjFs=?r0nW^Nrr1;Z-PG z*YHaPN$*`Snsa03eqB^z(3nq?YsgMspaP1*eJ0(Mq+jesmQkZaT*I{3cW{k`aa

cMz`v;eBAYS5!r^FCA=y$n*`9Q_Cu&hYgd{P*##$_+WE0#Ze%X&Ui(q zp#>g93%m+@S(%f0AFlcR`mgk#U+`X+VLr%Z=7Ri92WlbF^9bKcCT1d)C)3HoyXUJn z1*kU->01iG@6=>2^%-WseN#{37=FmikCJE&jd&lUaUg907eB$ln2jlaKQO_+lC>V^ z@^JhJJLSxlm!PU(_*Rds0=2bx&{I6CK+Mqb$LZbxcN+h$DTDNQ3vI@W1F19Fy@k>X z@Z6CZ7FuXkADG3H4|iZRD5?its&4|BaOjBHcx&+oitLYXGT#4n+SRB35x$tKcz1O$ z)o^r~9dxBIUGzg4q*hrSc1v(V>6wMqUEbgF5d_i%hHn|nz*TB(F1|(*j6fK-N_0an ze}qaNfFG$pY}azmad8))m><`c^z%Nx#$`E6xhTETV6?cIu zo%98|!4T?UMd?9I;J&zhq|4s9h0>#-2y`KNxeYBKz2Rd10d8b34(7E>lDO@U0dEJvL+- zvCo^b9d7Fu)$JQBfzOvU2)%hae!7jI$=h&wS-9ug17j;DEl&Ye9RU$vM^$?Tqv^3# zgRxDPO8g&^{R!t(bAc~g%Bh^|&>!#8b$&;gwvel+f~wX+PCeg4s?#?QOiUc@N#&j@ zZwI(2C#~jX5>qYKdN&+u%Ry$lm?d-GnS%-LC8(a`tyz{Tz7AR&>3H?Q6 z9p>`(H}LkqG9@i1o|Jy5FJfZkVU&n_BK?Z@CxgTbA?TK3vW}RYxma02r+XUJ@{1Bg zZ;~HotqUo%F=W1Y&VFu-Opv%i(ES94shvUke(OsQZ6aEN6F)&eoG+2E zQ8np#{_P!8V^BAP}d-Q@F}ABm zOC(z5$<+6_9ku>8{_s5bcWS}3PUD>&HO?Eqp<1OO-4FrG+67nj7<#u1;;LqHEB&Y@ zCGhElN+(n^rdhqmNnae-#%66C-i6ytBrAP)&tS6h=c>}kI@?y4zH|tc=NXQ{?y@K8 z0#p1MXWCLUn(Ib9NhkiF6EaAiArh7$1?9O2tA4XBlx)@(@`*=aY)?AM!&CPl$u8GRE;rwe4pU+@dQuwFx9vP#`C;@sv&OWIZp2W4vO<9 zoMc(FFdQwr>4)=hTKA`uI%j`D;xo0xkuALoH-Nd}XH&ss(K!%_n7Cx|R#O>F=QP%xNKB%Er?8#~Lfclt9uD~e9= zx>yGrGsrAiJkGudDPtwYZzB9kZ;*!(V7=?Tm?8*`*e;puibqiMT8D7>jxB?>Zv5Lw0 z21%%9xN`=OV-YufEtV(xNp3v7N-FLpY)l|KkvU8FyX(64_hs0-fTdR8 zYrhTmlpQ^&2F$`p=05JD!}&x#6OMMC^I!&f4{Cs%jyRr4=R)f^jU)V;dYpP;vs457 z3190iOLqE~Yam!1?7GKxgnI+t<5EnaZsl?qc%eT#tssCf5{HFk`m&PIo_}*4si4!w z6;82xtjNEadyv~(15a5;yoTbmp2R)wTj(}WMlbk!o^)v0p>m$+fBr3k-4t_$chY5C zBvE`EPr8khr<+8dXQ&|Jj=`yT6#_W3tI>52W(Jv<0YGnw+b=ntSLYqTh^wi7Te&ly01PFmA%ZFJ^O$we*#~ z5;4nNq(vvfwh8pR1oa>%&XFcC!IPNx8&9Txr}GZCVa=uPe9%YZf2hVRkx^)l$7GuK z8_Hu2BZBk38SAjOs9mo!NL}hRzd(5Y9H@$e*{Ac-6jw7@LEK|_3y)o1u)B-IT@_qo z&CqH_fJu)qh2=KW7M{RFj74$XPHN)c=Wz~$Q#*=_F+1n>Bs8nrtn32(?(yKht@5tq zzqCkLtZI1W29S8X#zZE6Ca#un)M4h%Xpra{l6*I$<0Tr$i@+5cSVl}Q7Polp2W36S zl`S;pO619!pw;!jUv>cYO)X++5=oMT`>E(S=b*Pqtwf9J_ zXcNiG4rGJ3I*!SFMLJMqiarDW`5f+VKfKm0B##mzSM)G^BpUv+IQ%30CMDPu%b#P+ z_xe*QBU!B5oB&q%pDCzj5tgblH4#S5j^|&CL=kvT=UW`MIF4zOVv9+yOt zK;mXt;gLMxP6D&@KU_9g;^-J=H%}+Yk(;zsw4Ccciz%gbts2Uxs2zpq`WH~!(>elh z3rFD>E=!Fc!U~%L*4aeA;fKrU10E_fvz6DP|AxZRsMN;t)W&w?X%nf6>!{-XDB#8A z)UVBMl{L``c69}3;xUlIZFq(VxTKQw(=}6dl|*zierN4qIZIF65_N{@j-l-Ix~TS} znL4qS`uB$UJdvnH)uoCy-z-#xsZ2S0$UVl#;J5yn2YZ1X@&*<%oXI40<&>4#C_o2b zy{@2_Jg0kcI)7wl%t~hpp35MRz$~zt(_I+^J{4E#X3433g1sxsZ*Ra%s-dU{v*ZnC ze==tx07qe4BlX?J`u55g_|yZ6T~30{z-c|(@+;H-KUxBCgB;=H6*q5>A;ljJ;#vrg zQw%=oF^t3*cJFbpi|_#3ac}hnzwANn2!b(vst^O;+c zvvJdUKEB-ud_H&K!P~-9iivdTjSNO1SO<~NYr;P51M4u68C7dIIgZlF{9*hB!b^{0 zUxWU8KKxd&N#SP|q4w35*}B}^iV}?Sc9xr}Q}mZ$`F7yKm$;^eiFssGeS0ty3WSHQ zCkEbd2wB=WWKce#^NU+ON-)i0g&KzLU61{*;j`>1Zy`;jdLCr9;tlTFaWS*MwzVld z+8J=qN%+pRU|J9S*g(>g%h0wr+s|+c2BQ*1l4WiHYu=H&Zzjr9IG87FL`HTxPjv;Z zDOhHw{o(ZO%tfq9>ZfxmGOfgkJKIu)*+jF^VQ*XC!03OoX0zpj)h}-w0iSVKx+lh> zr2omf%fLNyrO;lZ$tiVZ>cSYNwJecb;Zd}mKe)&6J5vIRq3?`iPQYOtO#k)w?ZR^_ z`hqXu=t86+&FIO#8c`kGvQTPk$)rk~@$B=hR(l8fuw>N02h4nr0q zE`{fG)#Er@@6lOrfKwN69!! z&VofB<7p2i16+ce1S{cxZb42o0T=Ibd5gkDCTd5L@|wxSfg?4)K8Z;_3x4jW$u-`_r0VNVaHz=%HQ4f>_&Ua(0}IHg%> zo$y3WXPU$^WgAugx%oD_WCS-mmPc!^Yi+9uCb9_=EvC|~)feyOb+D-oe~v4)(a0`v zD*XvRZ^dC9kDqEj>F7tK6@p=$Vl3@=q8R+YYc-*}|HQ8oH-}}RD;4uK#7uNCfBz^v z`+YqC^k8OpFA`^xDWj=6|J{gMH;(_!r?~E&sKs-6{uOY!_n6C3ompTDnd`ZmDM~3W zktY=X1~ZDn9P(2xnD~RKKD>;wSK7yn{z$r%$9N8G<_|E=CD|{PnIcpi7v@FwN+Ei) zE=*w-*~TPNMUT*+KBD8q*xTDh-t3^O1C?;0}N?%|PvvB7Az?1}o-Tf1FZ8Rum8g+g|uon9639 zUL4_F-@ytnShcN4%k`yKolHgDpzb3haGQGxzu~+PGn~edggpjtI)?u0ie)Ztm+c_G z7ib|tIBtq^-{&T(T5(v8)e$dBGwfph&a2^xoMh-(D(Z#DYI zQJCCdc)$GcQT@SgiTW?7bG7(=3Eb4a22}b9rYRkcfC5YeSi}8ArSY=##qF>ZjwGYR zonmfaw9-Nu&WXF1UwR)b@>U6^Ln(mPWyh0OlX(Dbsm_UDf~EKjk8y8A6LTlComx4R z-@ggWb_b5$~JY+D9^t_aAvJo%k|;Z2eD?(vRl1!n#nGFymvt` z{!BT}D^CH9bD)i-gtaR>vm~>Ao8Sp}Y^%fF5DD5OR*sF7^e_04uae*q{mpeIsC{wv zfq|Kh>s2_jeyd;s3nK_QRQ6pyY1q8DQajjf3MtQ6dc_GSRZH=n>_)#1CVf~;qD4E-;!!T)erihvoW;bh)$Xxi z)r+t^pFLti&oiSiQ=S@-k`uG|_`OpzN*pipalU(OYx8E8!`bgrPM{JMV^1EVr!9oK zdkpM6npD{1|3}-M$7wyb|Kp#?RNA+xR0=gA%dFSzQ<4@Hp{CuPWJpq$B1wfJS(8>v zl(dK>QMN3lRD=x4k`P(TQbK&6=Q-W?{rN7B$M3J-{f~cc=DOb3`96>1cx^}4O5Dwl z5Xi&nC_d&=OQ>=EY`Cf?JLF;6kZWnTw>jT?r~(pkXY~RMPFJ{TE!D2YqCl8C;8PE z!j3{RXo8>lN?Os!X)52rmww@fs0tf8HqnY6xH!>WCe={W$rSz21Nh3I<>^Pwa4rwa zgHY5r@CSQLDwXo8TXnG?FvFkFQVo=+$FlJE7I`rL$N=em}Pw01RBoAL7X?$*@>WUN}EBYi_Jx`xlW21m=9+OAixz%@9O zBkefb#yZ0sL;Ch~9o$l%eofqO|7+g!w1ERn*A?V+o`6;Oz&+ESzU1bjYBR3mmP(-%XOXyC4SK^zx5oG2jm^Efb`}2d=Jx;{NYnJ z&%P*emCx6Su6&dn;i)>_Mf_81ZJPcJK9EH1avb&bDbCN6bbq^S8(1JuxKjQ$x5e-B zz+3xtZ3|n%+b6gw9xFP(_%iDFy~P!&TrQ&Uf6DWIFKkNS1uE|;g1-7_e&s88J;S^c zu$Yy6KMiy&f6@k}>Hj*Y+1a|cdpO>o&AyzbdOa0eJ$J!KpY9cYoiAweYD*o`X~NZ8QbPwhzBQ7z8M!@TRimgcU8;0H)$nO)UUyKmY;E&hx!yaedgRpa zwSS_Itc|7mW?{zs=?uOj?c~|Eju*~y3Fsm#YUOB6m9>a|7t*Ae5I~` zX2zsLy;!xZSF>i)=q=1Xn#S}LSnEod`*w5ABeEyQ!_oexG^mlETliQ}YihbF*oI~L zzv^+nLAv?$0u?biqdtXP8=jZ*sB#v@Orig3S+4XpuHb(m%P2coj@v)|%!4xKCVGDU$^+TCIHPcdPvoFPu z++seRqxLV>(Y}<{4u5yEIqZv!{D{TwbW`r*0y#6*^2;dxf>ZWxTGeB@+Xh3{UrQV% ziDN6&CQBbRO&|3|?f~xbmA1I-RogGt*MA6at|S$^495^UyIXYFzsKx^89sGo&o`&| zv8ZQ0%?$zxXj^`621Z=88Gp(=-O{Hjbc$O%RaIVx4J1~(~gXHvY4R;haI4?3Em#>M&-wgXh-0-Kg` zCMU_wP~aE+iaYGWIu^5#XNo)9&Zxe6f@>lk{FiERb0T;vuFhFVZ~tP>78f%}|E-?S{Nr?J2;n zQ{|_by}}OPi|FXD$R0;+wVHnPZTX>JVZ07t7jM?ZyeMC8pH8faypxmTOgTokcsn+< zgW3K*>aXBM{DS^E;5oItOJNIXJM;SUJR--~X_0Aa?}2q3s&8LHYx4rnOqf6JGsA79 zwF`=y)~2`Ks@`pdcbTeJ7p~`%`BfsriE?e*L*#Z~5tHUtkKTnsipRiBcd~o@UM|No zsCYWXo~U}9`7(4l?V&P%(@})9u8W+LJNOBI%(_?-!aa%L&03sul6$l>H{EdcBWTE< zmeO8Fj`k7iWG7s9FTBAJJn4-zFf(|rm%tp>WAQ#Qh3>_Y)+ne)uXP44>Q zcdC59(Gpe2OvZaIlIjq$blOq(_w=5IG@Y?DjX&W4TE&iMiS)!bxJ18lw)VJN7sJ3R zn@&$Lp9UpJ@Gfnk91j_<7sg4jOu}9*C`?G8F7*xO(u)Tz^*$Y28s@H49_J)@=o+4# zzump-5EBVy?(>?d0wyxhRFDq;m_?%+z_d^Kn ziLlGz*p|;Z8|zUmw^!fBU^G_YT|$ac*e+Z|hc+I6wI04+skoYV>Nt9wo;cLtdVjI_ zYpCts;=_IVY+B0EaYyAF9KP>_X=O+G`Kio3mlu__W78g!|Me6{(l@Z1MzGjUHtyY` zGrdP=x?Xbc0Xp&H%?%gx%3OivS|}G`8|7t18qX8rTzgGafZZFXuibKY!UmFVQ583b zn{^*{@R&rv+y|(0w|nCAoc;G9l_^CnCZwXkVyJdIvRZds?(3+k;JNypO%HL=y?3~#}>xH0XIwEpRraudu< ze<(iFw!D19V=l@PNdq67xQ}qFwV`F32BE1YQ>Tp+c6L;d-pxt!GVZXOx z|CL;JfNG?be)>26WGjm?R6NmJXW;mq5(vUxPkA;0U&D6P0RD*##pJw9R$lv%E z=S52j=YPe`LT}n;p3m=hi8Hy|9af70jqp{7xoE=(;ZTd_F4rNAFUz zI5m1{hGD!PHZQ+oTK!UYe++axbY5d%EsJ$uUxu1et42~Su1z~|_L(Wtj#~F6b{c&YHJ0s)y2}xmMvr0J2Nv8K#sT>>9(Uqsg?J+S`cSm(JB@REdH}OHYXxQ>l;$~b6XH4>r zo(JvSj^S-iQ&dEWdW{tz%^Z8-*F7^jdf&BStSgPta{j@0%*s3AnUy5A zC!*6rf*CITO|F}4sYqMB0X0GSb_YUT-0dnbs=Hny%^BEAhFR^JyQ_J@%zQR3xqdDU-Ppgar;0IG}2bjjC z_}R7Pd1u{gB%S2U4>pxO7<1LbX4Z}ypsv&Z2j(#;`zV-32i^Ekllg4w&+>EsfA8vEM+N$w z8SE&jBpuupLvzOKcjm?X$?u$%qhJcbBRdrDGF#&HI=d;qja*h+T-Gep%sR@S-|`yT z>oS@iaDiI(rtY{h&E*i->vXf)YU=86Yjkj9TuS?~P_5nPJvfR|tT!}b6&!vS%(A%~ zW3H#Q3)>ia=k7ZGMQ&1D-M|{re{)z`Wjx(^Ha*;n&40|(NtLW{Cdb6B@@95RhfRTJ zooi>~Z12Z5vwQ~}-YB=_F1J8^c@*94w^$Ur{=*WLF{bAwCQI+x=ai(zJesAlC-Ugt zE}>jGfLjZvx0^|STV%o8df&%MT&n`TJeikel}_R-$V#eAvQ;rvqPksjvtpl{RGf@c zm{puKqDJHnM#C>3P+3pF829Anp6*6FK|=N=@W2B&|Dg04!L#zD_c`RpRQJhdLDkm! zb&{RmSvec9+&^IcMo0bsj);Gc&I{YPyYX^ti(Oe;Pk9^!BALGORQK_sn2R(3dwm`J z_o?Ewp6|z0X@AkB)zHh=h`#e}s{X#Tj&V!ywQBzT(z{ksxNK4Pw_}u&Y#PdwB6U8r z;6~W+Jk@`-tm}6;0Y0X3sh}d4@^>tzJx*1v2FFSCV;kW{xq}{}$|=uA*o?FPR_ezw z(4h_z1TMBu_evX*Q)#%mx>v(KwMMZ%uavaImp4HV{j}b5JKg%;f`bK3 zr9GU7wHs#Me@=#Xsfz22slO*66 z3(}vCyKB$)-rNaU+f8?zY+vZs%!HY#l=fvG&CAhoZ`OoEs^Xp5)4V4Yy(gJ4p|x!Pft1V`v4ImA@}XsC;2>*#vv=o}-f7nKmtU0I3+Pm2uzm-i!@q`&~Q`LE(R? z?IU-|9eh&tTNl~okGYI0WQX}F13#Do8*N8FRbG$ojhgW{O~^mV_$}`a(;@7ICZY@S zL+4VW>V=LaWJFIg1BWcUq&4NAE#X=I?|XndM4x_w3t_nPkmfztH0P&dq3@<-0Fq$_d3$2P0+Ki zcA7snIsd}9n$3;gRlR=3IsVfQfv;@>IyL(OUBhf!qF;!q#36&`XwKD1{JJknbGyX+ zbr{7%p`4GAbV4&?4(>OQ{sWNyQt5~fn1?%2CGFH>H=z^isc*ancXg-lw#7a5bwP)i z`!T2Rc%0QH`nzPxpf!v z$>Hlw#XQ@L@)XpuAq8IG`2Wgi&W*d7BBu!#_8Iurk?x@xaEV2_y#_p9ZT%91c?yQ- zjN@Bcgn!)%XZ=y?%rN@*$4r%P(+>TWTb|IjCa;D5WL%aDx+mE3Z?BxFckuRHfz4)){V@8xmi* zD_T3h1Nk0KmC7-j?`y56{h8bHu)@mpSzYxjLkn-@bYILx`VF7-QE~rXco*}y-uuI1 zHWx?CIH_jj-rB_dMU${?-|;du*O5$y=Z38lP1LK=k)>T@SIY^qeaBG}zo4=QFz-p=f!ABkH^2SzKc)%RK8Q**?12l}f4ey`lH-ig2J=xuwLi+-J1eWb{TA1IYu?TN9*^D-dVZS3 zu0ImBb6V;@3neu7hcI65ye));ZsaW8Cmpc5Tj}K7OkDe!xTc^Ks_pq0lcA2IVU7<< z%n5sUzN8uYiAJNd3APlU8YZ%HBnOS+wVvULJyP(5>Gd1GbyYsL1c!Jx3iV+zWBWGT zN0zq$cC7tVdekz>>-*dM1>3I~y$pxB zSDLw522j-8hzoiQjHW~i+1pewh*$5T5TUx;A&bE20)U7j#OX(rH zncp)`m9OzLtnzf-)}3nL%AA+g!1vtF$51!ssw6XW-_CnKe~3@Mx-hBe2>#}iixN7?|3}DU4sUW%=6tR-XT@x{~#UrxaxsUE)(O+ z>fw_EA|ZRLTi9J*bhmHzX3;VJKiA;ukK^CJheGlt7-&Gdqei!T&DgITkybCQ5xn~h zr@TA-xT0I|N=VH^dbXE%p+EnR(qke&^lsQ%H5mBr%!O2J)w6>ZXoxJ4B)xC&fjvu4 zyD@Ruq3<>VW-`hB{S=MbCMPcJBMIu6<8&dX@VRw~{>@$ajci#yuV7g0%H}wEPwRx& z>V;GEWP^F^Z{eI=4j0%2RsK>I;XZuWtwqPzPQIl)J*Hb zb^S`%RZ+<-)K&&vOM2b&b)JE*?vKUY;T;T0%WBlRM^o!g(cPE-q6y64 zX;7#0_4!cf?45}|F>T>384Lznl8cRP1yc!nMCEAn7ZpC#yV{QwR$_`1&ptm)ZTA!cv@BGtYzA% zR8C`gFlNvW{E;@#r2bL*P2R25^4=%G+&|5nl$a4yPlG=>FsXuC!qbi170?_X3Wq@j!1tyJxs`txdTJ8hEgcp;my)p z*kRj6PSO}!mHV9fucQJMII%jw^RH7`XVHnQmhJqxo9ig|)@czp9EWp$ngVqL$Mt7)TR~^r(PX&9 zZ*eqNVOP&#Gz4g=O-i4%*&Ffwn$deuN78af`j-K+R<5E#dL2&iY1$Cq{r2=9)9c%? zl;ArUV1k@&5Bn<-O>bZmZb&3Ko$6tlthXnkvarA8*RNz{C1*F1p3{y0XDr5kImZ5L z==wnwt1hm2aNH`8EDNB$f2x{0S*pn{rd2?JuiFm89up&=W6} zEjieh!Bx^EuZ92ZG|Lad?Mzm!LpQfc23AG>(9`)t!*|^Q_4~%Ym6#*Are@^vk}2y- zsp)D`fcHv2HD-|<%;<|L4hUCYI@}W_$ByusUzUROo%ij?L=!tFdSGtul^(c~qcx3Z zB3G?#>)yUhZTZxG+DCMAiLpbaSphnqJGiEL~(!I5(rg@x-ZG-x^S0Z{1)J`{c>V8ik)c z!kyAC=Ep9z6KlH}@^IM{P0e6g(8{aTrHSg&>#FC`avy`|elchDHj4MZ^y0OsZd!2c zm8w!>siG_Ar%*){U>;UbX@AWDSB(yYCT)@o;U78(w}Z ztY!*1j^87jTYHv@7B=f_FZ#mdc@?$z99vzMLl-`#`Tm9P@CZ{=sh)RP+~M+Bm``@p zjQQcmQGk!4om1@}gXXU!|QN2i5GXd!HRs`;O2WjvL-V65!W84=}4rdi96 z9o0a|C3mRZYn=KY+_lY$TbN|JcqU_<{`+92U%~#uHu0oAHKPwD&+RqB&Gi&kWnX$7 zcxMlZ$#2D6*ny^&hxM4dFqkPO@qymjMp%^YX2^TgvofCOWO~u=bg&h2D(9@^g5Hyx zh?;^r`oe4TU!^!co>FifE+@Lc} z*a@u9R681flF{6t)ih!PD5lZP8keO}^x`vmhDa9qQ(WdlaMiHg4n#ir0`s-OWydQq%brb|>zQ zRiax=WO@}cTt@A4B9CKWP5XP^f#)5EBQ5Xarqcqv>eQ5(UrtmNLP}FV`oT-%wu02S zLvn1NAo)w|l8OCwb}Vb7>L zDWVD8XCgY;oVp8cR8MsYX!9Rf^#$B)A8}YuqO4dg4ZSp`a4hHAFYzuW$0wJKcS!Mu zb%>Z{mb1D`hhGhsxd5iM760mUw5=6uM4qm&C+v4N3?Qh?|A1$;k^|I7k2pa;Far+o znp^jPexNQDMcDfDeZ~=4Ri!`NgA01rC;KUTA0)18&bc{3Pqhpez8i9Jq{`nl|2&-W zC2ocr@^7YCeVFe4E0b16!6kmdM|4=*@mzUo_ZaWdRO*z4yp>O5wzfct>f2~CD16rL zwc_kNGi|PF9d_q5P9NfPEWvoc>i7H5DGfQ$Nf_ia)aa?Uue?MP-Xdyf&g2%lT|Jv8 z196oZ`gPk(KTo8XAp=sn(C6K$`ZlJj7|rqVy!ZWGyBojZX#Rzks1~fPXPgEJd5SY_aEtW_e6xSE^MVIU)du$>uB+l^jSek za~W^q6ZVy?b>nWgNoyB;_wd+Pg-tf2%m<+(+J-mv3`f)|$4O|zgNw2sN5C|C*>AIg zwrT?PMygYOj=voc$qYPaNII%xf?O$^=V$ua={)=I@`ML0GMR#*ElzGUcf(Y9I8V#j z4?Czs;&CHev)bWs))t-tX&9$Z3u)=^NFw-I0#X(F@Qyt7y^Bk2qN-(Tna(r$sy?}_ zT=P4=R@9202wm-%))m8Bjyv4owkq)~$EJtvD9a(`>pab)r10is7V`7yNwL;X^8<<-e)7E#vgOr0}4$0aritcFm%<-{(K4Zqn5Xo$a|t{XvQtbyr^$K= zY-(-4$Vwd24_u22{3f5|ew91j9kdzVIZ1E*qEisEiI&o`mqLbvHnT*s&ds(0hFhpd z@g4Dvnhwd{68`?&^5Lh1xI|KK!gVEwC!@s|hvb1a)#ZUBKOW zBW>d>soNjGtb!M}cAQvJ%#7Xf!;>X5KBBjHjhpNvJaI#qzzI^=&yD<0*tdI^eBkw_ zxX8$Qfcsw{-|Zcarb$$XPpNuA`7yx;`&Uf-wP6^?!)UJZ zUSxU~#^gOfy|gs{f`TF%t8Ordq#d=QFX;fSa(yh#tq|0`(8^r>^@Xxh-pW3PV|}n$ z{a&8&Ri^bY`()>w?!P(&cDb6{ZrJ{J2%*lAmZ_{5djcZsXv3%HF`O=8iw*KDFkYJ;QF@`wAX#4?SB@B_?@vr5+pv zHTm~W7gWuSL5E6FKNQs;&V!%lwo@MEBiwl$B^UF)+x9&|8_|1tC-C{xW;Qo zhi^wS!GP#B*+?naStoN@;ohQdnE%=lhq?(S@B}5-hpKSXxHa$+`0zLr`D4<@Uy)#N zoXw1Rkee`>f1GiFDp%K@%fNtLB2i+g8|?$S=75Ntnwx_WIfo|UX~_Eq$a`l`cCeh0 zH}nY=&E%OrXCEn`i`^Xiuwf~f!9qDp=eyTu*{i%V?kWD+6RpLETvT|DiXCvzr)YS# zO78tL?j6m;J)KQu^Z=dFvqghUcoV&QS^BR_DIEizyh7Hg=US_F+<|aP)T7+T#jz}= z4j!ck4QiB0R8fyR=Wp3bR>e6_g*o=k7$o6;{GmyF2dt{Pn%Rav?_YAM?v*aQ2+#5| zFHm*-CiSUuMqz&6}50 zRE@qa*OWW)P=3eTk>6>7qdL|pZN>Qa0%oqY*(ly!>3&7a~X}- z#@u@JaGmW2`NI5Pj}|!BdvvBdIP4&J#oNB1V3qlBvK!{{qOf~a*73mFhcMXVxT5dn zwD}oJRfiHQ&vw}>aEZ%w0KcSP0EbP`SUo3O<`a7}L(=&9aJQzg&ikC#j*!6Hv1nU! zOCiaB!jb#nr4pv=7fngmV0T_DJiMqfmF08LmM&6Yzb=kGsu8s#*Ed;he-!F>P#rv8 zB{(f6q+h_b5HiwF)|aNLe*xQn6cgXj^l>ZI!Rt`2U(A1vBx_tMk8dUIK^bjk*f4Xn zp0N+T^r*!B5~G*Hi?&cB9Mr9Z4Yvaz{dbvDp0qvf3+mDXT!uC2euD$(n%oo!cw2Md zLYn!zrRS|GINH=Y6OZ9f^S>`s^drD?S( zG^huc;2m*d-Ogj3sw=#Jv-)ZMU`u?`UHX#sQYR`JygTIl-cZ{t{9o>_?b!3m7F$|0=uY|5EVj5o^b} z=VaLVV7r4J=A0-?`%(he$*~t6!y~!)&@(vMJbRG@@St=|&z$ZTe8*Wj0}j>pr>>=ReC$U71U@mCWQD^aFK$-obFDpuKD1{+Ys0&|K#g-u<7X z$Tn(|s!A=!!AZs?!fRy-}A?&8CtiG~l(>+B7PT)ATJp`H^QhF;5f(TxlE+ z+1uu%hpF7QxY3&F2g^TKaNAchmtP1?+Kdql8lqpJ1{eEeXV3}NRRO!j4cT+E7Mkl` z=GXj(VzE}pSD?vU=e@kn?D(a-J)Ot@CY;nf^IR?H-3eHzx%s8C+aE7DoeF5I+k2&) z=?|gqKe@qAh32+}=Y}M<Ek0a?;A{?FV!lDI5+3_<>95-R9f- z_%(fesJC6{1Fyr)tbn5KFRUMV%zm`xw?&26&v>VEcw3HeUv$90xX^dhj{S53yLTl_ z?wzz5I^eg{J34{mGPcn=|CRZb+@MonJ)*Sd~d?+(6^`JDP^K()3~StRpvEcE`C@q}LK zTz&+3c@5t258djQ+yY%Vi9_yz&y`ju&K8@~p2sO?W%M;GFV328VruL?n8HEQ!(XUN zZ*sY0+2`}G(}!=z9F+567t(J`R39IA^1tF~tH!Z#x|%Z5uEr@m_z!cb|D>i=fvk*y zj-Onf3Dvevyp!wLjeV9R#}nYuQ|L6d#obb216j6SvcK%-`zR1!&_(`Yt42$FS3zb+ zZr>Sp<}Q`E+=v>wt%>uX467ZsjQo>*9PBsvdqZ!uhT3y%&M!Fw&F&ds>2c?>h@NJv>9aOZUwex5as=W`XYyg2r9v)M*u37v zTr|pUw2R-UD#wN2cwn9A4XtCM>1b=|;Haa2Dl>H9PsN>myF9}q_zb$yPpym|j>cT6 zk3l+u*6&w;aW#HAIJ`Q*afi8;@7LdjX`_^{W{N34X+)ivU9^C6eq*S!$dUu(6?R3m-n3<-(#v3DYDuDq3kuRV=$i3HY=%nqHp`9AHlw4y^`&OqcD|%PQIAdix`aiwvCq{f^OyXf3^Ox?*EE8#u z=!#p3clZ#+87&zGc=3zsU{m$uNhWQgC|o>z41vp5zW(Sy)1k9QeZU z?sUWxt_vFPxpk6yJCaS{djn%%Q)Z5A&mnMA>}&o?|H_{4ba~UGG8aHZKhNn5FWAR@ zA2gFk$fWy5p7ie=J2l{%VJpIzqS0InNz3ZQJwKt(&dNMrHQT`D{e5Q0Sv`i~yuI!T@UBb?e|J9HOO0&lX}^hN!8 zM{1%`@?xLLYeb6|P~|_RMyxFw8F!ie7x6m*7oN1GPOSBLZn_uon|-o_-g|=-+If`S zf7+TBII?=M+61@FSvtcDO&s?+HOsJiZ&Lv8vZtw$&o>axRVRAo!_D&yOy&bK_)ls3 zX@gEqzfBL;h->7Y%u{R_91wZ2v1W?PS)u;(~IXvmaGq6 z>>VDVy7769$DKYYAu}ZT?T~3xX5woFBj{nSy9s{R5N7@`jolM)&cAa9=e?+#-Vs^b zB(=AhI^^RtuN(a}_s5AbOA*}y^DSp$Di-{^Cm6>gJl#`W&);1tG4>_D*zvgI4zvb0 zQGKm~>IL0sAHK;jp9F1w2dN^n;0op6H_vYw6uLVzCqSx8F~Q+Z3_B`voyu7_2o`j8o0-%@uX%?*qUnhG zmF{(89Y363<0z`ZG#h0L(mGS^o0ArzU1#q_ zeLdWJ*$KHElWmVK;T2evQ>62lNWZfR%kzzMTNe*-Y}77lj{U0vRP4y+sdu@wC4aQA9i z+A%8ltq_My_i0ESUBsiY4`vmT%kQ^;U;`)dV~M4SMtGajoNMi=eMySJskq}@UD%B( zLj%~{OuW~}*u)EUh%-$HL-5^8yvOgmvs&qhd*NUY6g`3S3^}cp*j7#ARn;?-Vn6i7Su$M-4 zdQfexvz4L=l=vc9FR!}!AE7R&iXl(X#`TL%jNkL>6>RekpX3*ROoBqv__}e1s;Vo0 z1sZxB%=7AuS2H_B4Cr9iSUmg7GGcaTuaS(oKhc=W<8=D!hcM6^bKZfd{F2jv0C!6(F86VF(Ti;MHACsAB z{=3Nb+A$Jh?(sZ6(|aAr40&!#sZ=kd+`pHKaD)W<$7m$qkJH9z zBCb>+pT*7v9A=ht@wwT0A`UWXZr!NQNaoXRP4Br<2UYHQI2@0g|DclopHyPacCTm?f!scs6AD{b&~f^QxZ(>%GKz2}+ZPO+H6Pl;8^3_x(0+tdyZX1Y$6WSM_(?V^bV?JAHk~ zZy4fD9HVpGMlpk@T2p?v)wYjlRMaLe_b$Gw|Jp_g7IgBR)wWW4gb#K62PN7b>jY*T zN(k=9JzYMn?zPjW#Oa$r0Wg!!X@$AvWti&6(aV3iuJZ*PS3s8L;i>*n;kID8Czw!5 z)ao*~b17_pSHbt{b%~y8ZQ%$w-8$Ndbw``dTvV z3NWbW>K?<~c_W-RXbX2kTWgqF@@3c!&`I8!J`11ooL})ZwKk|e2HAHtUPA9wYLsU( z%9YjoH~`YJI@-5$8GTU59}m3h)3BzWv64;U+F4RThEp6)bIYu9OMD2${DKBK_+oCv zRL-T}TW$m1`-w&H{dM$gC);v!F}~yW+^IU0WoqxMG@BLk>hMMtany&|^Dd~+3cvU^ z%9fy14jYcI)`evG-OKp$>Pu?BP|DFHo2{MK9p&#*sq~xo@bc5BX~NF7HJO+3J3Shc z`F@8SSCK%_)Gmd8$uSv4Z?-RPVeVvl?2jKzJ)|01NKraMH3|x>ti0DLqFc*MOmIbC zqIdeLusK)Ad-%FM%G=(4iy><9SUQZCDWJ<#_!4vWNPN?ihj_fYQD;*W`=g~1e;ggN zCsUlAX&Egzd#Au%0#CF)J2-K+B(B$mKZ7Oskq@hu7eB=kv4Gzv-UNHwC>5cSYAnV<-G>8x>xQYRr0ZR;wcuwGak1NUfO&%X@)S zWv5S7kyfwJxtMOocu)FuJvVE6%+B>#=}+u~IYy3HnLTX{agbMJb>L0E)o1=(8pztX zW#OEhNx8rBTP4Q~qf%(V<3(Xd?iA1Eb$#Y8DCa>aL=jc&S@bkXwd%!;=w>FJ-u#nW z)7PnI``jWkGJ8?;2d_yVYU_DWx+?Vg!BZHpt?*4lW$%vzu42+1F45smY|cYPODQ~l z;5Gdl&-FI!t+M>K&=1y&{c|r9VI!<%A9Zt{zf(np=)fVB$34EvofC8y{o%M(FmA)+ zS(~2!5XSlGxKZG5ddfG{rOLElHx!MasF<$r&k5Scw0be`se0NfyyyWaz!}*5CGd-H zI16{fWJ7BCvcwmOV<-zIO0iv+Q`^~kLtaj+m>|&)qLwVvqMiBjVakGDk}O`6#{Ip7 zh#qG8XXHQaD?Baqwr%T09(|<_`C{|mL%v5PbN!6Woajnh2LvXfy*3owlx^j5og zQA$E$z6+R%Dtgn9f zfcvW{jr0NviSLX5mUKFt|86F2G*#fh^6z$%jk6=}5EGZ4yjZ@e&QyWtl2yjq1g@a|wS_5?p3aMgf)6eE#xh z;J}4AwW--5Y4|}Mz>kSiwdNUnK=#HNAiVVj`jXppk_{-qbL84T0S~{PBQI%u`7`?{ ztru^5V?N7?nRnqj0uFmKbmcYk=a25kR&K}Ml4%z45xnDF`9~IAdg4-C!d*I#w-X7> z_(XT#c3j|T@P>gVkSj3b6MeroWSxA9S?fT@5g7WRF;S)h_9i4k4y8Q}`8o9>#`98I z0af)f+X|<^ax3DN>U%pMpvlOkq`Hb)~t6Rp@$sD6}Kg~ zqpcb}^TX}&hzh#PbbG)A?-|am7dg-|_?(j@?G>0UCaD7t=#4+kKAumowOjEpNX+Sc z$Wzp$M~cgW(ra10sGoX{-!}BFd+c1VLOIe>Z@CP{{D#?Nx9pe0>7W}+$WP_3IK!lO zJ~!pnJQg?TYwm`BF2a|81r7fTN8G?%6j<~AITz^0uhNf?hwVPeH+=`c|IvBjed++E z?#K0iRXi=zWwJbDihWBR2|lYIv6V^rm9eEcP>efahT*V8){LgbBb}Zy`VPt&=Wi^ z=Y1vB#d^B3_aP4z^{#WxxL;v7TH=c@!&H^vr_yXTJgcZDooL7poI*qKdQsArdQqzy zc9eJJ9xsK~jFXb~f~2tj{+_LDFg(n+zLzI|vCOcwocRYc&yeMCfnIwIwtpHH`RA-o zG0UU_$HrW$!GXHxfXUp%hp{ie4{qgdI+U;DCYI8mOu`NHBn{}K;WUGANaP0)q1dPd=i?}l%Elf5U=J?By>LPuiCzctwp)w5rfzqp`% z;Y>C9JLy+8V$j&si@3wd?$ZV)rUeknBWP%LWY?D}dX^n$7t1_6L0(jur`J;o(Ii}Z z^ZfC;{94lT0~%UcH=Sv=PfDsEv7<@m$`8|?OF!IAQ=&pH%)T|T*)7)C?S6@WuVF+C zMsbmy<2@c5(@{HcByUt9_Z1IU7wbnnC7JeQaz@BFNS2~KIXgVNH*+RYyoYSw-MlNw z=8Q>Ppj~7Fe4|1HE%*j=lJC{Le#|tY*pdla)9*LXFSkX8ZC|zNNxIpj%p!>dyP<@+ zP|(}6=DM+J#Y~Y8^hJls%({)%?+;rLM$meeNeTRonkU(wilZb(^ru(3%2c#3H|SN` zcrFv&S7j7ZS7SfJwv|3|Gp9nQLo(J6o>IlaBlS;Rqe^9(+vPWS!>JJ5k+HAcSu~hC zc&q8Svt)=HIX|B_iF{&j$*<)e(6su|yOk9?m-EtYHo1R=Gir8-eSRQjX?$n?tTHDYZG_ICwR8K(bZol-*38i@OfKw7Me*Wxg{4zKJX>l#=5zU zsl_Mgx9;^8t&q63(N>PCw#PStN`&t_#~mH?OGo9G+PV3ll&4?ZA17l9OF4;dhqnbC z*i*QeUrc{TMz(s4`R_YZcZsuo9ggf*F3oh>lTx1IDYQ5N%dUnm$>*jCn8g(Q=IZzq z{HAT|N4;BBIccS^?b~@YSH~^$|9h6sYLm%tviwfAx#V;x!ARZCQxp{|GuPXR^@GNW^uedsaCCp7u1#LbTSRX8SdE$oI=6985DAr)NA$7r8Uz#MptJD3RgHtdFxs z%RgD}w0;-8G(n?!BK5>&=E|FBBZCtBOm$)^9D5dZWJsEeGyx<}5GCw99jejao< zbVir*-7cq)T*d$OGo~RVxpj+-{iRUZ$Ms;Z=`BLOK|k1YS=?jWhu(7}7kGVV_IADI zV|tkK?~tHnpUTPpo0Oy0_?Kz0its)UiphW5`8G@NG1s{(zsdY9^9~687FqcX^b0G^ z0Cn8{aQc#|pmNMb0gwHK+8`Ad(UsC?q6)SW5Bm!&ELECDS5xCeUi`q9 zgj1JlGh0{HYoa8Ll;W0V$Ftou7fNh;&OYW%#oKie-}(*yE)MV9>)tr$Y()L2^_T>U zU7r53H|xFhqhc>un9+sywlB`|a(j9L;@&OlJHqCwkoJBe%%UUIq95exQrnzw$U02U zaC^A))iM~j`b8?|r2AgM({wyVU@tgPf{Nt|don7z9WSzlWO@FZ&QC>Mc9G}bS4FyC zmQqk|Z?HjgEBD!6D&lPFz8i~YQ{v!E#@CNoua)gJYMOSUl>E!6h;EAW?Sp2S<@AdC zaIV2Q{68}z|IpPILe0<9p$*~oyqe$h9*F6O*#{&>b+8q9oTSC}-to$IuMVJSUjSMB zOs3-e!qF1friEv9clqz#Qu^0QQ}$O<#FHp{izwtKa*4gJQhrXu)lkN5R?LGL1*KX{ zHNL@Kns4cYYTLhXrfoP^=pU!S9-ogHwFmSJH7Vu>K!C2nZ+{2}Ul5(=EonM}@9`qs z%$?BEGS4t%i5%fPOg25NfE^TKWoCL4fAkg(aCTpYp>r>mtu7p>FPo#DK0kiYnA z?C$E|4&%-cQf5PD;Ub*&DOF@P7=? z*^zT8WGo3=I2E?soZjV)f|-;62@2P<-E-IQrB^Dhq2e}fbCRUw5~yd=vicGGI?{Xo zW!hD4t2vn76~6su^UJX8U-46O5|^twwPXvQC@Hq5n)4N&KBSKS#qAfgPS@k6pVa$* zlV6nvAzO;sNGReRxauc3q;~lJf0%cI{&oa@{vQ4F4bIVn*r}K3vv<;SHFMXt#fx7g z3A0=w%A>QUe#B9-{(sbmh9|i(tFd!8#%)_Q&bdoyp923j%3T{WdE1)zC%d;+a9ov{ z5I%?GRg{HTN|QYOkm_z={#_>jHQ4`;V)t4>_u2wNvVme|7qwTWscSNf_eIE2bqdEZ zJi0;A^QyOhv-Ik3?Gw+%Kwb~|TOGC`Y$^Zl6}(A-L0!y;vxhUc68B>(d{drGj>+77 zkHU-^;&^Y3I=7HFl4O@i5e#}_+=o>ri~BD~!O?o&@_G}rH_M&mEqopaZBS36QyQS= z+yyrZ73T}L_yPBLO}XO(O#RnHZ})97y(+mU-pu_`uMwvIOXb*ootFdue+y0)X0$V5 z|8G!(-5KYjph0OYKd}@lFa;tIZt6danjYd^?}$}rI~*c4DuaiqJoEJ$@!s1}Kk`P& zJov3SqDJX5=D^{3#)QNQFftRHdu3Ng93R(eW$Lh8i;b@Dd;sLkmK6+dW7Mo|>q=~K=-q(f*N zbB*g})yYZaq3t0tFa`TnKm{`$_w};#^%<171JCqO$Xgkv=%6n50Lo)T-{E=U&peSlK z3Un8tK5w<1{RrBlES{(lrCEi2z zVqaNGku*h4=ITTFggIO%qv%oRs333JEEb$G(|Kc_hwXeT53dKc+r(by=q#iDL=4BN%X0`vne#4;4^76hR9-{iBtas zM$*7vYF;p18o~CWOXLUkR2A=p<}9KyTER&bde)SP@l}C2Ho^~1^0vQ^_v@6Xn={c= zy3byQdU?%tWNqNS!SOUHZ>pZ`N%P^GvMN8JH~7_C(<1*YinFkNa%bTHDaJjbqbZr= zEp(3huI?!j=XpQ=l?T&zLSK%6f;7!;DZQpWw~(a0kjX}-RU#oEx|SNPEpeMl!yr?_+D<&4gbombzCB# zBRA6yzpR>+K>#b`P@1V7Bju((i?eFznda*rN9h-r7o0rE;@nQGxRm(zuPWa z@QN9=pn#n*j-%ZwfxZ1JqXF0ONW8{r=KEBP)M&{-YZ8;4jKzA?-Fnm{%KThgW80We z@8ik)AoikzV78~5d-g-8w-t}43rUICV=4~ibgbq;X{pzm-fn`6ujHq!A_umNqy7X6 zjD0kuopB4H&mR#L(#_S%Nt~xAN&W~E>FpE`3!pt!WIde2mGfJEUz6B4y4LBkH9}(2 zW=@iQko(4Ft_AL{H~mUE!6&(_{9Oz8eYl-A&>z$`CqKj27nsDeu{lHZXcHv`-JiMA ze6*bhwiHfvn|^G6VybPFW8I|BNENJUlWxd>-$j*Gm0u-jfmYK2wUXvLg{QQSJzdv_ zv$ZBA;zpJE3vb8vUPamSgWQJ`u-Y=%p z##Ca9xZ~I99CBgV18@vCLUX1{#ably?RnE`P&BknB-`2E880{^=6odbx?=;5FYHj1 zs*|}~7x!j(wmVXi8p@2S0ZU$>Gyj?YwH7}8SnSsshgjoD)M;zD2ScLRVRB}hOTEgF ztZ{YbjhVA34PTN>`fcVv_^%e`n$A#?ORy4GK|TY@UWb}F&3@E&*sqJS%k`!UWT@?M z8mdYeKNe;ba>&l*YncW?S%sDTlmhig{p`u~WxZwV4X4q$1HP~fwzN+seQ{oQzs?}+ z*TlR&u%c0V+fQV4H_+u2O5zB6f=cnpH^J3kh5P(a@V80nL<*vAl;zj*{@f*hbEzD@ zErkJDnN>6lOY!KT+`vWQx$H@ayZsjMSbvx{%rEk&H+&F|XQEB>FT@<$zu>%8V2z=- zN=j-FYf#u}vda`TN&QQuY5XSh7*8Z{f*Z15fJ$YUl-Bwd=Wv036|+NHN~6f3+?$6% zc|7vY&lcvzGxLyovEB`EIIr8uZreHC{r>v+|I_Notvq?q(Vg)g||<&0((E!9!oH7o7$7S&MZIsqtUw%Z|uO z$Xf1dli~;r+s!(SZ*3c{VgKB*@+I=1|Kso&vvR+Ly5Eq0EH7l}8)myHmgpYdh4Foh z!}^PAuZe`C0?QQty}V6KmceY7{Er^oN@ZZ{>BF?>%@~p4JB@#BX`( zYT9gcif+1hbWuHJQhc7{Y%}G|ZtnI@oUI$Y|KDe9f=ji51~jCc`UED`%wD6;GKJ30 z>%|c{L8W{>TSQSy8Ra%4S&A*Id{ce7w`R3Upsh3ZIv$ewv z^~solgIa?1u1G=tU{*V*^TTpVR_jGJnoNJ@-Z;{Y*o4x*(CH59ljr%F-_c`k&-(^@ z`J3Ci74+pUT-!q1k6!2S_zdH=pFZhGJLgZ8g?5(jaV_QjCQM97<_SByf8z#hg^yiA z{q-j;8r4GE2CkGK*8ol`bg2si%6rK*bdPvu>QMU7U6jBY`fIYFA&q-zf5_Wf>sEBViY}5>U zN4CLIYT0Ao%9PuOk8G0Ep9dfm60qe4G)TJEKU$fp&d12#Dskz4-0Rb{1^evXIl>mM z6L5HK+`E+pV*Wr&e=-0e5#wEOF>_nr%^D*9h5S4ZH;Rk zQ;Yk$1=hgM^J4a&KRB>K#0;~|GfUD&(aiK#xkuqC?xssv1QT6LE!o}ax|kDjGB3nD z-p#-ztTTgt#e?%V2WLGD^wD;HCY~-7vx8;6j-#5L45^yKak3EV_5sh;DZ1a&xhlrQ z1o`Rq--O%jnZk92U)sJAx}LS>xg+Fxb>&n}nA?*^G>BPB4b5i>s7rTm)DV?)B5z_X z-CrxcNoUN%g)oIN(85Xf{yeH5e+h@V70w@aqVJ)(uVU-f8SaJtapT7QxYK7PyS}2! zcrWpxJAE&W$_A+L^%v4Mfyc1Z?qh;PccsW zsTb0*%3(iwiLFJK$eSEV0X5&$-qxP9i7M_|h($H&e*56!Td?InLV_!E=^w+DS!8DM zTaIrKHDd3^o8cGA>Kf9Zia5nD`X9gO8=2$jGg@JhPLC7zMS8ObOdor*E9eax>kNa= zd8$;G-_)s~a7fk*u9WC{alvC$13$Z$Yf45qku#~thPlvbPf^|d{kzNWf-wIt;KVP1 z$u6a+4i)rBJ#3EbgCW$O_qcZ-bF$vE541{FgRJAEhg88}q?+~1vRlHG+tca~)j7@g zlsDSQ^&^*FqnuW_t@9wwlW9D|DV%K2*p}RK7xldqrze^2&MLYs}%HQTQrGR9w^S=sKl|I?PHqkOuOs9n8{cJ&dex5xR%H`>niUCc{uKyB3% zmU%{AGCz!GwXFPErE=Ab#0GDKd8ETayPKshh^etpO6OWb`}0?vhK`4>7v_bmncRZ= zsBD+g*}lyuw%e^!p(vSa^_Zg8l%?(6Kjr%ht}un)P;{4P@mTC)mMnzFesgz?p`OnqGB;M89^u#TB^e@JV-r&~XMJ@MX zcn|h8h?VF4Q=CNni`MSfvjNhpaR>bA*f?+n2>D8Xj<0O6C7}?f+i{AE0 z8pc_5sJniW9mIcTP0F5`-4cr%)KMMidhX17MO6<-qUUk4SBW{N((qZkVPxmOM(OUis&Q-=cZLq^RfSK`tr&AK*gcUCwH4Q;*XNxd+~`!_+S@qmfu z1%1YQHd6kKi5w;mY${%Ev0T-4dWx zi@I{jmlRzXx$m1zH1|{V-wG3%&$;$ORCMi#xo3w%8;+$MEHKrd<4x*kBS_GBO~wR3 zAb6@8#d=epF`T>n{JwsEAw#fGX()1THr~2 zVOkAYaJ`)VOWZTp$L{bAuC`QFp<(#@-5bVt;6i&ES4Pd&H<_8)A7@W;fvyL{@s3;0g6_J_1g{8b0&=tfvy1;1#%*=7VhV4+(3vROH7RH~p` zyio4MXm~`qZ}c%eO^uv%i3!DAdmHlC7aVIYyuz7(q3}&C+8`MtKRH*26_0}`FLt7~ zLb@91R8Nl@*fA!Vc_x_`?I}sRyZjk6gWP7@y!Hr8Ehu=VLAeXF)~VrDY$zKk`QT;g za33cETlR*W`(rp1-{8tfhURV4^(@UllLLLSyuI!`Cj$#FrO-=Kug{VG{fA949eJH2 z20OQ5#0wr$Uk*4=4dj3}HCs&c^uM-Ox-Iwo3LcVb=I#$*0AZhTMJM<>PV6h(Q7<3L zw_U6seLweFv-4wl4@&di17q*Tvw5fFw&gNTu9S@ZDu>32c6r?7Enmc&akT78t}*qx zVeHRm)5#`iCGMdw37dQ7=xn;!0#$^sc?^HC8sgFu%GL}^vBqay_Nb z=kq9>Lf?K9{B?qy!INw+oDlsL+X^QYO)FX*_i|1z9*x~ZkNMCy;%~{yzz5q8~i6{IF{Y*$%d@kNr*(S^G@Q9D3`h^VL>u}@2 zceo3dRV^k2w~w6Lr2KolHDQC;m!5AuJ$*XX`4S!d&771^K_$K^_|>h}nqQ@)@M0Ns z*SOv8ESx4i^(lAn@A#R9RGa5wXs)4txkK#^IkL~heE}71q{(qY2CLgMY_xb?X4O8( z^wBWcEKJ=%_;O%umSHcGwls`6E{*Ik&BC|;H@P}&k$sD1dxz}K6TDCDO$B2p))znx zUZnKd2F3l79<72Y_6#U`*q8mS&CaJu1D|9rS{&Ke;GigtyS+pA+CuNv3tx4!TKz07 z-1!z!1iCK-Q68E6Jz2{_-#aQ&x*;{i&dyF373SsM?P^m2HRal zyh5hbOqm_;c&5MSr$~1x=D6$u?HP~B3|#&eO0?h~7-JUtkgG69|8ti5KeK4D?ysg4 z;1U{=$+*38mbDix|1=8Z7ohN;LREH${N)`DlUl&UlBs_0wXI}(+zV1Y{TRN&0=?V_ zxaSz197h?IY@suE8$9JX=k8tgIbd{0(D&cx7FbF{^E*DcX;!+E*Tu;j&!;d&FY^dZ z#uN(wx>799cSlT?xIHh7aT?1spPkK|MQ0Ke8SY8ES*)58YG zJMe6;>GSq;Up9puo`(;bh>1z&ZR!XMdkjXs+1WW9c9@gd3y*&t6n~|u`nSxW+`0u) z_%+-*WOJX+op+6tj|bGN;CHgmgffI&VCP1;U_R$WT$sPGqRHHx_5M`>dqS{Fg*R_H|z(~0EcI(ku( z&yQM%O_}dzj&*i6@wOb5{fc=k5Q&$pZ|v2 zPZTXSC3ln9^H8|Mn>UJgcnw~(oB6sz9S(8o4t;}2%q(o;kDf3Rh#^bbc zA7}nd514FbJ(qg(8hzJnSk&{;OWPs)EG*i^rsnT4On>oB4D%b!mO}S5E-x3>-6^LJ zMD;^@kTY_-aNoZ{bNYR5*a;D;$+*bsP4njNwFfaE_U#Hg7j~xye85?LRhIlN7+YiB z-d6g~xiW}f!qWXnw-7qvLM(1yn9psJITxDpKcw&8N41pN<`kJpT`9<}Z!=XzT>yjq zIs7Kw8^x^g3Np4+>E+IZB9G;4+hw!-KItVFLy)J%EfLl6E%~s_^D>@R1$LO`4$x*@ ztLOO2EqA1piDA@{VK3iTSx03z^A?|-os}432gcKhl@zx-bsu{$utgZCLGa^A5aj3i zS>Aw)wWVze3C(xXYdp@)^0A5J59s)b`56?P-RZZ+^Orsd=Mg6#Mr) zhk=a_-DlOMuJ?tEPQ-4%oc0AgeJeF~y6-*2TzGqCZ@#$CB@I^3t_!JYElZ;a>NpHe zvM;*^eB^k1Qd_m|T)+F;oWcBX&*zr%=saPL`3&Dz(f!qkFFH*c#hJcae@OJ>k-yk$ zdaZ-QI3c>lJ3({%nuR|t=!TIUO|d`QbQV%xHoCjZI2{hx8I<|uD{-O*4C-tcRB7>0 z-|s#c&s^%A&BbYPf5N*e+b@Us)kbmlJ7RSZ%F>s!U54Uk~H2s?5DYa zr|kEP%~9R^4o%mPydsG1t@3DJEV?SS z9Wo0F{ifvkpVI!Jb4ihCn-)8Qj&9ExwASl+fqvi!IgIL{5i}<==KhspC~{3kgYm!< zr6%2vYgtLZ^$OklkD2G_)j!SJuksx)@w`oB;QPsUpJ-ybTYvCkc5|waClas1SHFNo z{*m}6Q4a>#ET=V>&yzOwBy!KDP8pYbGlj|=?9y^?)W^`)uXBIFVqT*!{oDTI<75Zs zI&Wv^hb_0m^#@ZqaZi?0u>xE0o+P-iHKlw*PHS$`KTRPw(!t#y>*Q)T%;!bN$zMAM z*AWzjx9gx5IAPD3xKre@B`s@|)WUDIJ?*^oahaXq$1}6LK*vANdlWnRd%+S3PDyJT zMNX|<+7U4eJ~#7j?x+L0z)m^G=iWxE^eyf?SCZJ6V*f>$SEI<+Z%>;gZ*2vpd7G-+ z*k;7DFyD8(r9+Z%xTTXat8rX}Wcd-4CilfmwoX}9sax;M?HXOj=jaEwhqJPyQPkT! z;7o;WZ^!CWHl&yDQQnnN2j;(u=6M!<^9Cx+>U6Q^Ls8zs3HOz{v4Fby5B`ZRc{fnE zA1Q^Y1VX(Sg8yg!DN&!ahmLTt+viOv#coybkC>p)N!Jm)DC-~t-xbw_RrI7UJBZUu z$Xpx_840NtVFScB{AZ>e*jf3#Tq!D;r=&gUM*dAQ@dN*1mQHXdg;dnD=p^oz@A?>= zyFPCCY<22BT7Y(V$1!ma*jsw5&*UZj!q1y+9`8y|^o-kTklT3)jbc9`PFw$QJ+rE%Z!;LH&6uc!bm0bVT*V|YMO6Oi7KtI$K?(> zh6m+R1uuSyinYOMIyGX_C2*2qMOV3xpHa0oK}oWq<~wy1D>IHY^Yx1g(I>oRFURdy z)nQ{t!|^6j50_`TQvoc3oxKhRY2`**Zx>c_?m%zV ze7MwmvX2hrHl^&jNR65gm3l>$`rW%#FD9Xv&{&2(Xpu~$H*wK>ZCgGOw|I^;q^s#F z=EU9C+pvp26=YNFb}{d+j#FN;lkqaWZe1HQ@23%K31?VZo+nxBsF)vc3`JOfJlK1f z=yP;Ug7{!+*=hWpPzMprdrEP;tbvybZA3fDptY`_9 z0=l`FYoDo`zc%NHqI-&L!Eg8m+(7;t9hJ2@6c(ilf;$+ znP^KXHd<10nY6+rYSldG$RxV%r8?SO<@+rD7kTd)R^{34`(nd_1sf_&K&6Of_C6;V z4QfzhMX_R3jIRwF_Smr-HHrlb8XJ~~4P(csSco->J!0%JwnQ~WIoSxmoffr1oWPmm4OLot(vF>3m#4)nG=tCC)%IrJkh56{U)ke86NFw;U#BJfYqV zr7uqgIZ9`C{8bnQNp|T%-7V^?`^p39t8`;!=*2}VB@?6$@LdZ~L&wm4@4R4Tq`TKF`1vdQcQFl**^09_nr?Yl9 z*h}HxoeyKO8$E2CI;ZH96MU5?NYv!Q%`Q=RwET8|b0zxFS=2MWbZ6_R%8aUlmFW>v z;VGYy16K%^W}EWfc9wHF$yZ_hUveJjYrC+Q7l7W4qW>T`INi(Cr*voOkMG|xoophocl8|HHI@X6X!==l-B#G<2*8b zm5;#v?f=rZ1SRk!5!Xl!-4f;VZ2I6!D#0KWPh>L?ssXr;(i{(m z%&px5R&Wai%}27LB$ZCQr`^CDw{Vspx0ED*u?}777<2^N=`tSUHzGJ_$H4_m^f+SscXC7qxD*uTQOuZX=hv}ekCqPM_DdmuzeAHGb zZF{3&5=Y|&lqaoqWAqh3K~5T`!z*vb%lIB-P{*F_YnsL#v=uby68vEib9s_e!*EiK zK(96*UcCZr-v#iE>9~E{;=h}%P##HGt4BxVPS@H(HGG#lCIA$pElJU{mA>#g+(2C_ z;@&uhCMylwdDkdrOy{!?`JU%|6`t%#l6qax+m7^!%m2!e%|ZFH@{A%=36z6HMu zCBrrj#5|36eu)#N9Op|S=S#ZzKWA}ek~XV)hs#j71{Z+q6a&Ts{JH&?SIs9OD5PVl!gH~p(gW150g+T6E`}O#3$~sO}K=w zQKz;=JG2gEdan5eSuh6j!$oc!8JN zxI1@(>PRKg8Fxau<32aiK6I^dAX3RFq1MT_^zc)-f+sqtSkBVQpfi6`6O^C|52Sa| zp~sv_N<*6dy;5`c14+t6i%^2;<#FusF}4&ERkG-{YvCS#hy(i)CwW=a6A`X@)V!al z2~JBSaTFc2pE^(E4RnSROy@rO)3DE&W4cTYCCqmkwQMg-WjfjxFqD1Bbs0+f%}G=| zS8Y#il4_)su0ehZR|;h14I**%fa3s$3m&P(RJHUi^MWU}g4WCDG| zEqOv0LqE}8KZX7Dv!R7?KK%bK{AS`@{gqnH)5`DE_$j}$yp#6IadRKXO)?Iv|LR{n zLM4$;hxd^l&qrTF&3Vh??&Zt{BOd^d5Q1joQ=X^`_0K52TB`hwX!qYp1s8juvg49* z6M2$qS4XMo?=jz_IQU6*eHbXb__&5~VlHA2Nab<4FpD26d@c)QD`4iRa z!kGVNq$PdRUG{8rbZ@gWb)Q4p$RUaernD8*abp$4<4v8nqwo5*ssCi zW%BMd(tAE~cKP6s*1~HvhjU9-4$Zx&;mv4~q{et`uK_34942ZwIXuF*-Umx5&9Aee zX>AKaywka#IgNR+RG(3`PGwF-b<|vH^2>NXb*_G*P`5i|;4~+ZcP0qZ7`Vx2hCR5U zu7i5}!nU-;Gdx`(19@mc-;Rq4`q|_I)9P3CB%SC}0M|zaXfSv27FpoEQ4E?A*J2H`EF8TZ? zm2=AnCfI@BQ1sN3ah%;nP574gr~#p#$T~fsm#SkH`r5(DhfxvMaxAy+K6GZAaT!)e z3HOdK+z@|Fe|U&RXtZun<$I#Kt3%3RN3?fC!EP>+tS&PkgZR3G(V}c|Mln@Idg;%p zofpD9Jd?GS?x%F#T2gN>YeYjXnxSMA&41}-29}+vm7_q$Gr<=hk&#dxuDU(v?nLxB zi_r<4A_t;0Dx6SeH!MYea~U<{K;GbHYLWTyR9CEe?t$gp`{Lw3#!X~bOh{x@4?5A= zRH?hkx8ErDQ8*n#NeBn7Yo zJNgEhJx7c+`N}e1b3do!Q&S|XZ4kL0GnEg2CwJCmb3bM$uR{fSM$MD(w2maLHI?qf zJ*BMyNl_ih^dCxY>o}64m#KGM8qeMday*xSfQj>cEwdFRMYbN;*D^KTJ(rI1DK}hE zREC?GQ*+<#jm~zjgR2qnBHbgNGXaQxIT$rO<_AnQv;SjGpmIy zOr`odjI;I%lZzzr>my1ye-O`P>s*^;O)Y^JctC1hGF(-<)Whf8>p&2#RIN-N`;OmG z%Fx2F##9SE^j4fm4=pLYs|zUSo^x6j#$R2FE};avszmbT(?LaZS&6@J=6E=yma73L zA`>=dGnaG?2*oYV9pM-w@Rv6M^J)Y8lL7nlqqB+Y8GUF0|r`=={>{Im(Fv=M0IeVlh6HBUF}JNe+$wyd$EdVXcjU#as>Ba9$1~X zE=+yn)+F6XlFCHx*Q2m_kKka+l5A-MP3Z#CISr-WN;LNeU@Y=guCBwd2mW}BvAZdO zi87m&GwdC;>gRmZsh}gdy(f z6y*FSE&-{e)0`&eB7Gz4(c530p{w~N$61DxN@I z{S3ag)O-H8V~4`nRiL{zFe9NqiX%~F6a{%`5cOHqU^t(JFu2E1>bd=3{z|7;6wc0x zQ*F)Pxv=HYl7E5{uNRz#IJR@}kw_B4e{`!=07*0|t!O6Q-6^y+LCU4r#vtnQD_{v# zEpKe)={X)cHt~L9m>8ZIHJlD#;dUB-l>vh<#%zY5gd*=N{`>Q@a88>zl^7`qI!z>kFb4_ml`er9OpU$8oC)jU8 zS+T{K{8&JOY%}hxxjfxH$47^^;)Oerttu|j8S*<5-0yY-ipM>m;n#2_Kce&d09WKs z?>>!N)j(F%4wRhhKpEfTw29_>FQmuIrb2!XI^a$HQImc(99LW)HIrlkz8Xo8+D&4e zC_6{m@1kJrgR4Mvn46=vyD_CCf7OG_+1;6XxfuEv4QVU=VDiTQogJ{4%I_-9*|)5@ zlE!jM+3Zl+B9Dx1!8Na{T>m^&M#-o$d`OM!;E-MDG2UO*i+ak!QyH03V zJrr)NA$WcQo`4Z>NR#ND_Ska4@~n?*WxVinnLfX z=9*>utG>6QrYdvm?I?V{2JKAOEW(wW1vpcc;cLhU?X>Yh0(C9FoZUn?vRlMsjjwMdix=Ip?o%tb8ljMew*W6`ImN#cC}IotktJ7%j2c7AKm5@ltJmXBXH(F+wQ2WT$wjj926#zgvBjr zE8O2JhV&z?aV3lpUq%lWS6SI+?oJ zg~{tar0nhjgKQ#60{j=Cdcqjox*4PgztDb7g8W-B`2a_r+r3`|3Teb2D}L$pXc?gPR|&jBH*^W;iQF2-OK3A< zS@GePrL2L+*6)?~{HDU}1f#CS8J?*WikIDbri1_wfAma6$o=p`xgN^5`4mo}E3T`d znvt5X_|0?iUS%*%^d1ht_h7kIaF4|>VWKk`rZQ`G1Sjk~)=VEJ_LS8JQuUcZ2|kBw z=|h(I1n!zt{U)lBqs$SxMKAscZu1?QyAptQO4&CiAyzO(~o7S*zzC*j8&53XoX50n))*d`!9yRf1vV*d4 zyq`elbcsD*ld^vrP4yK_QsBoh4`z)t6 zIEIqupD!9la(7{#`y29IHj+?r43+Q)=cjP7-C<)#!^13qhyC5vgqc`<<(b9@xN$rt zMv3=*maZy{$};NKNu-f}Fx0|}IR;$wJ3Jl!Aj+RI%b*XK@=#FaMW#9^+Y`|)&7msG z;{LP3o5bNFJweCu1k|nq?xhg$MJpa2;S@5IPpt!$$qllsj@WB*`t)K7{C=vNr;bQe zWrNfVpA0eqcaoNN+1ZatKI?E^$lS*QzKdkUq@tZyGUX@UoYy)yxJD~NH6*^As zsz*2*OS7j=aBD5$Ht0lUz6`$h1xQB?v~}~i`}Z;j@@I4ikLc4%lhJe(wBZ@ac_m?p z?BGBrlmej%=xu-A{(ShM)!>tR=sj}L?yq7>dLn+oN=%hqs4`*>P?20@{_Qhdb`fwH zpKy4=A8Ut@99W)3Zm+f9-!*axtcioilS(^rr`BigBox@`{NS( z;}zdRrk=Z)|C7W_B1wx~$o;#X8+a!O(j7xv<6Ki5HNkjm3~tt!_TE(H6VQe(C#7a5 zDYs{-&q{(-g`;STrhAJ=Bl?GvJpIf7g;hzNVbbN17V?q~)d!rQ9{a1IDG?Otf92fy zlHT0YQh_<*^~sX?j5EFqy0W44ubb#yCD*5%BLiPwjm`kdr(LJB)0*cnE>V84n}KYW?pG?O(Uih|KpYqh0AxL1!zOXJB6uu8`(j^>Ho;| ziN|D6dZ9R}%}LXT{x?PcOm9K~H=C|vH`V2@Q~^~$M4F$y4#*p96P%hYr62^^yj) z!Y52VoQ#4jgZt$S@8Yd|Y&4Q$K%; zFI>359iTf+!Y>_y?qDUA)giFE$M_5*@R!Ua z?{+u2oj;nqVNDxzGjzoVzY7NMJ}$}+c;@QhAd08bN`j+2L(LO`bF>}4Ny+&i#vLi@ z^UJtMzNdnmPCAMt^j$`7#Jy+{UeL|>>1wl+ zjqK!heAPwp6CKb>9wrkYjx2yB3IzyNnxNsl=RI^&e=-&BJ5-PLxk-M9yEQ9}&y)V5 z3r>TIOi^nX)l`0qcc6y{`z(k()}DEK6L|Ay(O(ruN1#Q+*+x4YGfjjMuR&gF4s#^+&wv#~Hi4I^Yoz5|HoCn zdnV4vQTA@|_8Ul&-hhuj(8Iv7)JmgMC|#_6romvWz%BBnInvUX%JFx*$;5uDCe>XxH! z-g$1I>J7SZn@NBA02KU)KAE~|h*1waxPv6kVU`|NUsRI|ITK7w>Yjo!>=jI#FUYKp z7U$uEe2Ejd0#3*%d?b>nGQ+tP-OP3}YlSJi&g|fK;J3bL$0SvA zC>rJYuylt=)|4dIQcU*>W&Wc%$^k0V3HQ=yrBYu{mfJlyrkft9w7`YoZfqb#tu!f2 zjQAENIU9`j3Yha9CLZ!(G6R(_F^dF?VhS;t&0U&F%Z&OeJO0cXHPAJR#CXp2$*gmF_vlLy#|3aA&D&~Q+p$y7o+@E-rniT)?3z7INu zdhn19aLaTCH6BKS)Lbj5C2CJHNp2qBq15A*;OI;jb(vT|9$26K*W*Jl-M_6$(k37O`R43;M z%Moion-5&TmyQjv&)Hyqzo0RH&q*&ni|X{)E_5sH={);0Sz|cbn(1&ZtMN+ibqT5_ z6APpZnnEWan%3=6*&y>5sG1eWaW2p!i2K|_Q%YeGwKTQq3mkmWcA6oe5G&M7pHtLU zcX1%RSBZ-LWL6mQY_tTo>WE6cAM=+-!ai=$J_D00PEvXZ?lj57>II8Ckc^%Q5Na~{q@KXR9IwreK9)Kho<421IJJ+ z7QsK>7t~B9JI$cN-wY~pl-&DAxDMZPo0nBSiFlmwf~{6{^^n@>d7$F%O4E%LpoX!6 z@W~|8p?Ee#zpxI(W*gdxb9AJVZ~akUlpG2lCQj8LjnV;wvkSfD5>BctYU+R1P7m1c zxiHNq;qeNYOOg*$1K02n*iK1B5%%edr3PJdG78cYjyI?mDv*(5Kr`9`R7U&>gP1Qf z_rFYEcu%J>OsXFKtFHK_c=pv8R1Wtvb@=L2wcltbqYO;PpK}DB?i$+fccg!fgrQr_ z)9ls%fE(dH&+>=iFdC%WAZxZ_&Oe9F|0g=Zmz)i+ z@jLsHTJ2PrVoxx|F=PkL|F>lPJ1U9ica$kb@!Hi?oz);P&+3Y^?}aYqQ+DQ04lnJBGN0xhPoxE*q>p7{OSkj6R~<=qUNEZ>rYz0V$u)2Sr9 zY$(jo5LQS!xXDj~XtD#Xpj(5`-cE&;TaLc;G1;ueIP1TZcNSD#)$L6*v+4b>D;BN? z85$FD8ZHI%+ySPWOS(@}R(K@y0hTlC^*6lGjlptT;~N_Q_dbu_af8y}T(dgBC3`W~ zbS#MVa+J*nZ0Aue?gn|g3F`I=3`%@+R=ULf=u>XNxEC<@+n3Xm-=e9ma9}&lABdtAAlCf2}9JDwDFOo#049tTBLiK1Ck={v4d2Yo;>|i7=4qg369pr^6y1g zSNx0##k;uf_VcCvIqjssSOKnBPI(5Gq9S@qHfjZwC0TS;PfRxUaSxETACpa2Rttef3@ErX6EvqY>xh;y^4RknpoVM|LA6yyn#tE=@cZ?={hcxYEa0XeX!7BvJ`NTi&GRsW zD5<)KKYuoq6cIUVcT+JubS`siddFAy2;zUsLZ3jMD(Mu@^(9zM9Skw3A^0EWR#!fX znHoR-S2O&p4`_RaH$n zFq-Q)OH$BO#IQdVf0|ic<%$(&@5yfveRi(y4Zoohnzu|8Z!d8n)*#ibDZZzruzZrG z=xHi%s>3^K0ctTFRDB&i?KPaNZ%iI=j&*2hLSyzK;-?L66Y3G>j3w#78adyd^gOgMdl|gi+Yu(4ne?-FAJ7!zg=dMm9S7Il5 zc9-xuJ;f_t-J=qBOc8LzKu(XNI43+%tORT8tC>z;a0f2|$9<~(3dPS1&XfIM5GT;U zy+`X&8SZo^Ql478>48-#{ha^sJ(+GL7B9aIFLaLXhxb7MBXw`|_c6TFet;R~Yh6i6=1blf{D zK?k3}q!f2HRc9{D^ttLDb$BO&t?mJvx=89w47$i^JpCTh|E=7PZRwHkgG`2V`uF0* zDga@t#T^;V9vI7W?nH%rhZLxiq({W@m8Y1#0a4k5{?yZ4Nu94P&3*X7dwI%Iq~>;{ zlHADcRX`fE5B;YDJ!Dsv$^0Mv6Ec@6j(o*2c)M4iOvuCISAf3DU-^~W!Uj)+G2hSJ z*bC_2pHqnjkeJ^RW^XJC>aF0Rk^of1>E*0O4o!WkPxo}?N953W;$XI+;EZ=AkP$o^ z*HSjg8c$q>Kp1L93HC9BT5~$c-byOXC+-Zg{OW3kadD6=nQpcWZ}WDX^5;mT`=BWg z_VF3|=0VCUw-q+v4l05-q{x&5{pbSXI~*+N3a3 z;tz+#*!Xweadm~W7SmLO;jw~8%8b!nc(TvI&zE7{x1(ZOi|XYrwLl@JYFj{F+j1_; z{L)qIfGbRacu9&xI2c@KG64tcr=#bPNhRk|R+ds8_RpCnJ`gtVTP8B^;a8vK9B@zC zbMFMniTZ_f>VFbO5~!(WQ)!C#?-r`*e=5x=kl5KOou(9Ng0b{X!lvfJTsNWeG@wIT z>Z}d|*#d?wNM%jO@*O5=zN50f&hr$3pA!5>-1zONt9z^IxDR=VrbtXLA5%SQ>I{cVq z)DV|WUzM{qmtB>HGUkYyTx!B|+>-TFI4Xji8xQXwm19_+>a;g1GMNQ%n$GGS*b>q#J#XIaYG++k9NNTC0)GD|5Rb`kK8HO@5hFhx@S#u-FQoBM; z)ernV5dCd)YipEUGe|+cgsw|=LLeQP1&45ZrH>wfX6FA&3;&OHCKdI}J}@@Vs7h4p z&8gHU!&@JqJ5(9>K|xB}?}aK}6iB1NI&;)i|eMP7@lncBoIM!hxlLPH!c_>@3`aiIo0M_{MVB z3EZsI9zjY+<&8Erkx4vzSoQb#8r5MIE`rE=qU_RAC+6#;xm888CUYhBQlWh?h~j@H zby6H$Z&k;*e_I^BzHumM{+Z5loD=!3Qt@i3YV%3uY=j3YnfhoU zr^azG%S6Lac%pr9h`p%fzF^)(ie)8}?&Z$(gNu_a@{i04lIakmQPVtP(nS_;@Ft$K zQjRM8LLVy1C=#5yq3im`i706pV{t3pmoB?ykh(X^p(~cTDdIX5b@6EJD)MOWlJw%B z&q~B0Ka-AhFDKkf5N|UxRg?MNX>_5dxGRg&KQ!k4Si>xBxk3Dx!uc640l7bNLA~D^ zL+QCEj3brA8V-4);9ha5+tuxxDAk|ZT3i~z>U2&eq6Xrb@hhSwjk?=33jZ`Ds zs-{`Ti8GTt!8A(&{c1hb=u4R7wcojx8vlh$%TDu{8>BpAiD>zy2KQhGwPy$A!7P`h zCM=GoV!!EMX7NbM40M@Y)!Ftb`9kyfCO7OJ=|OJ)#Q%*~V})MaEcM9RSpxI8-?G-a zg|}w5Ic$kA-qf_2K}yp!5*A`0GX`$!yTP4~S7WO zb}aKgH=9Ize;lQltmPiKUj8IyTsVVWjyI07Wa+Uk^4;(22X4N5AR-@7z4?+V2yIU` zvS`NM;LROmEej^-gw1OQJ3WAzN^v9urO+c*qZ><*_4VBSyOyBcoljLe4aa#qV?(tA z?}Ph|gztZ0PA3!mEd9d+>oao618oJ&3TOd7^fu2_?nt6r-(oV!*u?Mb0>&yq`D@QI|81;H|R9EiI;J^F1Mw}=^$ddR7 zYt#<+_9AM~SM+vf<@mgc+bPI&pRA=29JfW(7ra5{ZBy`;R4|qwnS~~KKm9m+^XMES zNHt7Sx}jjDi8P_;8cafY8*V3=%GX#adH?5MSV(sN<$ssVF1hckNi~_IrUZ3{3CUsI zR#QsU*L?HSRFwbB{Wjnx%M+EfCRpjJG}K(FObB)GH~XO(Sw_7jseRSZS9PcAD+VSv ziKLj7=oI$AiCuyR{tZ=WWxDatV5N^UOQ)@3EiU5YiJ@9vYfa@Wdnq}Y(ZMRSr4Kjq zWN&SO*8LZAf(Tw$_f-C@Ully+7xP#FwAx=!}TKl+$}tNkN6Gm zsN5?#JraV|8I?lL^J#5g>NUxTx<)p@r({H|B>QLr{>)^Mh&0g=FpDyd(`+^Q6xrM)7f3#OWpY=n zCT7AV@x?^Fzn!$IbKK&;kVsL}sw4Ne3s}=o(u1~I51^5M2><)hT9xF>8mLB-VIF?q zjLwHg{oPiI8IzBc7gf~hbE&}h;bFdj3*b3xr?9gkNw2NR*dL1d!z>|KUr(~iOC>6Qr}F2!GFn=p22En$q6;DtApMXw8H{FEKXbt zT}=V1486&rrlzG*v;V|RTv#cY+n}SK1)?Z7{U2n1hLFk8h?98?&+e{XWENgL$gs=+ zU{7Vb&%QoXR(YIu$((eO*uRJR=!Vg1u0uNBYW(O%ZiT}(CujO#&Y^|Mm+OVTF91b+ z7Rm5c=mXEP8a{#mhNHge0f#?Z)_-=e!f$$#UY16-%Q4P~iYPE*Nlq9>*Sd(6aF~wu zbLRhz2M=0=dnX^)Qx#My^{8A#t&~OIcN(STd+NCe=2}OSU$(+<3hhN9?!!p3wxhTa zr4|)!dmNtRC8U=*fZF%5%bvZllpew0JcmABNE(`>-m1_w2?^zsn z?>KAxqH2JNHHR^{LH-55|6H)bQ_H~hNJdS6*76EGhPy!5N-~=uTH9DD6Q`p{%p$4g zG}TumI=mEC_I8!&DM@U1)Z{fYo!~q4VZVU`cQZ$*{HhJsr8wHXIg8f9#A|V49fRX| zfQqmTXS?X>X1mlmk{_(NvUN;0|DYKQUvr3F|B*HuwaRPeFa+a59EiSkJ@@H(GLZft z|1f|Q&dn&hZ*msACD)gjvID5LIil0sD+iHBzl9}9jFbHl@4z2KguNT`e2o1 zRE=7)0rzuz&Vxxz>)C_8^C#{M!GH3!QM|89=(b_Nt7bUVp<`{&+wD*FxP%!87hv0djAFZpV^7yNGF>`FS7-$$P4Q| zht!Sl(9u}%9}glCZxQQw11|3UVBdeyJ5-k6 zHRbPr#5;aRXW?h535puVsqvY$BmG4(8n6ZA3vZ^=_yOPXJ#=7yk#;I4YzPzj3{=r= znbSAGwhDboh|&u#)Ja7zZXz#mi9uBKb4kfuh3;w>uFcoz)ygsh(4AQ*H)u0fz8sj4H#DiRg^Gp!z$~bkW(d&nTX@1GR{08(k%rrq& z8~3P#J?Mm-DC>r*g#S#HW$(+|{TCRu_}24CR(fx#$^>PD>PC~{hn9h#ALJgBY(gL2 z?PvJC`q+}lgIR9dMm_Ya?E^lm`gQ{~YbO#GW-@ngEt#jUPy~6=nY$;)Y=$fRf%&xg zWCoRiCyZwG_h-hiu!Dzix&6VqE9t7tz19onbu z^E`U-ZLH{c<|2;a>lxvJo}(-@(1CnT;-vVl4x#jHfH$-w8Jj2I5?^x*huZ2f+qw&i zgIUaZ*oW@5I2nsIso~n$`+&*JhNW7JBK`zZ*YDx4@WCmpakM~d7LV$8iX+qUJ(b-9 zx)&d^Q9flt+fdMkZ>gH=((m?U*L)3EyoX!sFQ$Wpqw#7%f6|XiW&sl*zGGH2&yx_M z&M$BLAfXx^x=Ptc8o2Y7+8|i+p7aYcwXF(i-J%H{gl={Q$myTpj$vdA$MJkqI9qqp ziQWNqtd2XbA^Oh&ppH^Y9$?K%y3e0NuE_cPIj8dw zP?iiq_O|%eeMus0N;3EeQgGITe2K!l7%IbGTob6bGRX?PCC@rOMCoNc(G(hS z<@MC`Q`Jc(dO|;K4G{I#aQYLdvopz^y9E+fmaM^caQgko23kbdDh!QyPG8{7tf*Y4 zjmTsi2A29Y%IfW$qDMK$%P~j61tuX0^UFB5bE#tAqVDTOX2t>>$+^_!h2Uyz^x;W3 z^hH^F2vp@Ud%uvHb~2Fp9#fc={)n@+G+wV`IK0M#3?F3$h~H*73V^n#y?vQM(bUn3 zu4X({=~l;4^s~jt>;1(!fg2%{+U6Gbb6GrCGL@nqnO14M4TZ7Jb-xQgw3VNM@{B~) zxPf%a%S;sY)Rx7g*bb#gKTf1Zw-8U1-9%g~zV!a~1A=h%ze%dJ9vO669Sx~&W8a#P{-x1dAKrEmL#_fdwbWFUy# z6i)R=)FY))!X85{GoHz*NAYCdVyfhD5SX^i&-JCRYYNgf0;FO+ri``z9-R@NT{To*rZ{sBiUp3J7v_|d!AJ#>Bh{7CYU3`KDB!P7?7Wdb8^tUI_ zQ9mY`_yg5z7;X$vjt`@g`I_9X?PSXw1(Pg?A669P{dpsj+nEdI@|N4R7hKi?+`75k z?1cCO!GldwyWH1 zgWx4wSbrspq8i;v6VTt`uvF_f8_!eW8o{(iljX3H#Qdvhpi00$nVGhb2yed-x5j%? z^CHPe=!lnbI`83oR>cEYav$DB7g+nDRJ|*~o=%~?eE|lG^Pc`7#KXIgaCL#4elC=+ zeb5~*&@3hMIvX_p0?MKQZ7pV%x21!a1U9>!8}T*@4{uJ!r8x1=lXdi-H4zG{*Oz&D z3#sRs7>j@C4R50y2yHE;g82q4;*G(J84Szmj^*joOlRQp9+4V00iRh{^v1!~2t33c z$R(XhhGiBf;cam6Pr=Y;k}kW~ew+Tx+ffz%v9V(S$ii}}>b=Yv(z6%7AnRZr7-BZv z$}>{!WrAQwZm$ujh88OP{u=qDg`zy8N`np6LtWki#ns5Dxg=L_#G7{xeB~D~Irn}k ztde>=3Q}BUVRM)X464aGTn^G<=Im*8$hd9D3Xw*27KQ+$Htp!C)fMW(%G! zso6rqBQP|-;s@egtms)tK1XA$727wl*=XLyM)zMwQx2DmZp2FAo z22Xc5H+p+c{}j%`UGS6sFh;TDr;j4%H-l`CE4T=XgQJ>M=I}H+)V18@dCp(ygvz^o zNTUu%P1Ty4VIZp`ojH4Zxf%1pV18#3i4$I=TD)aQvTv|A<83D2$Wd!_gi=Y z{^Jj~9YYS~OzjHlUzsfOgbuHoE*M?59n^j~Z(|2uN+0;WM)2BC^o*-D2kSXyMuFG^Z zaS!QDT9OBs!I^(n=daRehEO4wAp5H?*xC0WEiGZBFXQ%ba|!+Nldpl_b2HJAr1M=wKt*rpL6fEx`mUnh+dSTq>*O`kD^au{dMRw{Z=O8_~jCfL4C>^V_$JR@l` zl6irJ7RK*3 z^YV51hCNH{ml^!(|?j~OO2HZxIQTp%H3#}pf`b-^+uC+ zPpyq3<^ojJ7QXx)yAO;>2k~!t*HE}y5yfg%rDi{(m3j16n5;4h)oU+0iWi24#yIkk z7PFojT4mPgVp1|2Iz57Fs6IsI5KU(_l%Q*hqR;P6*5fpsxQF4#BrVX3`p={ik&@8C zuOlrxo3pMOE};?nP&8NT(PxY!9d56&0%=S=QSW_&lcP4ZOem`T^;GENVDI*#+mlqT z6mrmI&cO(0C^_frnIkn0XUkq$pPCvoD}YA8eh#l7FM-Z{kR$rq4ms)rU^@EIw#* zW}|B;oV5&^n>=)nWyk`Qr^^G!_zopkB&yCSuq^kOr&t&NNHx=D(BgI^bS}sJ(*dnk z9(Y*=(&c2rv#i^~q@C}kW5~iy@H<%(Ds7xz!TooH-&>8Nqdl&IZ#fkrQ7Oz(t2BiE z?=s4zY_%p=vxh=?dkJXOD%(Dx0v7E3wY?$=3>Rp-g&JQpq7P7-bVQNU77y5L$edm{t*>T(RZU^XSR6NiweCoApDH`WVGtAM-#kv}n#;Ka_ZV zaarsm0nQ7xT_?0?oA6D)LjxU4+D@AN06B0C(SfX@clw37a~Yhhg;@74my_gx!D?2A zny;HwLvi$jagPL|9q2}ie_34(6c8gg8xN4%AFn3M-+_5JVwi9I-RM9kH-;Ng?!uz* zlg;P~g&kXm`}!w*`z0)8NY}HVp6kMT9>SMc4a#|iDQB->WP(X+XbH}F2Grw&wI;lA zdlLBd>1T1$gY97fLyMv>o z9AD;BaH(!6Qbjw~n%%U7bAK1PnBi!^S8~hUr4OjcgfuIjo*5{&@=&N3aNGOCwz*JO zyM3Sg)!p_;5+2fPsJf>VJ~A!YnE#>@oCgQJlW%q%&4-t^8dXnyYQVAFbBpjDbz|B~ zEikz6^+u4I6NYN&^$c|NC;#RFyP)V5HLn5P=N8tnfgRI>&SpAkJi;m$V-{Z!PS!4H zKNi4!9Z`zfGR#kCNB6!KN6agA^2Si__Ctjlru=w{o)?-TN0z+!~LPWeW)k`Ode_GOl1(6#4Ak;C-bk&QJ>YVo_zdQ^Nl9+n^4t zp|mgm-S^?ng{`Af+T-b*M&Z?7#rb$m_k=7>aSTN+osU452!-xqY4!_`6T@P zOVG7%<-YvDjafzAm_xYVH<-TVH(jy(MCDbAY}WShq~B6|zNPwXj6dlc>hE8vz|Hs} zCULr61Zywz_f+$-D*rJT4TjuRGDS55q#;Mn`ExZCPUH*HU?4rPnKB95xMvs{c&O4L7 zYB}EH*WlwuCf#=9EE&Q{@*Qa2anQU+CvYl^cN@ z4W!>nf%8m5_qT=9qByFPPr(=lQgKa!0Xql>c9}QuhCN=!Sp{q@gv7}daFtE?6|Sk8 ztA^6WR8sx7@E>U;{htzzsn!5HFi1NJbS;m2R>xN=O5N4bG?+xLJ)pK;q=p8Obld=R zYXHs=;nL6BO4_~24Nc=aWT9I=Zofqa{~x4Yy1@B9rwZPU9%egkVL`3Fz}dD&&D*<9 zeftbotuLP8>|VP-s@*HF0`?ZB#2xtTWLH#|Z5i zq8mCw&hB**4nKmrR)lTt%1RrE2m3PE{ROlUMjW^kapVXKd5fOd6K`DrsWm;hog|%f zjd>V|Q5O2m6P$_<@y7pwJKhVlQ$q&S2$0un)&+dOU!5M_?%yTp)lK0n(!i)Q$;mm- zI{J%r)VfqO-Ep+1!@@+uzr?Uh+jFXoVmGWOPazL|ekpMH=44kl0n6FS?NpET^%+QB zU)GnX+cuKoeG9)p0jZn!V4*@SI_@Ut-~R1E)V{OHehz_elbc7To}%{&s;O#@qU3$% zpz->ZiB3&e=|frN=TQ4(k?DWWkOFS9QKhU@=Wh-``+t$Y;)zZzkKW)dRY(W&$R^Vz z<-_hZBC&IgnlU4esk_cu@?A7FmA1v9&V+woOGzT{NK{R^hKWYW3C%O#!GAOq6i)Jr zx8iEuiOy;yi0LzuK?=CvMFkv%iuzN00*ho#N4x*+@vN4mc7MJEDe+4g2_k(-yVb8 zV?GMbe3b2P;k#?9dgLT|rT3YcQ(bGNpHD!owgikj8(+{Jg@O5l2h#9e zsL|8tdQ9+bS)3^G_|Aq=<38l3ZiRb299%jcq((ATi=lFtJ=;ayWqJRHRJHd})sE&o z{oZ9~=Z=u~lvL9r8oa^_AJ3;?6(hI_zSaCmPdbq5QZj(Ml1?wmQUep(x3He?qJ^kv z2!dVe0{6K9j^POIh(}D0Fp&q+3#asW9NhN@9gfRjvSnp@AFef=*^GdAJ8)qn^Qul;ccm z$VnRysyk3AgL272kD#lG;kF-Tp9oH$4#II7jKc%>TU|#3M>p!6apZUIfQLRwm3@n} z*t#GcjX^oYFLi_7{&%WwZ&H$+@SI6hKFd+8pC#+UtyhnPx&M@NZy_^}H{mDa{f)1w zd>bX{!3NOaI~*8RmSfd3!44R z+(V_;$SkN%YUV+X?TXF7#4$0j3PrUgw56%PBFTjruNCcT0u$b6z;&JlLwRHHgTJ;J+mL3^ zhx%(Ay}2aozcG%Wh8~Z{ahhosCx`46ak?Kv<^CKsk1uRVH``z;<4xcRr|?ug=5{Y; zFNX(tAWGNi_7aZL4sS;#@Fjmo5WbktxZNUP2Y*#L^f}z<70Ce35|oJS%$h2DRPOKX z8sUfqQCPu#I>F?}H(*0esrM6ggQz{$>JF2j_bWVZMecytFt-tCvB$vjoitn_f8z~m zw%V-4Hlz!TG4?R&Ek$fO+`3`lI=2)iP?_GRH~ySO&gJm2;(hUDo=g**2wTa%xJvp3 zZ<89%{hO+D#%7WVbQ@pbpWJ6n!FWee9nGUJx<`lYqYL03(4pMv39g$;XS)ggxQ*nC zLDXt#%ICLBB|*E9tKwj`-AK5fiaTu^{YU{RZb2%SsUPR(M9!ndmgj1cW(B+j2dpEx zuNOHAMNNu2M9o%HX|LQFO=0}qaroocqcc4ZhwY=3T-~`11vy>~r|`XE6GDwTw6Qmh zOXzWTTY|asZ!s&d6UwW`_yJe)+{dXhUdS__tEqbDill5d1<{?r_t;DoFB-Nh@HiHb zs@AZ1AGCWw^e-D4kTCU;?4{9oGJBK2e~3!r0d-w@)MIh5W8>-W)}i{iNQd_n*L+Km zr9_zFoz4I<_C3kms;M-0uQlCat*bMME{%0Lm0R(a`2kgxFC9!9^s>{r0S{9{{zd|4 zVQX1(Y?9P0*7!{Ql=P|IXo#0u9*(vLo7wu__Df9DDLMzQb4A`Z#Z* z$^RLHsyi1){%+Ks<-pO++{@j;(AJ^WJV!TMVDeYWN*C_4bn^xg){N0DR zH!4xvM<_ql3To$Fe94k9ozc_`?Q!f(N28R*uRCqHV2ETkUy5;#aXV8FWv;U%X8cYP zg&jsW44h0*-t}Zxo@Y{#5A#i;@ns~!1ukIH$9G_3-u9}bx#_s&Z`zlDGwhc8-Mg03 zVg^&|U(s5*Cp+uRoDg4=F|?ax@Y{F?L&@T3iP|dJv<#$fJ9X6wQxKh*38&>`k}fhh ztB>2X_#hvGBy@r&9>G_};+nKG!q3N#ONt$0r*lxKF9sW)Hl5Sq;gxOB=hQzs6lcRWc!>r_tAFYsc2 z+FHU1CZgHd$=rjhc-dadvqaZYd#*dVvQiW{}X9dAGAiYpcYfX97PRy6%;0dJEa|5$-l_PIEKsPHQiuoZsi8- z{{H;BiMUdVb0@ouU%-|R=Omm6W4;;%*kh6%e}_SB4kkW~T52Wg%)2niWtG05BbmKP zy!RB+Fz%D(?tyD*6B$Me9P{K|B)Hd0c~G^yzt>A^l%rd4l3jw2|7Z+Wlg|gJIh=c8 zWX|zM?wefrBHHpsR)gpsXAi%y4T2Rnp@Q1PcjVtqs-@1I?dWyNp!+c573{`3S)<#{ z8hM7&Mf^A#G#4@OsOy-MkqtxEml^PFjjhb*t!yilXjg-zt`+yt8| z#?Gk^jxdzIbp<&sN9mP*r>-dN@KLgug0>j{9?VbOJo@vj4rWl3q(;x9)GE2NA3Vo{C%mm6s%noH8W~$Ohf^MIyrS64D&hR=~9k)&=dYdfL0`8Hf9R|}O zSwMcc4*bc0GJ)hRhULA8r@Fve0LDoca~MY`S7cb!ngP~W$8L>cuz;7+u2O!O+%2UjVNMX!KPOu*)AJwKM!89i0yM6 zMqiN%vk^zvBhDGWfou?%}T1IGh}bRMU!Mj$<_}AP!ZCu|3y8%i%RY)82fm7;Z*Lmb)d9Y ztw(G{NtgbOG)O0&9M-XSsOm8 zZmVuJCzoV|NvTs|<1c>!F&IaDscFj29YvkUp#lboNR zu-Ok^6~KCI3{I*185;L<$ekPke$q*E5uVu_+$w~ccNQFC7V3hDyqEX5xVoSUG$G-5BT0&aJ|C0{FCkRn&t)}|>>mkkF;Cx#{w>oONuq=o{`#SGU{k0*OQT2o zLV5cJfqWmfMW7S7PW{$^e<=wMwEOq9gl}rkJ>{>fgaWk|it^1$yI@6MT^9FHSEKk| z`l2d4Z`ntpwl{b{6?}O&92ZGUxaaIZwXm0W`35i88Fem)s{Fk|@aOUi)2RM`)oSr& zPDe?ShHkqMI@{0jhVN#sTN-G6QSuWilVG@l9D6d3EwfK|%{3H6QYPW3C9cXDpK*GaC%#b1ooAJnfhgrLJoq!#kS^D&Lg z!6oQQg86m};R?d7M*8(caOZq9dR|P0?1KV&4hn-awyt)0U$H7><+dZtX{F1I1-pl7 zqu2SLexC-ap zWs9UY<}x49mpX4fh~shFb$bg(1E-&Bj%$#pRWd_W4K|&-t%bG`^=>GV*!+)okgy%v1CIYv>Gc!7F$q+5T$xm29>`jvH%&CY6F z=%@f<8;7UQ3pJ%=txR#xsmu;lI_)xKKu$pMP+l8|F6MK*d?#^MzJ%Fs&D}m6_400= zU9tI*s5M97swi%(#>pGWik@eliF)>)^$XG**U{N`vY)XZ1*5;@Xu?k4;5_dPAwhG1 znrl@usv7AtjW`Ea)4v^;3CHv?p=vg7anRs+_RnavIH&NEvE$hLG6Ii{g=%8MbHx}sV3VS4|*<+{V)=uE$yov$^mppw=sPe7!C0F+=ay0Jh z2h%C+GCVX4puT%R@A9XqH@o>9e)VpaAC=dzi1i!PaM|?lg=~#ck@mNJMJiGI|8k`s za~tEUUS+f*vP2pIZUX6!As-L{3{D{0J1&2=1h&SBrHUfbLKwQcV?=C1z<%U((RAOb;qMOa&h70C|`2!{`06uy*>4kT3A=hGG z48w!6k{OJNBr12{8B5?BSORkO6Z_!<3|k~@XBVd8eo5~>MIl!gIn|r1X&4L8mR5y7 zYzKRI6K8B&X5LOhZdUe8$U9lvcW_3O1e5BB4}K$R<+q^kF={gG zAf|S1;O;yM{{E7_xjYV^CMa%tf_N?fMcIab?V;o+Xu>>3faewErnBIK>BsDkiQGo% zXl_n}V0hp_t4lU+HyECAoUc3Z6P(muLbWGYwj_QmftSmoHco$o%+FrfYPh-xvu7xD=JzVbX!$QY8d~$2Wpe z=}YQB8c5PEzF097dww9%GgNA09y5MEA+xk6n%0@rT1PqG9)tf?2LFrVTeh=yhfUrF zpK%;5pMiXK2mNg$G+oWW0KeqiO}G7m_M<2>cq2*l=}EmblZ4k@WKi5`4) z(1}+>*E53I598rJrlEdaBGaX!!xTT$2=XOkJ&Z+-CGdWSv)hMJ<-I^#=uHh))f@_rJJ~!1 zeN`b&u^?+ruxn8mEwHWu3klyL$v4<*Kf?U>FHwmvK!>x8OdN5*R6@~W zq95Cjck?K-C-dC?kp%Z|HE0^KM$f=!{YDM-5g13H%uU=%w^{&&G`bcX%z$q6)#I{KRB4!zHOI+&wyb3al!if6Nty)7)< z&mdFp;U9~#4#H5ir=o^Eq)^HzrNH^#bspq3G|Ir9>#p4Dm*sv<3RC=PS@u~QX3%B9 z#N2>~iNP}RMH~ zvc`az-=`Xl<2)S$v+@80A(5T2AIErcW+|m`Z`=Um3F8c3$K-|gWW6=UIVyfff7V0q zzder*YT~I>tm1p@%#*AKa}DLL977LG#WOxk`Q=LU``eS0k%!l)E?ntw?SADIYz9gr z>E%8scKg$F@5X0g0+*V_@4n3ZIGL2bS z@yX!OrABlAW>03GcTp2Ke}m;UlgcKuP0FD1X^)mvW)9S$?;MWLxqv>ax$>jlFi6%; zKiurQ>0L~w#-NNjOgHjJZ_%4R?>={>L)}-W(dASjA3K%3_Zzx;GkAz-=E}e>v_~zT z$B9x$%@f^EcT=2fgA}mj8*0V$Q~XMCa!C%Mf_x@=n)EO=2e&F|!)>Sw#=;St0X=!E z^?)Io3TC_m9P%eH?T_4dbE(V@bN^gnokY;ZcSJcSo{nQ+2L;@JGNIc6x;+rZND5uW zZzN?jHMPQ*JQ}X$YZT(^IA8B`|2M_~A#)__!7>YHE2gXL+g~C(qd$E^IPNahZge>#T!rND}0B zQB9u$ZMnqPdZie?DfGZ}c3|jXYDRq-6lyWx$zQ^fjDur3gg@jQ{*cn_mUiUnNe)YZ zt`(o$xj_3@hSAnUWyDXiwM2!mbis-1{hZV`CIYHsBp z*nuTLiBFT2UJhQ_s`o}k))-u75O3g+^7Z%`gVA3#WEb{V-FOMIeGJ^QO3|8W@8O&z8So8xq!>Lh|89=uJdqqW=)>MDS1e+dIwm**d7`-XJc zBqp`3Cztp<+JNfl0@~9_O`xy;mI=eB(ad+|T%XOkz6KWd30|*2QpJqas?*U3XH&0U zhO;V3wPFHOXpVw>lT_#D!W7ppx^W#}{Qi?zIzV{!zM!OKA8yqxs&BgZUj5=u6bR)7^Dp zewgat?XW$ow4+J?KBteR%k~2!m`wk-klN3mG^oM6$9;I3calxe)YcV6TavxIqaTw8 z4|7swy6f5JVG57wr|C)h?=bGM_gYcU2p`xLkLGv!Y9tfnGRZ>AnX}C@kF?O)%ynyK zZ-gVK9lgd4rjF`x$BuToaI4L6iGn!%@7{frCWv0fpMPf%_s0M-PwJRzn(OhUH&B_D zLW$DU(uvfWR(N$~a^+00$`_7zxa-?Um+c*{u!U%PqxYJZ=opHz=VqZb`UR#p5@aeE zA4Z1pAezW?ro-l3821`i-YTUoi z53l@nO|yUNTyN-V>vgbdqxCL!!5o9IsGDFS%A+=H3AV7wR+oS2H|7sLrBC~klj@Z7 z0$7B){c=mSfj^O1RiGPmt3c;+(-Uw8jT;rFgjEDzP+b z#&3sgdKXj-h{*Q zAUX1_IQhr&#WTqHxd?h*3_P-R{8Uvy^i>ozz7VEWlvG6;Id>)mWnDD(M_;VRXO2opMl32Pw+UY=rBX0|T)W zN3zUGb22~l3$nFV>r0Z16A3y#iVml^sT$6;Nb?HwJP^1*vd<>+d^xBLJAqf6URHk&$y>& zz;QovpH11}3LEj_)a^*W{Q%8&aoo0F=?3X%(%s)SenB<2j>;&O9lH~C&@qdJdvY;6 zQ3Y^=?j$+Pr{*keuZ;qyGw$}))cB`heP^hNXrnn7PI0QXr*|6e8ZBKZcucs$l5eBN z8K7&0YxXs4bptxbKw~9Xfm$T*ZJ}lf=5*aj>hC>PcV}?68T1(Y!QBh1Y|oBh?tAF! zuiHZS+k@zWPEzq+ceDVN?BvD|^TQQpu}z~xLy!#f=*Kslj6QlHRd)dW{5&)d!JNIV zjor|iUWLIc$^^(S@K8-cR!>wEcG&afiSr- zp1Z$cSyXss(Y#N?O@CC}v@6?)Uie_dw&c6)u-k(v2R^f)atWJeo5FuZ<=Jhbm z$4%GGEi4V#dvoAsUfKtvPpJo!RF9i5wy zB_-Jnjrcr$U(!+!GZXlnTCtN+G%RFda{wucnP}^7sQFPf=xAjvZBQtFzU?nOnHqem z$tZPKa8E~|%!x&HwUm1`jKAI36&rOBt{_6KqirBWPqmkHt$Dwx)B%ws94sKOb1fZI zT_$g=f`c`XTiJ{Cbc1fB6qu=lOv8!XJsar-yQ*}fPB7ye@dKH0#kE)a^{{g$?pEqG zO@!JbUudRMm0ae&IEVxMAhm}D=jvkqVg*j6uCT0MqcD)zC0@XcaJu-rT+|tc`3fK)FtUa)rZItp<62YOg@H<#ZHv zyYW{(a)jWnYs}OEL5r_)3cquGf{$(<_245>>?OFr>pRT=ZFgNKl#{y*I-V+-I$!?U zKX-EgINLnZNP?O5(i#Q(NqDQ*Z~zgo)&s$c7tzzi;-ZKIeV<68-g$I~5uns|dK87d zCq=09VGfR;kJ|C*0Xw5-|wFt&dfoc{XDoJGNg zhGg7K#ihTW$$0nChjwDd$SknUUHBR6pt)!bw)(B9BpCsb)FY$NzZ8dk471jw(phCc z7!*V2(Q_oD7LESnd4*t<&k zb{#IIHq(A~bLw6;{%q=m=J6}*JL_FrKb%P0>9D%OFI{H0KV(-Vxel{NJ_j8-3A@QO zqD=RGoP?J$6Yt9ljTujA7xu?@%x{sZ)efgIgPKOvU}l4h%4?hHjJb&=(z*j5)@y4B zr>hs-Sb4hJnM|X9N-ED7=Oeg0@i}Dj_io~{3ItIdM9-EcRbIAxO%7E~jlMWF#pT@? zRbOx205U^v8~$R)_2hIZk7Bn6?zC38Y`daJykdJ|bAf&RXt$y(?SUi2gATeb+P48H zpAI{((KSYbM>buJ-x#B zJX17j&-<8PJ&PVKi}`zPKs?9e@ITBGRzmIQf|ahq)4gN2iGy_&yn$es9{KLS<%hRt zp0)@5^+|mjbheS4oNHj4cA3J-P*{&H^932d2Gq9WP9Z|++C?;IyS@p1-q}q9G)qz_~V259|J+QsA4|5E1Hl$;q zn&Q9OYOm?3qWr)U7H|)(MR!@3+UW#rdlB@+jX@8_fF7*FQ|?FS-0Xj_cm8p)mu31N zjSP(xZBjfNFg+@w7HoBx}l<2ZXO77&6qKhsTxpX9# zPNZmTp`oFYi!Lb|B^sVc$tEKsW7qHdzMtpwna^<0etg>>?edp@`8vbQ^E~%;U)ObC zx28yZ6$a(ERO7dC+wLcm;EFBHDrLic2eTWSIFZN0rFOyj&eEUm9X^JxRQiGR%Ks3!`)C-MtI9rA zz6z&%4D9rC(T`L#QD;Aiv+3WddY^>USx>87yNXr+hzWUS)Ukh@ociyzDN@AFlX}Tu%dZ5g~Tm;G0O7; zBpq!kDJC1NmFbr+kaRf7T=@drt{>jNK=0;xszr~Yoh~s&uy^E8G>bC6nKL6D;H$4u zsh(s)OZKD};qy6x@99H)PhaE3`rh_K$wn?ASMppc=jWKM+$q`gWl20cZz(TeCc6%w z#i!8kZ>2}Pm*4J9aFJV3@vr9&j-hTpXZ$>g&6=C?1`?CQXfA&Zn|1?t|9f=J&X)UJ z(gQEyR`$^MmT@~o;aGyzStf&i6>aOyWD0)0=yY_ci|PLRsen&{8u!83Sj09j$Gz9B zJA{|fr>-O&Cx_YN8W{K(&fIz!;*XMP+KoPQ2g!Jk(=Gexy^h7>D(<5`kn{a8girF? z|GMHN7{U+Z7k%T7BT=d6$bMTu@mQiyM@gU`HFr#s0H4I|?C15bq-Pmr*5x_eT#@k0 z;h^l{CLiUSC9`CsydFnged$|aQ|cn;qsjjO$K-3kBWJTwcn2Q%*77gl=J_>M?rq@c zD^OlOgofAy3IavL%WhUp=uPl%?__ROajlxD98JvfGa@ zS2DxI>Gy20>>`PBhJRgBLCW7HOz24h$%QDOGG(|QylRYZN9Il?cjX3nk9lS%uV;?& zcKXD9)c}+Ch`^-{{bAd`;__lCNHMC%G8$R1I#hsS;8%qY}Gec z99?lD%1S40pzot&Rl_RWQkhE~->mt|N0O3qCZF^NRE2*=msrFdb2!@SI}2+;Mva>C za4U?z%=7P{N?e7b@v)*JIQ~ww)Mf7DUlrHmI{A9B?B1R#`7nLNjinFs$&jpF zWLwT*?0yWp`8`W=F6K8YHyDN&*u@mcR+6|T3rC71`|{fG^GsJgp=`^oya=l$)o8MR zz5NcRWcOxTWefg^YG%y(P$+NXR&OUc_MB*5h3?u-nm7Gex~LTNQ&^E#M;N8n3OBF|wjys6*ieR!1W z{3hn5WB5XrE4Gq`>GN&T47zqES#D*&c`*s<^#va;_&6%jJp}3*s<0XZt8h++Qeu3lh zY9D9r<@G4S4bi`2a{SvQoY%m)e+=!cgKgbkWQ)%)Ob$h^`F=8OI@40YCbsZMVowXW z{p&c4f5`i|SJ4~M9m?4|b869t_*~!743b0WSssQ#sU?f%0P+N8O25oL_1p1by@0EF zEBNd|H26UI$(rPUH#xmooV{XZXHUk*a0?EGQB;8w@E5kwW1G)0%(t;On1yMj-$Hx%Ea0AL3sBs(_c<$MnD11nRk|-0_*idc<#68%l=;GSgrtZd9-)1`a)wN^%4G>H};ye_3~Cl#oGIt2w|1 z_q-Mrc?a3V_ruFPQ}zWolAUlQVdkPv$4T9SuJ(PMNqb(AYInuIkm>szd(;IlRN!B4 z=MH~aH<iar3-kii`2)l|ow^de_5J$oB?=ePI^j{xnI zYlhB0a$?^RE@wxS{9RurLFYj-bbgILHB2Y=emb$s@acSmd9V9X5RWL`jN7A{IffBV zt537t&*Hux3jX~F%IPpU36Jv*y#NPPi<|o+HW%{kOxsBkLNB=O9(d`!$cD@(ZR})j zVh8h-*H(OqX+$4sQ=8axawR>$qqwIxlP|Ea;|0S-b(r^|l4Si#AY;T-jPisom+04#e zg&Of94ANWSQeJ>f$tOosGHVWmy{;qMv6Jmzce6Dg{a%xUX;@oFiZ4x0x(?H{SG{O8>d+7EP7;Nx5Vh zT#GLI4yIOdBMxuT`39K{ev$kIx!L!?1)akN_~(mcvQ~1{{s~Xpsc;L=kYf5?^--P2 zHv6-2WaOjqevK)~6{Z?K#p@#9)0??-1=5*}Z&9A|N~&2aXDy7g^tUiQa;B~zQ&uKi z&n$fd9oaPc-qD(-cr!Da-{R!Y;nI4Zd5REDiq7)N=ue}Eld)9F8+}a0dwHE-%Y;vu zTJaIyu1-|XuT3(QOw8Sm^VQ4>?gP@2Dd}(G0H20;dxOrbUZK;OUk7t6 z!l-7jVJ`yOZUN_Bj`y!0PWStyTKkwz+sfSDhwvC(ifio~D2Dfg$DYJZx|J91cvzDC z@TJ{P7Db$Q?N(9-e^>q*`rz&K!55$a4$?LJ1Qq)Aupq@VE)zPada?AVZPg$dm>x2xz- z+e7){unt-H`3dEgQT4MQHM6s-Gxc%8HJPDT^8XiwW1G+ z8~c7VhE37pKU?Mo{G2bSo{D`nYw~#YRCF?@xDQ%PIa9c&aW@AV_vjWGIv130F`oTK_?6fS@)Rk&jnMRUv z&LxE}vEy1)#BalnK4~yrcF4|Sd8~YlX@H3>1y+Bo5rRIm3u|0?H=>nWzSAn^1p?cg4Z?{)bfO)eD=1dK+Vi2Jr#W`*;=20{rP)3 zwnJgMO6W9?q1O~ldKQV%Zv{P^jeq@GW;tN)bA#&ZdpkSfPKDpT6wLl@zQyM`S%=Yk zewr-l-xQQ`rp}|6djOWZl!VU*Nva+U*PsdS#LM?%wo^8N{oclQfD07s-Hvv!S7cx6 z=X+3t;%H(r-y@l{KO^O*fKw8~t#Jjs?)6MYJxon~ZP{kt&hOxA4dJAmLr*yd75iRT z@*NeI;u$!KlOj9&D(IEJ$XR#*pV5obcZ7o4hwdHPL@L^8lHTk#aGRA0e?%z=k+ z{(h2^e;fV1BrNXBG{2-p$H=ET65s#Xoco(eLm9_k^*9)N7cRNy;YGHgr=0*Vaz1lW ziPFENSN=AhzW>07SV`Ug3|_L`W&1N7b~3mA>hfFA@UFqt_YhMT`?I~~WbpUZ)ZB;2 zH`|{q!IQ~?zM78UAv|OIgKbv&<0r#+O0LLVV4G_4j^=Qq zcj8NoqOLCBr@asT3!7=wJ zljnaUe{Ew>`_)YLsvHKJW$M`_p=vJO5YwAa7ri@t5#7Xh z!e>##-i`LKQZfLi``0M%k8s;%f78cM8lGXJ-j})8`{3)o5I*+@ut$ZcDjx)!6yqa) zEt}U{D*M<*{F}-k8F}Y%ioQ-h5Pe-Ds2NQAlSuVGbd@`K2dlvZbtE$E%YFS>(XDi{ zZ@~%hc|4&H;=$g|7Qhd%0r6($cz;OV&k3-;ALn)dI&&`v)5C0!9E;cgGJ2TrgYxs? zeP7<5&$rrz2J;-BP$nZUBxU(7=0o=fb)H2RdQx7B?_(G4r%_wKiTm#mbcExW@c#!ei=UjV?}c9om*TO%5=P?L z;;X>tFTn&Hhqtc?|9m4HU|ueKvS=`TG*$7X;=@Wd z!-)I?xo-i!rw3qy4Xxn$r!084ZjFIpX#_a<218F1iB z;m{{$vf%m2lysL87~AAj(`H5$4k78Z$aMn+n5`D9;R*^KK}EVu)Ylp z@I2>c8)*1E?&EFvhMq6qhitOrm@B>l)OH^_sDXRgF)dj;>uP3rUCi!8>!V;bQ;JjZ)6mn)k@&gT`m1*~^GC+l}b zoAq1VMg6YC#qbcdYdeX;SCGKAlea{2^L_%$e;U(}PocGZg3R%kwton%eUZMs5I*7p zP;C|2D)*3KwFz$Yv!K{-f?{VXzF2uGKAE6;Dc;0P${P#b0ju*4k~?lMIt>=-IwpCR zi#PLbzf^JtxcX6iZToSCdZ_wuhRyjjS@=8gjQkkq&)#%)n{{INEY8q3>7rkx-h6|6 zp}V4=ulN8d4CkQS-exPvR@IR9fzdga>hVK*f*R82Pa?JKnxa#}c_lBE?%)@CI&usi zzlX?sdSUwoBqiL%)cdpCn9E5*dVt^JC93W<(GfB__tUqstnys?#GB|yntpY);jjAgijaddCjNb9EM6z)pRSHlxCxK>E}9WS}SDn7)d$^w)UV zPt|&P9ysfVMQ;i}!Q9%hd`9!DKgem{%uHn;-lPCt#ZCCG&tr;oC!OL>c(1)+PKG#h z0q#;a8tJnYoAB_Rf~(rh%5J73_$Xb#=ir2Pa{pgoUU;i71N?uJex^buX70d&_B`11 zEo272m)%^~7u^ht`(2!OvORGTd*lfwf)?TbUt}&Qqj*1N5OQJ2x6zAAuOuva19M;J;>f%n?05&=v?vAh%(4C! z-{R{^4!~n~26*@`_6%(zH{>jwj5pw?slsb}9lY6NI5iL1UW(W5BCQoKZGSsX{2O?+ zWh>wfRIR)4ZC}V~zZUOy1T1+8tmh4+X&lEZz8h!C72v3?+SmH=lb^@?H^zLyi=+pf z40h@RH3oS1&d@3UOq``BGF5OcTI!MHiyz1Pw;0|B^jpGI%h@mjH!&0b5S`zDfC|c( znZJRvC0+Hix;JPu*(WFRH(bc{+O=#WzlR&Vl_XI=`2+vTFL)oQvWUBRg`!`1y|1>v zVgXLJ7|2(4VBSWLcObK?A@1wh`Q2gDz~-zU+AtRQ!3k=KIi)9!EoZ z8xE@LBY&^eNcxNkgTJX@=O&1B^nJD!#M+_BXc=Nuk^xAaWSKK}yKhr?tQ-XEIh4L%kvHjV>% z43+VXc!N4nI6sTFBvXX4nfB|<7RffQIgr`2-1WE7FCGu4d@8u?!*t*0QikWlL=W-8-$f0X#s~CcHf=7EANCR) zT$VEIVRo0khg9sp=54qVJzDk{-$E}rLM^xl_rk2^pe&&_y@axnRW1(Zu%_srLjvsO zY;;ZFGx%!x*KwnMhxhq)OfwbGPwe1T`F^wl!e?^ZQQl_xE5Pf57a>D*cCa{yC^~M>6FZ-cd%jdJVG^XVCpO^R8cr6V!BjeBX(! zzJC7m3HqZS(U%m^M8 zOw#(*bb~n+&CEV+)f|se-ozsK=%^Q3n*yi?-bl_KLm8jlivtqeWzDU<0)$84CRlf{9vY)xM9~Aruv@a;}EL?6k6y2uY zNO6fAS$tga$+&!mcu96M`Ft2o#8YtaN{Z5lEl$~m1MU9uc_u!8NviotB$^M9mvJDR z?#J<t-rko2ef=`RmQIsX;BtbD&WSJW{(*+I83MApu(G(4@l$T;7I z=lo)nmg`W)A$AhO44e>zoRA~)mSi`tp$i|JXf!?C)H%#m>zwa3BnKP3rzU#6=IbiP`$ zpl*a2xtpH$F%r9ATC%1?`z%`3xUk2M($@90zWdzJqc6-0}*J~2`dpU^44#L37c zQ{!N^WaQyKEiA6WX>c;XK?D5mxhQ**ighKvgF87bk7=ITOT2!WCHs@b9l)8mnYofG zTnH!QIg{;a=i-WL=WV=_DdRg~S{~zky#Sh%U+d6P*#LeNtifl%1z!ObJWbbhgtAZF zOxoS2w>t@YzArP=1dKMIDzY%&r#IkgP)i?4z&l~8 zAJ#27avy$G35S)vO*zL?b$k8Icv$}#rtDwHa`-j*ABU2W`gXh|#pviOOuZh6@=!$w ze=@z1q$ZvV*8hTP{9i%k|3=|0deeVf^!MO_JGtLoB=id-InDe2GrWc;qIA@kH1f?K zL>)Q>hV?q~U><{k*o-^xN+x7Zp&sp|FWJm3zX4P&2|jV$5l7;TJ&oS_OW^(Y@%J4H zev}-->#3-|T+R~L`8}Y=y-2;6o@fDetCMd3iNgKph|c9boTG2;1}jEEh(AH=+J;l^ zGt`{DO7|rX;yAS6EBK`!qU%45igGji$8Y3)d7gyA_kyZ!1|j?h%!{C^zfpJCzOaEE zAlUt=^Bso!3~f{XK|J^!B+TxI+IcJ${X#I{Eu@%if`7P0^YiY7A(FY_&oL!+FaC@d z*?f5<{@PpcYK`C-`97|ZABI0iV$O@;SiynDOEbxyl*`Z$`(d{3BqQW0xM?2~vLB)1 z-pjPjU(tEX_xA)kMHvX_t(>;^;xD-ojPn#4*7a~S|Ar#?7Pz-wCSv%~s?2A;5ti-W zLO(~PEya1btKdfZ{CjYuZlb%87yAl!l-|SC`_pjEW!%HFn3=eR_fU3p?#*30gP!2|rru_it z`w%$iYR>ZIOhLU+aV&n%Yw^T9%6oD!-0s=9O?|O#I!m&NPOgkuiz@wn9{@>DbH=7g zVyMECF-#Ac>wX{qvHdc*t7n*2xeWGL{JL?Sh5ae~!0B)_*V5%aN=op-=nH36US8QL z^`UW_^2ZmGXtawwqy2D#u?4N@@2FjGD6Swex1W=J9g|0X`k?E!pN<+_iVN~y{12Px z^Dl=(+{xdxn<);#-^bDYT*$w4dgUP|cPhS3_c>oj64N2vrz;D0fH=+oJ^zhS@9^{;=iM19$4~b^y4b<{yCuiPr*T53mUwI zGjThoV!Gt#V7k4~`;ROQp&6ad3HcaYL;?rm9k|0D1eqjBo;ie+rY&eKF)|-7qWWEh z+A<7l`xuo^{=RH09}Qjz(uXn^)!Yq!`?cx_ck4m7lX;Ly|_0q!yk8PCOGA-W8n5uQ3I4 zH;Fg9NqCWj_roi;@H@uX5_l09=_*jtE)*T(mpVpOsgHr??qI&-1-it8*fMZ9>{bg2 zM}SnwO*QeSs;WIk0#hGqvSKN5e69b5m#F<)7mQl)?pE00VFhzuwLKa!X8ago}?M zujD;&c71gB&!7zb77g$Cl9RZxJ^V(u;`;dwu0Y|VWANq|@x};uIE-5U7;nsTCqTlt0b)v#=nHuc$}QApVFiM4wq-HYU%I6;ddeZ z?v1FZUnj%<2lVVeV=7S6R^?qxprYOZa(R$hpd|0YAx!sg0ddEeO1cQm^eW!T;o|Ru zQl28=DWl{d?#bcYkruxB5&Eny@Z8*r7w-``+^0xN z2=cwR;^Vvur{H6-ItQ`arx17T(aa)rGW53`dOnfDo-FrEFeDO)3z#bf4xAGGGhHQ{RQWQ?X2_^HHLnTk+Al{o7N2a41 z$bj>n=nQ7<-^^Qc4zsFXf^Qs0^_P8Hzk>_%p6GjdSsusf|8_RvoCVv`!JPF!f$6^W zs^4=7tojE?b2%S(SPz)xR?;|rLrO~FtGpej(FcB-YWD@Ul#Gz9_aI2^5L^VOFxhkg zQx=zz{6dn-^fuj{u{U{`$L1iW2SUmwe3sq3_u!j-S~nS% zGDCg=nCKcNlyByYFVUfei;jWIc@MKTeeeql)cfC|D<6-;>~dVg{rFeEhnwz)c$@de zGbq!F4O;hK={(;~H}oU)lwUFcX4A31+9y~}gUy?0hhu}}!g8sxiIls-9o8j|yaXu1-J^20l$UPh&=W3{MnCb3O z`pj`$A(Mqur~@-35<7WFsc8XUQASZ_Q5Jbv{-PY*5V^dY`8euA{Ou7=S`{p74G#1e zGe7n4{EbCTWR|qxPHSbmRXg{-lUbl{95p>~AALprY@iw>D{+`4+fh<##@T>52`4hm z3p@+Poab9yBe;W?|pv*@3;t ztDodITXD0XvWm0WsGdVNl}kUBUmT?84zpoBN?%n?XI0B>8cjCL$$)- zwNvLi$+_wV$M+QXQa}3Xxdzd!hw)aA!ibEc15J|EJk2!!EO>RkcmeKsi5jy^ZtN;O zSq5EMR!Me=za)pwESKIa-)25V@QGJ(V{6F4j-g1_)2TJmt2OgB#_8AE=-5&@_B~9R z_c84;z*d?e7{rm1Q5;j_>0-VV_ z+>KS;K5h4DUfbuS6qmu{fu-ley7E=>&NmQ#e@DbH|d=WjA*!lWr^< zhhz?!5V^R)@^KA>s9+JCaaG{h8s63z-B~^TSz|>Lj)E3?v{t&bb~MvY{FL1=j84AR z0Q%byKC%%U&tr7k6X@hqZ2FpE{&x=kae*1jCHn7WaNH^$%#6xReA?NS{>mJtk8<%t z=2r$`C&TQ@j?({CqdC^{lGowXbP~o|n9*!y%Bh|1r4x3f8|JBpZlI6KI>6le5R(QY zxV^{dSyus&Ewf!#OIWR?OcKH^zF#lk;xXx>>Yks&%ln{9eFq~g7o}h zd{5CGRn+GiCY56_NA>MVl}6osu_@SsnH{rh zCT~_`YiE+T@O8Wsp^Q*wD2oc@$59sGUCd)sV~}*{Fe+j+R7Fxl4cbC1R7bL90~%`+ zc}6W%saE!8w9~6~G7H!ZuhzpRh&~)x1I%#`!G4d}%(V$NolG&wHA9yE98A#yvj9s> z11!5+8nQudIR$}&+=4t3nS;E*VKVol1ywjsYVgO$z#aAEi#3wp*9^-Prxvz>@jCFu zbg?lZfg`0CwWA*w{UFl?!)yf_1)+?SZ9NIIHqAReOVymGvt6{=YAblZe1#c>nT1)P z7(YpC0rn#0k$@3oqj9(}!i!&pU%H0*l^71OdU}jTy7p$AVsX%98%$jX6`|{Y@%!5N zzwABz%Xvqem?Mz4w3W?G?fRm2>6_Y9+KYbLkKbYtMtT@``Y0aEaXep>;NEGrs?5TR z&clo@GNqVg4q*i^m@kq6N18<+;%85Gz|C3=!InngORI2j)-Y2S!-G(7^8=f~c5%`@ z+d$AAY)k55B07OXp_h5Ues)C;MuzAuN8l&Mz<(3)t5a+foFP|hj=f3??3Y>skt{Pa zx{4z-V|(WIEc#DBJ1hb=J2A+PoACC?_9)KA^!dU@{Ef|cN8@1iHhQBDJmg(W945$G z>}9)oKl5sXaN5IYT%&AF7^iod+&%@`oPp(@LsMSBak_-Yx6FLtDpMsHWtk{n*-W_Q zlm(dD%EPf6q}L6nWopLo>C`i&*;v*@PFxE<#8y0(?cml<+)mx}!#yZveejY4BzO#= z9**Go9b=wj!loCobR;Sz^9(nW@}Wwh3gEXQHBIm;1@o58zD7V-s%>PC3l( zo~X@@tc8iMgNtv#|Iox7eG6T7E3+Z(Xp^1n^6N%(>p^wvW5>?`jOP%X=Lk-sF+36z zq~T1_iO(=WG6(y)0ROp!Yht;4g$Zk4G=qG*EYDt=JiP8fy7e$SprSTWvlf4LU9_G_ zsz#<5nwids#E)x zFU!WuvhlL~DKE?H|5;~-F9yD)w^>hdTu*6yB^B>KTfrOq3w6@;|ABs(74gC}9_3rc zE4S7Q^IzqI`D1vz4M)I+BVfZ3(6QnE(=Dw3ANoc7C|}=(Ct$+^xZ$z>3-efSbekL9 zW(&D68-Bgm|5k5)$5FoEK6~~ff0{S{4|TK;Y|I92%m)1@&IWDNt^e%0)wkhH{|j`c zXRkAXw)6+jiTM&o`Rd`W{{LpDde)f_T>cYh0ROmqzTSMw#>B|R#7G9|@L3zvq5oae zq2z2F4`5{`=A($e2CKm-#=q-v9oL zhmHJ(+>Lyk|Ka&Ke_U_;pPlQlk(98Jl(4Xoie&eZs}qd9JJi8Hdam=&mx*M&VDoGC zw*MhhjD z)lu>s8#T!>PI_Z+T5jWno7Xt!rZxIVX_S1%5SyfB>RHklTgYJSay6AvvKD2MIjMYyzzco$f)(UA` z{_S~e46S0brX+r(CusGMnl)zgvYfQ61veo}lCdIXQBA>$+tjOmn{p*P%jZ3bRwl_R zTwYyXqnTAQ|InrBR3?*ZT2rW&%O!a#CmLXPSDt1~rMp&4##EQ4N)3@DHRZ{RT(&up zDPADg&4{eFsgSK?K_*Cml=;|6(jFJm(jBu&bd(ccSJ_nAOk!g~QyNEXGUI|xV)VQD zi$T&CBV;dD+vLS2PvT;SrYw$-tvF4h;*z+=$yhzg*Tx-5r6=ZTVq(3Ukl60#BleJq zIL2l=b61u_E1^shl~Z|#HQX3)!eJ`kP&!|eYB))Xq2w2u+vE5;YRD#Rwt0lTn({ix zjhXgjx~>#@a}siFl52zn*E(*IGZC90rFFo)MYEd3n&HV`mF_Y~;%c2u1?(hMb$~q8 zQBQ{IJh`cvq!9!>S*Z~>A2m)cYBy=9gKh@ul$(9JK;CH%Vy-IXXDM0hnJC-gl8&aSX1y~Y@&&CyE;8t zcSB^{O?r~;l4*%{Cdn?!R^Aw!&g2C;v2) z+|#@@Ij41L*`__7Ow(bTXzIClNi=WnosZfiGa6AhpS01A-~hO}JcE|QD~)u%K`X7Qq%Q=FyQ z#8o5`%f{(;n?0OxlZOXM8=fX-cxg?pu;d9xNfMT-Rc|wdrFyk$f^es%29Mg5;04lw z<=*)<2RM?J{cA93tIezI(S*uTO{J79N}py=rZ8wVDU*^f*`c?s-{whrJ7ZhRhQMURi=()$5v0CqjAfOvFBl$ zJn|)KTPEp@`Q$RD5*g*bHE15A$zklF!VPQQ;*2IOO1@%t)Nd=C%wmZzvmq@(QIZoS zGts$ai{$ht^{)9UGPrB`;|l8&1+-B@l~KN}K8HOpA$-xDf={u4%vhHs@FFS1R9Ea(y$YYfi#n$dlw-ui3rrn%A42)GPNbmCNhgxoS6c zH+APaG;ueP=2SHIZns}Kpw6{vF0ACircz)hNq$Xg=4%%B&GdaCl3nY;jcw$( zc9Y;LcWsP{Hs{{7bnPu@^H>|Snst%7+HccVM_lAM8DkoM{~m@nXR2pOR`NR(Nu0%(&m;5a+HixZ!&4C-YG$h-t5si zZk6~(ay=>Ha7P3XNEv{~VT8mGw!UnCnm!zO~~fg7vb{BOaIEpG02r)GVR zYPRG}Z+YwK`w$v|gn)a|K zMSGSyw#+v8Oq-P*(S+lB1Qe{Y!{tZ^_pxf$k)BK0rEdOcE@HahIz?0D*(;L;QdHfDu z9MfAgWpnohGp>gHny{Z|`>#5iqTkNl82~Sib9o4HLKQEtwx(i zY;uTA-E!{M7}aZD^M-vkU)bad*Lre^xP z)1FN3)2ycCucT$;=V%^&E&2B?8-9AyJ8z)-WFww2MC5G52;oOY{-5{~7`y(>k?GgEQUqrobiDpw~Ol1E=ul-+!RxL%uT6sd5SjpzHYk#reFCAQ+))%t+FXIN4bhH%wG-6UlX^a zgRL!n?yeT8Jd;$Oq+5G3>@Jpw-jgP~aivZ7t@OB@pWK)k_NgqVRUkocHJ%F83RBU| zu9O~b&yY>>pX27FZcPsNCY0vDiYc1wvU&W2_70gFWcUdmDf{_!OEsR{-}o9Pe^6P# zIgp&xpiHejLAVLiE!C2NFAQLU#QPyn&b{2CMKbL(NwW`-V;@ROu#a(%+7!nnNUE2L zGf2f5r{>6QS}Av!z=-0xIuKo)YGb;i0Z*d*cyu;87oCTZkgAizc9^hdCrpFg1ryi( zF9UY#%P4)4;5egaW~iq=UvE^6?r&+e`&tIr(lQPMDA>)ZH7Pct+HP8DqgU!?)2&l& zX4s*!sOZgC74lVacQV_AA_;4EB@cv5%zMvx%fp*}fjQ@ex~P4BI!)-4WF0*F8;A zU!)6?`;xGjZGgKnrTdoV+#O4P%Q)ogJ|$rr+Sr;T47s^4Qe8&0zRcMTNpf$b&SYE8 zA*OtJyK;N|X*-U_-OWbQ^DHaFm%}C_2fNk6IyA$Uw|jOK4X~X^s?8ML&%&C0M1tjV zVIQLG9;(+qs9CpT^eNvr$_<)H+kN5FeHUTfZ_yZO(z??}4>YQ*-U4i11`Idwll3RKqDW zvNK8WS?`+7NRuu)%c1IoVG?4VNy@gg+B2ftj3(S&MvE@Dkne6Qs$xTtQ+L|gM>L>} zom3s+>}GZQkVR@fUo51Yxzrx%e)3V4;I>7`zc>L!&1-JfFmBf~$W^XHxJK9s)bh;BcTie>Jg^hp6Y2rsMG0)uYY z^C3-gowA(63Y*CM>>mrQ**eyUV%4g9#=LxkFnhC9F5w)q@QTU}toCdP6NWEUwMN+j zHm%&=qVD4j`RcSs%GOO^4(}k0UaLpb9YCcL%(rCsbp*6p$$hKS?OSc^-RfrJ)*wvz zh`VKL7N)^_*D{nhkJy^kto5o}?^g=xO=y2K1KY4#C|r5!hUKr>E!fOX!FHIugxw%$ zZrQYFYv2mo0{!ZKjOa$dbk4jT9eDCS6!PhnZ-F-|KKY zD!F5(ms<7ga>@Z0R_V^BCd*EUa@EiM5J?Y%r=<-l5s8Xnne+Nb1>=?jy=l zEjVO%4mE-RJJ>GNqYCgacWD&PLGIGBs=wK~7trAw8fX{YWt`>PX|@+?zBs+*<~k)aMImjHxDMvbT`)J+AVc8Fb{Ed z(siii4=KUJ8Q^dtBvrjC&*%YNa@n{gwe`^TN8xve|B~>_vGRvAXZ1 zTc74tfil%8r23O6z8zGj9&SsYs!qb@O?!5rW$4zkd}Z=#^}eL|hhDqOOe)c|yS;4L zZY}d`A0@~zthcAhvz4q{_mFw((uD3H6MVS5J%fE?IhGj@>Rpn4s#VpePE~tHxl0pN zrs=ePD$k=m#dHf;8~s#|?)w^d`>54&!GvaeSBe*JvG-_@J2ZxqLOQ48@C!LCc&=8YYTbY-{I@W5U2C>nPO|Z84m2qDCtK$fb5V7j zisaRE6N(83;lU>q51LNOBEpW4uZBBhm^%j*=GhIDQ5PAS&ML0kCVSC#N6?*QqvWDn zsWL%``Ks#HvN5t5KD^Vj9kO3*mGo9gJJV;-U<6*G+THCa++70Kk*QMYimu!sZQ_Sa7qh7ZjE$W`vOuR@A(u-Lyk}!FK z@kZ&UCQxvv>8a+pPs{3^$i+<<)m?$j@OYgr3qGPf)hxQwlFNeo*!!1b(Oi`7N-9uH zcl&kNU4FxByh!t^;z}J_r4pr3ol$XXsYvO)R-3z>FX47vqjn$PobuuZ?Paawpy;F9 z8nJ5A0-N$Oa4O}ZHRapQcv0JLHR%StUgamov^p&+(#ue#DG&WN>Z-RXK70^{Z^H5s zg7Spl%XK%)*1Pqon_D%+zF2dYk|4WG+z|oQk|KDK>Zn9Q-$ zMM{Kxx!fbavJ%o$rI1~xYD)dOlhxdsBuY}2Zd?tm*|OTWE|Vu+RF-Z?4JnIfI;ak- z#`aKkq~?s{I+|Dh&Zjp;wAhFT%bAMPqDZbs_drj=Ml4t+LU@P}9Cxic9@^mTL@ydi zt1ff8n>pn#irO8_G1vJk%B$RwJ{Y`F+Z9PaG;cd1!$HXX@M5+a<-0pd()|w76D?WS zUZyHY(ht?ZJIHQMr|JxQ_HQoe-p%FGESK@FPTQ<03R0U#g`L)}CzIWn0lO75WN(Ra zIhZOljK^V0xre0I7P%LJHM=Y8?9DJWrUT3-JVdX{-A%BUa*17(UfxddTAk}~XrTu( zm1c;0F~v5?MY}!HZ*N7lx*J3zYGylRD>_j(J0bhwz(=&^I36O?0R^?{)Y^*Ev5rqq zSnoW$b=lOKm^$@R3`8&L(5U4er1LQhc(O9XvfrW)iMyduw8CdJFG${yj?;&ogu9#Qz)zpc!Z>u1lU_Hw?%GBi``HzOm}x0UpI!*n%?2~ zth+UUyS3WgHZGi9oF1nOhhCqpDHCvZ(&b2Z;~=!K?g^L5QqQePbvIq=b{*84BeliL zcT0uIx2kIco;=gtw8D1_b0_YFakk7Zx^>1d2D!LigLb2=RGB*EzS9v~0xyHyrBPVD z3DDY{^)am44YAp}6}FnLr%ADz@OXwla9HmgWxexZ?qcc+YK8Caa(xSv+#0DQ!gObG zXN0q>@#M5guaj_hsG2)7;WFK#8i^k$pj*(rSglPtJi%&GRfb)}COlpeUy!LS<|YZ7 z7ghH{Ev%l@nMS=+?O?cGYRw4uX&N43j!Gl9NHANz`d-Z~YR4ng35#GVO}}bL!@5!2 za0x3?ZH7a>fP0t3zfcc**9wb};PwpLUT4N``8Ixqpxx>%*sKvIq1EcEJ$7fe>2v0+ z?=H)AhlecpUGLevZTPw&k2Box-UgouE|Xi-1oPbqKiBQD-~H!i};!3s!!Be%w|0&&Z~4XDa0xNJ(1*`jWE&Z6E(hvQTm zxicMUb!Hx4o%A)rcIT_YYS`{Z>k#jxpBdtI7+=D?s|n@08laCq){+z7sLb2mgE3czoh$qAzjwW$xmps^lXYlIgtO!qRL@Kv}0 z(T7A`jlj93?uw~1W6A_bg~@RF>>BG#ZL=Hc4UatvyEbdRJO+(9_adgQ?*{t+R$F7_ zj`XYddmR2+ZiiHvOr4wvy1s)d`0IM>Mr{d8t?}wZW3Dr9o|>~1cDk1wDo@DP9Z^?X zs5!z}538qVvUrMmv!v>(+!vXm5C+ZMls4{)aA>A$kvk&%bUHg-13xV{q;<`vbn(TF z+x}$%RJP*TgDw@u>0#PjO=!UGG@no>&w}2SEOwUXxm(KXZ12*EmMWaI)Dhv&CP8O2 z>OS?^u0J0hI;NUXJ1S}~9sjU)C5DIgu@5|;ccjL>AQocsLKugMp0&4SMXO1sy)Wjr)T?8s6DB$VgVu`+!PJsz)q|w>Pg)OL zp5>#>jcLV;AYF<$5vIUk%P6OrbSc@~k`O-bTC18iTZd_%vSm}M`z%<`8&!juBBPy} z9wo@#h`4=9r!r-xc8t5q&k}ypl~A@-esb-+L|A7fT3pVoLpy!pq(^aYOC_0N#z<~S zQtyfJa969Jv>ENEz0g#UKAkTbQm$;?<9Rc9EEg3us2#raE$wtIg2aR$8%5`tEt166*oLjfIaa;OTO-a zL6lVCn;qq*1NUgZy)iTDIFQa|t-meRy9nFtINYSh4AZ}i(Z9^VIh&i4Z+m)!#+vC| zy6h(VlzKC-euLGhU+asgH^P>+dg@C8{57g`M$>fmvwB~Al^NDGno@CMT4@aKilgIn zx%X$p_A;iAaqyQ^8Ka;Y{ic^5W*7~1LY+H?ZC(!g!-+@z10^K>$D zbMork7W3E;@uN_SW{Y;KdK8Oz?rc*}3kagkS>BHeB^<~=n50+p7 zOnu42dtI&09ftvsnXbxF4hL?Qry%RIk!Rci#r*)njkS zpml-Dd{73yHetM~Dq=W5o2VykI1Hqgq`Hy`&m5j#b(uWdAMO z5m}SR<0jpU;gY@m zOF(N*L>Yi;JE_p>VaiO+8AsbRZcssD0o%QpxdfwVw%fZRp3qVC=$MW_6JJg?uF!zT zn`1l!y_QQh{mNqLlAXZw>tt(0`+VtI8nn}Ice{M2#*C>dlcaYMjx4Co&<34sZRghX zu2Es8wok(#uW)CwV92DdL{!CedKX8_Owhrk?#@VAiZfo)IUwPSO_wk30KsOR+UF-w zVn!@3o7M>+Go|21kC7S^wYp|4D6L+nfaE51xHoBtzGhTC)k|nInK%Xfbo|1UNjFpH z@l*>s8-YQd^xP&>YXb1dA@G^>_kzzFw8L+qvk~5`(^YAP>Gj9x^rhAqg(e7}T&0eI z2Kt#+cL#c}#cR{3GmFMi4OlDC`R}Zdqifc!@#yqx=OT5+bT0li=&YSt1nFADjWeMd zrc@e-8_R)B4yqr=;m2B(O%`OCAwT9g@Ub7xnF zG*jEbXHz(BmhAkhA9R+h3|WtZ8Ot!IiNM^W2!t| zf2*AhH@C-hGD)WBvXxy9>jYhu<;EIS%{2a+9&XZ*b~Cdck6V_`tBM;SqVqk%F~@aY zRql^;HT|l(jNq@CbJdm{J3}Yza--fJ2c3=TWY2=jE1NqLf+tI7$x@!sG3y2pY$i8m zC7SK3nQ~j=I(=Yz8Rxc4r+Gl-wuCJwR^#58M!hQ?AhZ6;0dC2-`f40T%v2qj12;9t zVU-7z2a|4pUU_9-c7e|a4`%L&ps`x(Wov{DlRm#6E_uw>8VXcFhC0}S+TYhwVOp%4 zrUy5T+>=S$->+B(ISU3^Fj){5EMlj2;wb%l-V$-qNS`m*D~#$Q*vq(PgahkyX9`SR znb8h^SrvY{Cjqoc!Cj`R2>Oy9rc=>Z0_V)IcK32ugiTKGU}Unu>FNh{vU^hNh};k# z>~W^vk^mZi*v@vFT4K0k>0Ji7A(Lr-&lLKqVye4t4fYyx6&L45B<<9j%YuV=)T9VZl~ONywp|7|&-7x}+d6sVJSE+3jiV>XYh=@s(vzQ~cDFsP^_|%B_`7 zrQ24LF?D(h0$a8Y>1=L7#QI{Sig@qAxcbcI)f2Nqmy&_{n5Ft-SaTBUbP}i2vS9;J z=O!f88RMgB>I-*z|*0I(rb8gpT_b*kR}kWvHi2_^v!vSHhsLD(XcuZfJ84q_dx(FPTPH znIkV`(XzvWzhwHxL0`32yO*9`aF;X7Hg8iy0`85dQcrZF>wM{Ub^9^x=;!PlTb9i` zh{6dsXdmL`y?W^C9d%`qZay%rj=mz@{h&_Y%;+?m^!CeC4>N&n z?naYN;1~zYuvJu+JaeG=Hr=33l@#xdkoqvCbD*NxXSmZhA?ifT-Uwe+fp3uCxQ(hj zsJ-4C3hxqVcC|1AM??;9O*Q;T9G1Ng)t#$KejG)v`f<47gm%+CYg5PL>{p;edAE9E-!}?_^n~@7M9_B@8;IHnY zO7?1n98r(L0_buXhg>eNKrQamHkb=>!;PRA&BIP4;U@wx6E*yG_56J;bX>hK6XNI= zzfK-3L@hN=riZ#wen#Nz=211q}KGJR*u6b z&+x1Js4yXz<953FZtjl!;!`*==QO`SDoO@7NbZlMg+%C27{oP)t2vY3 zKa8VA^hcSF9^}`brfMwk>t}Hva$$jMK~in#Bm-0iIrACx7&)LN!Af;tq;_0i30U4S z`tU^*cfaDHAl_pqEvJDKFL^ob^x}i+iJU+MS)!Nlfro^lio#DdaSqy45fm189xX5v z+!NrPPo0J?@Xm-jwx)UASIhG7I@Zx!H<8AXP~ZL#+F$BKglqx{v;19b3)CpZ^l zu(MN~3t?t6!Tn)g?`qCPoF2M^b0L$HW1NUZSlAVK*gU3J!YFx-^viLOeIH0=2=#83 z9(fTC){k~q#XDUGl5YpgCqVI|%=AyexGtMB(OBRctJsY#|tj^iU@4wZIm2a6*PaCu7R2&fxW30LQQBIT2(c4ysz%)dqC# z7SM?~H9fq?6YIPfGSel@Y8Yoo4ezmYmU?(U26&6bf0#N`N%++q&QdifUQkIBIKGWH zcmP&)3WaWk*CZ1}5}>!O=1r-mtL?x6(xY$61gB~l9AZvYfR`l*3W=&mw~iO4$vtC3 zyfb4ks8hT)bLb39?wRw0(W^D7sR5m##h$!w*wa4zhC^gFjiJUZ^5U-0+vf51gh3#U zC~$GOQ}h0eF&{idCp%})-zu+d7VoXRMz!E^a|&BQAf3EPJ#@7L;BlF_pP-{%#tmiA zM}Rjf2p%_QvyQowCj7Z=VDWz5t0|@&=fEFH@JBW(T$EE^)B8X$P zJV3Wv!|810boTRJrJu_xRJCT#Wjim`ASZGfu5%u?GYd8+!YkFnE7i_B)m_vYd;yujC(_LhZUIUDpXYehrz zp5IZ>!~$4iS#d-bN}w5&{?3qkOd}kKYd)IpwK=tDMAa zkZ^>PScB)a!F>bG3%C-=frAWE1LK@IIc=lNRm{W53&zb??{@<_Zx{XD2&Za+Dk$$> z1~cX%&Xx1>_0iEy@bb;-GOWOGgQY)jpj?MIK zJ#=m3id1J6rzSaB0j-x2JyXq8P03m40-yFNCzvcqKSgWb!UTNAC~x5cEMPW>DG$Vy zI#UjAnnF`DXDS5$-2h_h0x^w%nC9&pm&07Qpr!`qR9o;Lv{OG5=tZMwsiuA|!b$j* zxpUsR7${QCQ8zlO)Y2h%yFK5x^qM-N&d=0&S}Dx|Q|0rn)p3%Vc-MOH;tVLVO1*50 zkxY1o9IdQj_f2b4gf)n>K;AOJS^hQeS6qE+1Mt_*`z2@12Ll&mx-<%h?bO;9MPHrx zZDhK10HtTdo2g@<)AAcNc-Kb?>uvoP9!wXMO;s5NrZ_N>9lf^1$d^KQkNvFT(Y zbcmBSiwiT!6llP$v*x@tz?gNV;q(>tk@@W#76YfX)8lkov^K=)8w0a1(%-Cx15BZX zRIO}M+}6vvo6xswSu1R|zFpN?Q&Vr(C^dC~u0@o{;F>Dh1-CWK%eCO*_I%!~sGhMF z(7U+v2SM*MX>~Ij+!j&wB!%L8Y`q-k4O`rvNbgXrr};zd&wKcwi2rb@~w z%V3V#j~4GeYxN*}=Zx)n!j@6ubE%$Ts;8W>IM}Y2vt>@z{JJk(y}oQi;Jb0f`^gI5 znv>OlN2>)+N-*9Oui89)cqaOKz*9GyIbR7y{e#p?dCwN52k$TNl;=L2UWkO zMvm-(@#K`r^l_`6tU*|(8IqB;|wp#ZlD(lQab4pIw9W!&(Jn zbb3++yQzPvvtuxtAH;7knyG?ub%9J+%|W_8=gq3cv)+c%&_(s@<;_Y*Wj^qj%uKD1 z#zx6;nO8I>H879*XR2Q(%0iExr%81}Ne2+pSE^IHz%gE@C6Ja+5tg8;*0KTH11?bg z%n4~i31|gR_0s_k;~gJ|#hK>qS%tsJLIa4v{~KJ@4(cCNwtoWdG6`=PaPhw2s)01T zzsg&aul=95!cBNOK&Q_6ITH?|s$uH36%5r6>Ys#_oQ0PZEo@cJ#c+YIjdKy86AXd+ z<;5}8t&h2M;bEk@B}41II8BQB+hJh3VPHl<{R`mzWmKDk$Yg|HyTw<2eOC1C38tN&R0ZtT4srk%Vbo$N^B%3OgmS9VE8z&pYM!^r zuewzbULpD_NPl<@zRFtDamKXMH0R7z$I-NR%i#SyPMvwTnsG+-z&?!QADRYzEw~up z;IDdKtrlLZX>~xX_fEC(PB~R@5@f&3Tu`o_z!>UNlUBZ7xQKBo-V%Lh4!A4TadyE( zq+X;{#~I}uO2^p-OV|a%PsjGjN^$+sJl_9_po9swUU(i65?_G;ME6Z%nDBrmOruCPNniuF!R{yN=Xuksbs1}ROWH|~MS ztK3&hF!{8n%QHABg~<2hDE2%<-tKN1l(e7>rol-e6q5#6tuD005g3Rh$VgtMFj%}1 z&Y=}7J__fsfQxHc8LWKXqdLXnaqZ{&d4Wtnx5$afMnTWBJcFDYsbzhZVQ|im-@Z8J z{B+RCnG^I%Y(l$5-J_hDdHBp_REz+9ob#dxpV>n@v(gLgt&+iESQ_SUu~?d&pPIYU&q2JPkAaD?TtGfP+A8>fIQeT50Q@`+_q19X;GLY+0;UD+ZPD#J1ZRhEHD^<-msAvkg_eJ}n-ebj+aVWPz`S^OT9lA%`?|gSS4Z3o7VJV zDNM)K1k>K?;W*`;N=H6&>LMsGO*+5UL$@Zm^MZipnUh{F^K;Is&|zXQQ09agCScg2 z@J!p8HLlb3I~csi*0FxNF_{!tg=^0uFDl^nWYXme?ir^KTOw&gy8P-r>en!cd(L2O zU!gCc=O~{ZtPZBK`BhF(BWOoD`u;RF-MmKGpz8>!87&?b-C*od9F_|n-Oco5HMVMX z($$M|Y(iC-m7*Ng^F!eX`dh75FX`(O=r5^vXaNsp7WuVumTIVEt;#0}n(lY`q= z7|PrtE_j26gL*m|nVssQ9~)6LyeN)cpD(-6*Q7No7c^X}>0li&jDsjIGjP|7eL{9!Wk;msz;v-foE>M-@hB;aC7JjF!*o_PD7I}L&1CI+vgf&} zb@|4G<$_F2o3a|7c~??+dF}f$;A$vNZ8PXO7lu2eUfLS4QLE*-M^!sWTFF(rKliu%t{J;ln6Y z?bkZ9WtQWP|&ug>bLs&=hl>V9<&8HRC*o-BtN zR&6;(;|}OkCVLuANM;+P4{HJ+b-)7+!7DB@?mVVML`4ta@IYNoK>6^ySV8Xre10ag_|=1jQW|!57k~ z+N{$}jnIduYSa3ixV$Xuqh;X?S6${Nk9S47EyEwSTNERwM|hk$x^w5;G{Pc^jxmXL zCdfE98selhxT=NIVF`ER$Mcwvhop)ATQrJ6O_rF~zDg#w1OYdr$M$G#n$!s`AN+AX zs720*FvpU~CoG|I##M#BaXdZZ+H$H=8?z$=`bsRq&SaoP1nHXUIS0-OF#5x|b&0I- zVr1%@5lvJ7y>CZ`W)7v^h%S%1Z#X~ctJ@Xj_M$YH$}<nz2yRcNHmX!bo+o1-PoZ!-Q^w6*B!HhC2-b!I~r53yy z?dx-F>td>jVeD4IIjEP_ur20X8E#jmU9!^D z@>*Eld3Bok*VP2%6&ZL1p4Y*z`MRmC!S$YXs`AvghhA=Kj*rtO-Eq?&SYLuxJ&*AU z$s6S5WL{k}cet3<@@yBCyxLj&!#o=uu9B60@&v!+>&$&4waHP<=dE)skfvcdxHiH2 zHl_)Cvj*433w`yRH^DHDx)~!`uN`h?Q2mT^YrH=J#fiFJGJEY!|i(u`_2 zgRSaWOK|$;J)Ce5Zf3|jev-=V;{e4lyA zvcWoD4q0BX_E+?wneIH-B4neH&X}IOqtG|RxyrRpGSL<$>Bg5sx$AJnM*UnV$nmJ3 zP0G+19ZFuTi8O9TJkeEn8wL9|YJVh&a1J*UNOO(Vr6J(%H0OnbhaAlz!}2u-A4RR- zF@=+y{>jS${;?--Pj}E-X0Q?8ZFidc@lWaGN7vOxp#mD9-AOni5K~^6e>g5St*iEZ4Ukf0fhdqn^H!BA>9{Tcd_8q;>PT zYna3-_1g+dl&#ZnLDwS`U*qmyWRr-4;6zV#u)A>yIcmoYs@N({w0u;ti0cw+QeSN^ zF2`|{RKo)0TV-s|UTw&Fz1Kr^hJUV0n**5Fle4zt|NSRuWgYxK@JHdeMpvUxan+`_ zIykP?`a@h-cz>a49vRFD zb=LFk)Z1PUQ@N1l`4(#|)` zhgyc!*bK*HUaxL-9F3uQEUJs!hq~ssRXN72L7RHHQ!0MScbh(OupR>`98&`4k+-rY zD;!-mrjCzJ&y0bid^k$1@i&g(JVS}aUu1Y~ALl5D>QUt?^@7bN(aq-Y%?g_&C#X^V zvb|}Xwxhrr%|mcl4CQQM&BQ+LPn)paJf}B|H9rs zwUOsXiV`3F(v9LbZpgczpjObD9%6^#F)~b>2_-<&ac=ra@QIQ>8=bojg=WcTq=I^54->SPh zXA=F$0>u4mj=SzqW7d>%

*Ja!pc$YV8ZEDpjuI_p)AVDE3kHb|*OeLNT;&ON%;# zp{@C`1&ggfDkAhrDQNuva-VzXceZem1na6R3u}Tk5VlAZLiqKOmSb+4;=hLN=m2YVDOtcv^3a<-CGZ*EnM_r8MoKR;5EJQfqb zDBqQqH%8$Zn6PeNVy&kPCJqI@>pA#_<`%qzyYwkX`-_@y1ABE)&A%#ZJJ;yp5?BTQ zDCVU0ZKh(sd7%8MQhgh$o@Z8+O1Daj`AcZd&C{l ztswkzGdxp_$y1!+gW^tpR#^YHoC&AziKb!;NCXu7J6PRQr5hPNqEGsySlPEq5&W~n z7NiPvV7+}AeZ}hbxkCIIECIJvh-=K?Th4QP28t@#`FqqM(UIouDRp4U&ON37ty+#o zQNQEKeioWHqhnmFT&io0a;Dqs2O8kw?)R(IQl97D%{i$D-#nrS{`J@D(R-yQzy2e? z;0e{Fb9~~aaOIZSuH^F1ofsMOYduc(Lx z!I;pWz=IF|7G2#EMO{MmIfWNqW`R<6+WsYAantB+fyPWe@dtd6Qjzf-twq!{6v zuUS_J#*18^zO1mo_o(RVWxs+~O5G$k$2jN771_Vwxeh&ee06gat-uPysZmgv~wu6a#<{}=)*wNB~zQAFDfT7%4%E^2~}x!f}kjF%sZ_bWCf-mY767__oH zg1zvyRF*$SlR1Hb`2qIAN~wRpqb1PMwcxxsC6A$qu{Vkn^<#9Jw>|WHa+}P+CCprP zS=1^Ix5?;;Gk#x*suoI2UB9g2UMjCQJH`gigK#s22~~Ku5iAGIa1oCdS3Fp=!oplu z*q616XPQ-d6$pM+CtDj4`~1A)iC92<#QA=qFo+q9@0Ic|Us0Ism0sXn^(6?D<}IpV zQH_eyEv%@#?*C-zJ{h?_Qn2%v?Dw?H z!Ea%z{K~7?PFb^Fm!9KEsdE#R(Ud%0Gbtad7mBL(gQ^h5uqidS;r^=N+cu9BZ_D5G z5a<%)KByi6DlfM>Di10UfrHn01@HC)yzMWKav+{R%4(85{|=+&EZ06hJJK7yhrj*# zh`;^NS6F|EQQITFyhBB+OhFJ(5=39+}OnhP^h+$c}|w%oCLpx{U7oT;#>kUU+Z>tD#$4f<6`FYHqu_sxlI z)s)Ixkj>zzLVcSvB_3z)3MVSe`>8~Ehn*sSs!?Cm`O}*R8kB@Q>N|RF=?v#6-N0Lr z&Kt#&+T=PVsl7;sem*wLo)M8o&#{%T@>|y{^5+N!%^LfOv7m%(dV{BsepOqr%pDPE zU+Gz8(95j`ORD~$H?>8^y~SJX+G~*QeaD5<;(xKO$%$AUEi!K(I zHtKf+-#H(fD64qb=^0)AxRy=zGHQExsHnSO9NYe8Fty!_2{`j|xERgRQ^ezyJmdBZ zn?G~9ZbvP*y>D+j>#oD^=PdfOK^=RTG46*TS0fu629aX?9s^ z7@8i;yU;dKI0lzfxCb>j)zNq%&jk8iCaavZ;b_%h{jRMQfVk}2o6f3hF~S*Dq-e0T=NEN4pe%;LXv*zush?W(j1jL~T45__ z`_#E)B}_P@n}LsQFE7GNpPh(C6Y`ur^9p!h4fPRNz^Z4sJiFk1amxUw-nT<)7EN|R zb~o!SIcXM|-JE#_?5xKM-Ca6ZbCXq?GUFFiYPRDhtePFapP}cyw=D3ZZEN2RQ9+wz zksjl}V+MOWy4b=AjM>i#qw(l0Kom=QhQl~q_`G+Pi{G-zW_;K%4I++9wrX(R9dPFc z3`c_)AF~qPWjb7sHnQGn&zSHhz@nQdE|b=>J)`nssa1F3(@szl+1S(0_IY+fB(Ugi zv>%4tj^nEc?dMd!XIG3rz(Shva*~e29Z#$z?z_xjiuTC4i0MKzCFiu5#bO-Lqqk>R zJZ@X-R@e^MgS0#CIsF*>XrS=0Ir|p;xVw=9&rwF)SN5B>cI`=LLL9ZJ?kq&JYoC+Z z$_fRnk;RU!)!5emG3tG_&xTY=!B{-_LUmRrh5>XADjE%HWIrZ;X@A+EJKq$Ha?078 zQlmA@zVVFl)u^$iZ~?5&q_?8#DC@BqrdI*)Fs!~hA12;mhwaTfCf%$O=3OHXv&pbh z?7T*Pv>VRxNq5ZLmo;t#cokKW&ed9Tg z&4iNxMwH-59IRx<=L0O|nL>+f~84L|>CJj9KiYoa=-k0>1Z)}2n>^MUvNX548utp)Lz$Sxo zS<{dcFhgPFvQj=?)*so}iG_!?#ABuUJ3`jXh1uK$ldHp0Hn=5jx^d5EKT|yQiZKLy zOA~tuhc4D;qihVh;V_b&{*JxnfC6WnCYi&oC*#REG#2ffnnnNUt z@dP1yeddyBdku&wHMDO&+Zw$oMP+(6@gLL&o)@Y30^JYJepYKj5F+Wm$j*1t+BHvRV8~U zySBZuiA{SMvpG=fKP5)^tlf-v2kf}d%1y{>8+gN*wX3uK204J(*PM4RubQP-HLQWM zZ~q|kFvoDv#OJPfPe8>~ z_F245eC5M5^Tj&df%16{V>Pgo8gGe}udGwqtD&Pb*`W#jX)Jtp4NKYL4-$5HeP!aa z>v(LnPg6aH)Y`PB?9YVgZo~YV_NMq;Pp#JS!pDp4IK>gW9CPw>dkyrn7TJZIPlx#E zccxtr?90bi(}9Zzkf^ccluTGDkJYw_lFWTR$bDu?NU$a<#&|Y^OtZmm%G@lvuXw|| zQAix$jqzFui3_hc@S}2q=d7vB%p{6U`aYht$*)Fu#L$d5Zo*T|_aPmqm|!#77(Z%p zW_{*aqf%=RJf6z%8S+#*+OPwm%yFk}&9$b)s|H<`5+d%D^O-R_d>VTe^XVn;Ff#qw z5TE3=?M{YGu2??@D>Lu`vC5Vvdj8Bn;)R86*~GyK`%)vLu!*_`XJ#$?SGRQxvzC0H z%l9pN77;8UuB?f&4er(<=QPIP2@yXVdf0HC9C{}+b#0^0S1g!kOv~ec>%ad3+XyUg literal 0 HcmV?d00001 diff --git a/extlibs/openfstwin-1.3.1/dll/openfst64.dll b/extlibs/openfstwin-1.3.1/dll/openfst64.dll new file mode 100755 index 0000000000000000000000000000000000000000..b7573526f263c7951ef088d5f4d93097d6bf4f3a GIT binary patch literal 4923904 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

jh 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 A?8% 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

n|m?G@c31 ze7A7bOOQg8rxPMJ(f$ad>Caoi{V`!cK&4bmE90V~qmq$U>a_*_5BHMC#2WLAw$f~@ zo=1^M>g@HtRJ1Nu>ae9ZL(w}BA6?{PP#axj!;@HeS{!XE9t|SI`33~YhKcJ$FfCPZ z@F)bxhUYl8cLWD5z>CY*`$~Ml&sF#Vtpm0yZ{u);quOWKj6z}0 zV!zY45s%6gM90^G94=!YRKo_~iJQZfXdrlQ;_q+QSkW^0qweo-Jq7xWZ<#>hAVJ|2 z6yh^H!lhcq^N(>p6};QYeZp`FUO<51KJm?DMB1Y}Q9D%Xat<3~Rea|$$n0#?XJi^; zW04e(M#>Lwt|W3lsh?Aj=$t~lw@uM3o9eO4BdxyTLK3onTr$)^2_BVeMcJHHF?Buw z0J|Ga-7s?)X+y{5_!wE=-GKS+tVGOYX@N>M`~$2cVUwZ3B76z~vf(ByOHuGMdhlcf z$c7ah+dGnDzK9n{IUir}a~pnyus3&NVdo-%_EJg4m4*>`)1H4-${I|&;KhR$M4=g$2 z=nVRxZ(&kCy~~E#=j-?_vzv}M0K#>I!B5su0GA|V&|@?c+z`>Jo6YL{2DBB4z+3dD zfwy=sA36+W;9{e|Mn14x3-t61-8${i8X&j6qKX8OTb$1#My-+BA?>F$o#v z1VCE#1kw^&a&EwA)x*mcVYD!|g43l;9?1hC97RC1`0M-{`s(vy9S)!mbVof7EjVG~ zBjyK9Nz2oKT7_75D&=)2@AzQ#&2>0_;6Pi~*PEz=$~_pYm0g2*j?%RdqclOa1QlY0 zMtQ-iCDz_SEl+in){!;S1YuR8trUT92R79F+4WpEhz)ui14N}`5vmp?$NR7Z<lgaa+Fm%s#xvNVpBXr#Ndn!0I|vu@swK1IKgw0<_~O_Tj>9Qf4fZx zD8-~^5w)RQs#WGJHot)6(#Mo#lp90fR)8bRXjJK}+}|)oA~jD7o7Za}as{_F zU>tHbytZ1?p|F{Fu`1ALC@nPrZk77#T{a!vLQ|~05Dz31%oudk8|a~VM<_0bS|4yZ zINlZC^X>kW-=qanuO0Tn0xT-VNktpraLg3I=^!>JTg2tM&7{ZP_(#tT_@J#4 zGgc>-LRNr|C~9#8=m}zV9vFothgl6YOE^|1V^KI(=ku3%C;2c;Tils(hnQ4CGz@}{+WL$s*6>yOzwgaEN1h03S#m2#`G+u&9q$o4Au#Aor z)fk5`)pC^-w&rp-0>#FGY0d$1oq`MaYQMz8F_9?mRnf2zf<)<~BT=lR<%8=Rt-+&M zl{PpT37yt59>uETQ8q=wqpWd;2$Z*g&ieU47>1(Li!8|&@hIOy9FSyq`Y4T{$&dc+L_nU8HK%4J$u z9~1NO05}LgbdE4SdJ!=UkFskqH=3`YK+yfeKuj7QUhhTwp^5b1bGV}2DN4Q;W@9a3Y{wP7E;Fp6_aZR7!Hh?U zhDX^prV$?Has#UG?>_XFNO%WfgM`L zqr@COKoX;E-yj|(?|Ft1EW`Y|F}nlENGBQyGrZ=lCJb*Lda(gBdF3UVzcb9KRSe$@ zo+;zuo=vo@G|J)>;eXIFe*iQ5C5qBkG(O&xpD+y60ioizT#6XVK8TCt^BVVaV*#S$ zzEi{@=*6cr>lV<9<@89D=&xLZEG#qIZ_9Tw zh|o&cKg&F8PdPM)ntFyTM?y^vS}AyDL%BK3Gn?R9Rs^2)rV6*&-fEuNz_UJRP0DL< z6DN3f|7g5=<3+RkHdW|9igFpk5QTa6`cR!`k0FLKLW_O^D;MK7a7(qMgRj&|-88im zz^oH_mglzB#^3?w!391-(!BKyvqMADBx*<+a~PcY0W=1%1O7Bu2zF4GiOddID-{}; z*%df3Ay9iKQ(X>!+-i0}pvJBsUU|--v!e*pe&s6RMbPs3Uzi<-Q8VQt(aM+|e;cB+ zqZ?u<=V{SZ=9sYx(N#-duuMbJBns3g0(+w{D8|!oZj7Y)`lkTyz9-`7NE%DXbGwk| zUr|KqN*hKQ)p7*S)aM%^Y34|v{Wy^{wLcvWU}T=AY{M`ziw=ZOkPbe@W1S+#y2x_e z2#K&9r@qldjyguh92q0ybb;%A$?|9g(3B*Z1&%A9#_Ez>i7C6X5P~Ir`kA;I{7i~c zqJ?F#M2%e#rdsYepTrf|@LPyL8t))F*j$7mx|Tx1F)~k9fw-12GRKdPc_BqNiD(t+ zcfiNortS{I#~hhLEYU5W|KVc<76?LK9J=K3Z^y^1XA5j!dH^4DVHCCO|5x~!$!NO4 z4OkYBzLkmnv40&t=HsIp9Yn%!z{ebgjRZf4X<~P>p5Hps8!gl@*ojsgc!>tTy!`M_ z<6}BL-3&hF-7`|K8huQB%zB!EYxtPIEras@r|>Z|k()AUv#!jK10QocdVpeJ0njY@ zD;Qu(1=_`N;bRPN*fKum5yUtS ze9UR0u)6c8FgFSd#mC&Bl@=Kv^A{>9!VW1$p)h<*Tf}PyAM@;y1Aibs<~~$P!>tq& z4(<2D$83BZjSCQjX7Mo@TX=$GR$}HH3m;<^QInNzv;T*Wne$ulF((|Mt{09tfkywg z<6~}Vh)CD(h>w{Gi%zvXah4c?ZsfO8ert-4DLg088(PB0TpElP2_G{k@VS-vn5S<2 zBk?i4fFX{EkNKnz??V0O;bV53OH`cgK0_qRs)n9mU)8`7|ZMUaUA zKIRMr$cADL*6=a;cmY-BZI4={{rpV<#n{SW zfMQ(JDIz{*y{Ou8<6|xmWryQqzO6f@F+S#^HR1S}7#3d$KIVH6FB?XIj4*u6AOy&U z1sts5V`RKQ$~j1YpG)y0guN8kJVDqt1O)Lhr{hhN_UdoJk4-CC+9x4c;A2k26QrG| z6!sQe+>Uh;-Zu`z$GrPA7`^Ij#>bqy7a0|cj9x&v&)~uTm?1vLKgJs=?pa!PPvM1x za*g3m;?a$@=5? z@iD9W3jH6z$Gn1oaC}S>Y6bJFb@-T@wEV*GG2;>VufxYYuu#*Xe@cAJL;nzZ?0E4p z*C#ClzAuY*Nh%%nIyPnz@0u8%vgrB?8$f@sf3{^2{j;gq#zkk;kz+6{@E7Mf)>aU$VYKP6o|V78#+3M z^EjM@Efb#2dQkP1A3Mry!CTgb+!PHKTUf{V7FF#lIR#XK=UYD+HK$e$bp zZ2YAcQr!)=aDvz?DHBN}HsGS|rW1InvYO(i@W&=D+P@z9J~SPl z;R|!o7Thj9gy@i47&G|fUYLuv5|Q_XocF6e#V+)Ih#XNHxoArhJF!;P@|egvP3%64 zCJ{;3(GfJZ;)IK~?aB*X_}*mTXsJaiNQ2f`eVi`ZfO?w?0?{hTRhx-uiO`u2gHNoP zg1RQL_QIbT`kBTLntQhWh^TKFe@V}jAOsQ$A{#?O8KRpCh^~`ewJlTr@jOhCNUqv! zgaCc*MKQwh*fe`B4OtNppvUmn)&&1~g1*^V2xhd5|0KlHzYqV3W)(oWh5BmCxTO*P za}IBcw~YV%3o>K;=fmjs^b}M#`lfhlm*qN-FY*F zq5J~BXF`&nVE(PF63+fCI}=y~kESR~w6L2YQ6w9LFyKGCg-LQ10>j~aGC~;tsr}x; zF23gz?dfh~fCpJGs$(MXJ3S{3qnjRlRV2ld86W z|0F8AlbO+aIHC;{D;wb8O*EJ#$#}h2_|3BnZqF6%PEqo;FdJ(LV>_KpzSG=lcG+LRP-;Npn5=Ch%8lS*_CW1PF|3nOBpYX?L zd5!zIu>jG5|3sYD;6D+Wvif83pLetZ|B03cjsyQ$Dmb1Ct(ebRu_gQ`Ob2Dq(pGak z7s_o?7o<_(QcbY1qBmZbKmf$?p7G4_K@{adAryiCJXz;>XT(r$*P;(&p%^wt|3u{QR=RI}gjTx#_Ez9O(OAGU;6LXHp4q^&9OhX|_)n^En^#)RGaGo;2dznY z4KCFL&+aF4#QVA6*|%+k{-Y?DAq-Ij{?nrK>@mbpMrhGbVC7=m25tfW3BI-t|9M+0 z@SkKyGXC>E!Hy`fBazwB68@9wa`>fIvjg45*cHSp&%s}tU`G+=;>uORNuT9&1GD2W zYNlKyTA9FqcGB6=4KbASwCE~x%vgo!z<+{eP4S;74EWDe;jt^+lUgYL6LIv(yd~th zUC8sVC?bIW#B(J4=c%CmpTU1pw&D2Cs_+TY!CQH(YZ?CuiLe}}-rGcu`c$_${3i?< zr7zhXt;K(W=V5>s|%Ap}dx;IkN(>%xm zq&yA1(#S&^PLYE7igL?G;SkV6aLD|dA)q~B`vt~xpk=B6?STpWKmTZj5a#daA8kEb zVEar#{O8BivVRNyQwsV=n-8ENP00f54>&|8HRB&mVox@J5uyiA#L?`3y??aHXt#d~ z{O5-n9ki|z8UKmi$!AH0mpu4K>(e&qAMGe?B;Y?!(D0x9){)+hjsMJ#W&dbcZbDZp zp)-$gLQ5WA*gcvfi@h>Agjc3)5V1+=k{|Sx)3tbOfS+85Y@Cgz zuOu+%2`sr6mY4EA8bl=E=L!&@Rc09;D~cE4f2vG^s0_U-HN{$GG~g!%qB4}0E5q;d zD$1Za$7rt;5f43ktl9*DpCV7=>kzhLgO@omG@VM>M2osK0e(IuPKwQ;Bs)?42*A&W zSQQwjAc|@!PY4^izC>U+@RKXZ?#hT7_&-7n06!!1tf^zPKBBM#Mk?%L6c!5n^k}6C z;OBN?C6`pjC7nwpMFxJl(2nU4;M43G&4`G#4-3y|h2%;sKj<25$z~n;SxCAdU-!uf zGv|ExMhibb+>C!TJ!Pnav=6!bIp|-i#gEE~Ayn&Vwb$zXE{lAA`}H!}9(f^Ret;_jHKIZ30))FZb&OTX;K431(VI7vJAd7dSim0!ncAW(Qb3y-Qh zN$Vh@CM#Phs^%mOo;@gbQzvOzZh0*;NZ0p~{iS6^@|UJ(+LFJtX_$DL=5ED|phbUa zwlIHbwlIHbwlIHbHhq-&m-tINx`}$^pAQduRb;wag$HF`2mGZ?YsO#N^|0{Z_qVMW zktXw7A-_>ea>=+TCFn5iruKU8aD)Ovvl=-}lY-F#fY7Xn78~mkl<^x_LJZL`Dl+OW|MGqF@38P*ix~x*E z9#OI7$lf)v$x|%+w$LOupB;C!@SUD$s=oY zXC`=R>Mw0wJSp2SJm?!7#9rYf;V&(uyomnN;NY;4Pvqa%U)tLc;lIsanhC3ggavef z2zHEhbS7Z|Q}I6q9{_0_+=GL?Sn0ye@xou)G`s*CI1pd(b1r@aMDX5q&>%iTcLY>A zaPcd7(2BzgJpnQK_3;SQ$Zs z^V-;5nhncF8XWX|JSwS(jjsbayhS*uMUuOymKAM8g9w9xK0|?i;}2yZ>?A?hc9iNf z#4u5o5AcHTzfggzf8l;$*eu909A<)y(mP1ItyCZmH*gpbhnMgDS)E(v`3veXGL5!I z7vagc7N7CrUVxWu3UMspt4_mxq%8vHH6Lk<@u-Xt1#>>dgaAOo?zQCs3@FFPzphUqK_%W%9P?)7+6{-R|z6k*8Ba5YCUu6P@1 zM^ajpoWWs`$5w^q(Fd#(@*oiy&%tMs$0EFBQ;1`ccJ*u<_F2d7(ar!{k(ZwpWqbGw z!b(V(d$f0AsAVzyb8MVGHZ%+WEalh)|2!R$CD~s?Iue`8Q~YB6M8bre+@rD6_}Ob| zZ6xC6as+?#(-r_gMRa1fh5VAEGv-(|PxHC;eNoI>bgo7Y(z1SE2Wi+s7Y^1!9Hf1Y z=_4F5>Ch>5|3$5~_C0(M+wqYdr2X6@A^;SQ(bz#+8t>Z+2We>$@3TzPT$S12s!VFe zKUx~uvGMFyP26WGHRm5KRV&x3m1`Pzhy_m>n8W9@3@+8DOsKNMA7r2)ani z4Y)`vBxhpVY!M-#Il-zW*3P812bWy=wYSj|$OuI_;hEOrV6yN{l#%?T)u07a3u)>n zE$uMtkl~4>Kw9G`4KClH{#Ql`^&dciE=GWc0?p=nk*7Z_1GWqT6=TWuT4rGo&~XS% z_ZE6Pr+epmJCZUf0f{ubBWtPdl8FA%5W~BG{h&D(g!@Ok5|cgnO>-26c}GLGhWn-q z?OBbl)#z3tg6_K(dMH#96NPWI)Y_ci>KkqQ@%To2v_vSe5-1^3VpdW{v)7VNilD?? zSW!_uO+B@e__;SFstR#v3q2G6;$kgtNP{w&a!OD&a* zVk^|^G+4dGi6C5ChJt?Gq}&fjr8Id*CJmr#O+EFB2GiX2?Z{td1Avi=orqQOC_sGZ#2*|3RBbsNKIN}~`HKZOxc{@E za5YQ2@i&4#u+wWyyx2H}fQ6I8P_e#*303gPO?O zWsK3IXVBn076ZC*6dslP4j#dQ9Wx`g4Nm@Oyp~4iC3o`#;Zy|q2#RUx#vk1alnEk< z;S>bmR0r1C1rb_oyu6rDvyqW|Eos4?oJd@0dJ&YD?1Y zWh5;SS_bcy)!MBp?CmL_=gqibnq%{YDAkhx9Gg_WJ5GxAu5iB7yVq%Rzg~D?gY?#` zXgyK*a~H#NdljCYa%VKx6WjwfxlBtpnBEu>?HW*}J;nqdW3@;08>w8e;>{_KNp|&G z=T0A!daDtae4sC>Sd((aR=MSIX6kO}YjVPRckH?`a<}!aj8D9nRlSQVZme|)qvXu> z70hm~AV_LbYD+sz(aPSdXLBit^Y-UhfmUp88lBfbu9Fx_Zh4zP}|9D5gj{XHgh zjrxxGPdSN{iPc^FwK&Z0lshG%Mx*0`RWbzY(I)uVHbRxiD>>B(ekL1L$|ZMhsZO{B zI;2k6%B%A9lSjk_D)k{%YD65@ssVLr;94c(2|(gTwdzE*vT&^^i#DRJW(qx#LyLw) zdHWRI85f1Cufc`R^yTEh7Y^$}VTmFv5b+cW>?$%wr-HXf&q?WR3OGSG`qo|lHj%z{ z2Ehfy;`&p`_$YLBDC6&k45>HtkBau%i;QQ`gVO)#QC$@bzbT*!Yj#v8Z7cp88!#W>MB)W^x;JfE+Xx{7jTb#N!8A@)9$ROSm}vT@RXAM|iBq|3Y!z zss0QF1}cNK%a=za`y7Q(3!ZN1J;v)NzyM?~wl>UAmCtZ8n^T~hdAd`CQ53;HA`a>p z)7Xv5n|cgDo0bI!k;K~W0O|tvUM(IPO$ad~#w}1#tZmhJ&YwI7r#Xrb-Fd7^OY-Za z$DmCe@_W2IK;xYm4%thu4H>G6@S^mW11)0yb%7R9ibv(EeIYI4KK^JlEklbqS}5A* zz4s;OBAsHSGEQ*Bo(=w6#NYDSki(byh6{ zf9!&FghOuMt!Dfs;?GKB;vurCc&MfaEal+?Zh$v=#LQj&fyZZOMi1|IPT8bd_9KAo zCCfK>;0&laULzF^jq-FS+tSkSASFT6HHhKzo##S^_``4%hYFBCWq#tKJV_`kA<1JQ z`;jb#d3t%>lDzvdbS2^bLoRWnYMFtDQZ&|@z|^9K2*#jJ+Z{-cFVOkjOg#$4JMtSU z@)O_m`9)um5%o-_huAtzWChbmq~&f~J@LEQLe2d-r1ROtpN)p}0?!x*8&4 zzJOlNlSAALQ&MX<1R25l2n{<-(_=&rLB!K!k@^jp?4JICH+0CJ+N6~lsn9%_WD|Kp z^HkLtID$)l*^Cz8l(&RT!FyFpv0I%T5Twt=rC!xEdg5Ko$Z0BGv<`FcT3qbl^kpN1 za##yA>knEB6DF;pyY=WFjXVE8?1hfs|5w-xyRHaPTwC#?q{A%J?1d+;3Mk>n@Tg4Q z6QYD4;g7~gUxDJf?GCmVZbXo<7p~`zuoqH962o-}fXZr>y>NIp7xSC#g`4Ul*bCzk z7-lcrOtH{hQ)yUZdtnyN0!6YHMmC9=%`t2KXD|HEUih!F7pil$8G0o>DE)s4%wgtV z9#93PcvQxI6`~663 zeK0_c0pw}+LJS_2_r46FCW=2Adp-whYHktKd^m*?fST(BHI40sjrbmUM)jX$FN{8T zOnYJQm@s?crG1UC`FH}QD*#8nsTWj#5oH{?yA`VUpw1|2LQrn)S=dM)VdWm3ibvyke8(F$e(;7Bef*EU$Y3CBFvwW% zI%L?Ht&#H~Jt*p<0dhXPI6%%8JSq=-974`!{%Eu=069yq734g_VIXIaAm^MQIYfZ* zF??roh!B`BOin73^Pglfblam@48iI(-eG7zT(=mof3R7(9cL)RcNl7i1uO;|?J(r% zF&bM8r|3Hj{O~W>Vc0Y_WUwm7i?VM)ph=Wp6lfCf;8B_VVMvpBn?D+j51~mcoFsQQGGV2@!6Vzkm`0JaJn0{!*Ef(FAWTpSFBj(BK= z!Eg$W90Kpn+3osNpI>0_LEm3kkHF)y7aq}b39}c9IQ0LGy@2~k#@R2ikCTe_0oG$H z(;$@CFq(#KhdirOu9xIbT=Mq-qgc^xqU83_Gq?eLm|0Q*BWj5Dwl6wz)bwB(u)n9` z_C9>=>6C4OubuR--u6llxQ(kN@U>!iiF#T!8lckm9qKQp;$#Z{_C+mxlhRQOr(G5~ zme-XTY2!*tQ%5LbJzi|tjxoz8;wWu?ahW$>eiu)vbweZoebQV2*5tcnU~}bv5W{^zUDJ{7Dm8Nfh*@&~^Blgn7_Sa9_wMI@!(8|U3*VhQG>#V%@!ckR@xBE_z z{8{l-h;kD0cghtmoYc&6$`c^C>oB~`0ABPf+E|*R?I;PbRbW#I7&J(pp+;5~J&qd7 zI|!dPZNMQqI7Bd?vn1a{Y^)c5>ggi+W|;ApD6rA<9wlt_aIfm8E+pRhW@6tVV~1((GkCiyc%P&s zPl)F;S$Xnsvpv17cQCYiqSHSnUitf5tf*5C*nyD7#K=4fQxBjQ@fesDQLsKMit!{6 zIZ{Tqdhg=8A$GZK`f#&%fYUz?A|92f%15B51W_^6!U!;sRUR<0z_&^Byr(4W3#8DNXVg-6M~7z1*23D zIam-G%}3mco762JNE`17rR8je+xXJ?^*N_6wI-mdTF5ZWX5EzhBk z8S^N_(}mj;4F^5YJ7}dQ<4OA9t&?Pqp<3GThlf)sRq<9&f0ulB8lIIlzW^jJ&!ceF z^2J9;?OV=~e9P%O-fZ+E-)-d|lpJ^wbdYiZ9rW2F0IiQvE=&UjG7a>gTIPuC6Dfr} zFN%Jk(@s$>*N6`s;#*E=M3if$AOF1Vkg8I{4wv{@wPa9i|2#fA7gZ17*ea}+zH4-4^v`(k_slZ45M&tS%n=!k9L zM+^anN8*rz;T!zVec5ju{Rn0#XHMZ6ieU@FQD9nNZ<)%Zt}dXcmq`AXk_wR!AXGjK zg%hHv73IW(z)x70%=CF{>_zzrs;PJkaO~Jv0$c!`=I@0)El6}aM*w_d5U{Iugs3%%&HL6Y`QQcrC21>gposlEL%_*h2Waa=P03(QGzf^m243oXf6`QqDseN zT^N#HJs@^V14?dm*f=M@T5^D6(LkjU;#5t1Ywc8syc8by=aT;}^j? z9zNw_4gu@BYWLOe+N3j2e9@U#iEv_GpwHk*FfWTkk%dqwPv{vSLZAWrIIt3EBvSvF zGEN2#sqy`V)1Jccum}|f0IZTnnc#V=`Zx9SRwm5tB>8|#t`&pEi%>Pms`otQ<yPGd@|}?ByCn`CazuRPhy+prwN8vPc6nsH&#@FUEi^v&a^;M* zm`l^3bE{R7vscURrEHV!zJDD5~jG#WKMK#@( zhPR-HjOS4UT#dF=)UU1ZDB)Er9N!^{WyKD#-S7TRd3ZQEl5o5Tsc`^YQ?+H+RNqN* zfg0`zqoU5_lGh;h?MSUmxID7!2>1$C4KSjL%WS3xDs3eN&!bf$H{;BWNY$1aFZ+o5 z26F|a>i!TX7?T#)E)nGJ(a7CZ;n+;%o+!xOtSG|-xls8;E+*;)dzf5UI0d^Jxw;6@ zyPk@A@v>vlORg>^Ee5s7%(!U-(p(CsZ-UzMD2uLwTH)rR;CW0TUIcObR?y)jS2*Hu z7UvKeZ1Fm8jssB4vG$@_Xy7ip?1=KU$@E=CjrbP55u@`h59qVyT9;hSq3DvAu@37% zWMe)`QK?JTU4T}bOdUeY%Qpgt$Xd!LIKN)KK0GhhtS@jNZq9X^=RYZbY~v%dqy7-f2+h5j$dMgJf2oBBT$_2Q&s(Hq|X zE0N|>czV}Jy8bT; z=*k7mL;+#_Un`+W|3~;A)BlO=->d&ugy$vtKL-Z;|CrYG|Ca1Sn)o!f534cMn_(Yj zp?PBQ#P~rP7V+6W#Ig!oWB6tJ5MS9o#4p>2*y{-zh(CNIroS}j)h1%g@Tl~Ao7dq- z#8Yl$83qkR5!IcnEdENL$KjqMk=T`#qkR8Xa0#C*JIwvEf;Pz_m=sw)+8!rAJ%0Bx zrCh{ERFoBR?iNOhuFUC?Cs-cXn#dq0Xp>~1L9skJRJTcbBNR5tBC<)IWt#+MN4#br zE>lK}A{}KYkqpEtVUsM=%fm@sF`rw3pk~tASE7t?hWLSDyGouXx=46$p+%shlD^mE$fyg8bOuiQA1|ljW z3^tm|Yr?RRFtBQ>8;GyKNrNVgkhRnW2rWg#JV+xm$wT5mnL&9JD(|f1$~j6kc`Oj} zDAbE|6lxqT0Y?ji@))9*M}fLL`cQF*XAYz`YpD}Cl;km%CZ}W|{_?IaQL~UoI?c&7 z1Ccy1DqFu40x1jjkSgjS?FG%;Lmb;7knIqNh~%E8+*_jy#7{P%CP^Cnl`SiR{iAph zLdeE3Yvv(E7B&v8e_{QeSF@{e_C(q7G(Q)csb%Q)AHT3PUKcBA;xi&(g%%t}BEvixjS=&^ z#}Grc{Q6ed{O(k6rMdatmq^g6`Q6Q;fI(cqLKF}>zk3^@R6^tV-CTsXYJP`CO!gf& zVsyS^+IJ~Lb~E!k&dWE#+;Toa`)=3U;d$}=ZaoJE=6A6pS~tHd+Lw%7O)P@Ze?{eH zKwCdH+NFRshb42~9mE$m~btpAqYRb;3&3WXdy2LjspC=VWZqNleGPE9(jDrts;6de#BznwgUPrHj5%| zB>9$Si8Q3FMVeTY-!%MTn7ad7e3VW5{PUaq*@j>Ve^B{j0hHY8>EV)xrz!^9FX%j@ zl2ywGB3?4$q~b44Y%bBh5(^NLY9!xBX-^0T0hP@>9ml2-ANJr%aK~>vwGisXok{y!@|rq0NHTQeM7VU8 z);QE*=mSM-vuGn)``47-L1Fa%5K8YJqW2S)GSO=d(0j5*@BUDF&*~@WU76jK-ZKTg zNACo^j}H%__m>n(q|rO3HT2%|Tqu8Q&J5x22Y6BX2I$RWSE0n;s~!~m9X)1mkiT0r zdfP>yw_pYH_wxeK`z@#n@OL36(&&BC-h{sa{SbmFfPO#|_Q2W-=m)19E&1$bI}UsK z?A_q!#@?yKZmqEQj3(W1Gg|Y_Xw5gLAr(5v&FBR;Ba54}sGsMepBI(el&A8k7vBnn za4X{6It_n$zFYHcCAZF$9_O4M1i&@fV`tl{<$q*XS^ zs31^b7juKXlWJROko)#$@4|S@$0Pl#FkD7Y_7$D+g7wU~f1|eC-HkwMv)(g7o8P#f z`1dln6yRS!ihz>!CfQ^^-45!GQ2nHoXxG${PzeX5@`e~VNuAL{l24S|4D-d!k+3vK zA1|2NsSwZROkZ4ST@U3Za+b`SjpK5Z%f(AF{OaW>*?3V$=48s0;m3Bh3KRFn+tB4u z*BhB1R!P1vIa9t6aqTua(KR*3CGW7S>zz~Ib@>yDss7HXaVPp>Fz`5mtEh}4^8oOM zQOOQpTs!=lNBBC;cFJRIb~)k1OgYBa9)Y$2Tj{f19hKt*kIsT3z{)sOmCg+G(chIH zQ^?`6&X0@4i{OU?FURBu6y?8^AK?EV%a1X@H3j%FOuPtw48+SZ`9WI$U)esu|K|8{ zeUh0pN+RKYtO0P5)iw11dXH1y53t}|YLZdI{c-2QCD08}idZU2x&du2%AXUR>CcbJ zn37X)x+IUWNpL1NHExMCwbS37j< zO!0Sgzo#0dxR+CSkYblp{=uH{xyMbN6?relMVyPJsd38)<%9l5z4n|E`j{yn^mSTB zA---<6eDf2h%Ae^BSGMPM5s-r$rdIXc)uPRm6aGA_2y6)5+I#5+Nok7-(J7ITodL;Nc}qfPW796 zS!n$}p2u_!!P4VMcuj@;u*3rS;eW^v0gxa5hy3_}QBZ(8U;gbCbiNo#fCD(RSpkOK zmn-ih>?N87*0+|4rIm$Av|s{5dj7-u;%fuUrR@^k2>-q0b1!xb_%_pb!?Tt4cnmdB znI+dGzzlXj2Xn+1o$0&ATxst_3#~5yZHWW6(t)ERU*YmpJo-ncD&Nwx%U7@h=K-I> z`gj>UoB^zoy@D3@t4~CJX*WD&D(-_Wt)pZz)6Sd?T1<0a5rozY*vSn_X2}iMYOvh@ z2APgH)pN6zS5cp(sTTzRM^VqP6A)jZgrj8M(@`=PBegPcXyjGN_Zp*Qo(8GN&3MTY zr266p%x-xVb@l6beflO8uWynss$DFot=6cms=&?SghN485Vt~E(?d{8Or!u%Tg}vh z6$S9wq#7jCuw4MbdkuCuK<;x?(p^K2MJ_L*E)sk-E?JB;=LCrDNLl=NBN3~up+4>N zJ`2*;JWNoug$fR!-|hzS~vH1qioSj7R{090>K4 z&UDQQ7ELA$!!@DQ)SkWuRlo@a08koeapv-~z%^NG-@u%K@1ejGZM_EgGsy?cp-+m> z4)vGIIJ9b#Ri)!Q4TqKpg-*sZTyjAdKm9hb2X59j!^@XzYCZX9OR^UoRlV>{v_V<( z`fj!M%r@9b8dr7@PHpcV@TugR^e{cH#=~a(ZNuL#|0pa=KJ+|zCYB`+f*qJ;J63D! zl79DUEZZVUyu*KEG+_S8s1@C|P42z9aQ25}rViC(?QS(wRwz<*g<}?s=#Q`kH4Dw{ zZsnObcB{Tg%Uz(@pZz>y+sTP7@yqAf#A5E6b@vo>P!R5XfPk1D5VciHqFO5 zAX9N~UKB6+a5*7tM;pQzeEmvx?NhgHN4(xqg7j-<3*mr@UTT(ZyH zL{1?>Lexn?Aw3O7kkiN{ND4{mpy<%ISWvYmqM9zb67r+aM{ov(#23b*#9Fvjj*`^j z$+e&3AsG8b)30h>HCodUtnLU-g*q|^gNIwGQNfQnx{+!b`z+PMy^F-^!;kFP_7*aX zl1!OvP_=C&l{~bp!`w=CqLs6b&NeB3UqOq#aL8Ncg|p=~b+K-^#g(&g-bWIRnzKljYI}Q+OwZ9Hw%qG!%i$}qSBbx7%)R$Zt zSMKq48~`>R#yUb$ro2b;6+BsYqUOyp$*HczrE5{y!aSg!fWPp7De zMw~{CI8H1!mFyYsc{z1mH<#n&%>QHWugqyHR85O3YyNToU=E`WewLpSD zWvepkV`mC_ug9y@I^C;PO97l}&`}%5YVzob6-@w3uR$0MSiGGydo2wY?V5>uD%^4n=5l zjH>WK-4H|FFWD|{qxG8+zQOJ7IGO0bD2^jZh_p^BKN5qrT3oX=eOD%0wvGH-VuLT0 zU0w>;=r~%>=V`$Qv^SwNt7#`9weAGu4MQXi*Cp7r20Fj3XrSal6AcvYB92yPFmqgn zyfKKClI;Y4nt7$JsdeCCsqPOH`G+1LYKS z=)C~vI!(ndAu{=ZHWfcj$z&5&ov?T}A~~beY*XGAFTM-#SHjVHq4}t3~{pD#xVd%Q?7mxCj`)2v892jK&9}c z3XUVQ!4}E}<_Ypj!?TisxRr)gUV1Q)|^LTmmAxCbsXH?OZxkn-BGQC=O zA~U(tQ6*}OcLK*~?UleoyB^nSN1t?f)p`WdJk>b7GHyBb>e@m0fB50J<>a;3R7__= zWW)6*vS{JK`!YO5D+y;4V1*8o8E=N{1?tC0?LsM^A3XD6xSl^6zr6(2|LhFf(D7Sr z9EP*ESI=gvksR-79=xr1G^XJ@uNWlriUEZ|+?oe(a}?at?6r zgqSmaheze?P;$QIkH!-wf*iL-PC18xob827&bdKyhydeCd}nfq5ZytbmB>l(wkM|1 z+IU?&J)sYw`H&()Ut&cBkN>jaFH9}Y{(+T6Mk`S)8}@5~N0Ej*%uWQzhVwXByFIHf zUR=KO4~w4${D>YjdNTK*T?nXj)IdyV>J@mQC)9h&cvSDk)48#|ieU7XT=0Dv9>tlz zQ|}iYDVIAEsx|QX6S$Jz&(QL7eTGRK^cF9vwky^ z^27%;y3VBxR=er3KyTs$M&c;;r4;HnUN8wRpkz)2LW47i%_r zgD~n%-8qW!iHniePiaxD?>Ro?mpH3&b7J{Xev##eQENLlaf211yqDL2*_s? zf%|j;@3km z4ajfR2Ty^qefHJWU(y5C#t_-szS1vSV(2)?bY{4!L_ftF-ViXrKQ zj8f=42iwTZ+e{*dQA(**KB046VfNDinbyUlYkZbRmXezh5Dn+P8Saz}_Y9nEoMHAx zk$eXy0N5DBLU3^?jd7+NTW&e`6baS1`BQATr;fptybUY1zTt-Oz}xK=cvy@78}Pq! zotX>khQd%1*#XU8A~xJB{2OlUj_oV3;r2|A#GXD0qHq`Jp6Oz2aitbY=RJ38I^6yO zgh%Blt+N!5x7~8?hyHDM&lT83xo7Wpl7y7C9Vu+$@)*>~ekemZf*-M0;C=UP3(|g( zJezpGo!%`%-^$$!8Vwunj$rmgH*TmJ0mtq$62Ju5aW_?Vh~2hBfz&Wt-^i^{KLQCr z18{b2b|u7>>6mT<&Wm zr@_O8iDwtW%&r+n^Z?8eecVlnE_FwGJB7r$gkvFdLJ8b3DjXIYt&t%WzlFVz>>Hls zopE8Lym~`@Ncl6z3L%AuS@E-HF_kWyJSRh$yo|5_ASp>1X_F7RfQ)T-Do4Ccu@_48 zl{8|m&^c5q`fB<=M#_M zP-0*nr>l)9#2ZI@Ec>2R`+jYQl}>TB1wlXn+r5AQ_NP_UKmhi8|K+RDX1)Y)3%30Z z0s$5=?=T2(Kw2=5-xvrun}I#~@3AL$Xh1*~oP5x;4g`FNxXvCwI0y*9^{*j70OlC6 zFL$JU=8%T^ae%phr#=9TqD>dLJW48ZAuGZHuCM_NxQhxVFhDODV1S|EsZ$zWX!Dwd ziscr>!`xq>0o`CPkXU`KKm_J3BShfYKMO=)8ow>(H$nvV$$ST%=%f%tV1;UWma6Dn z;j`TJF!{Wiy@D>@03HCxRW~A}PCNipn>qNVx4RSR%1X8!t+dAy6hNw+)9NE%{fwga zrYn%Npd1VwmPuU@*oR<`h_xlz=3YQ1s16VNO(71@54*sMS6q0bKC<*Dx{C}ca8kPE zf*j^Wim1f0dlY(vghg9hHYw5afTV#P*6b3h8}A>*ff+=j+c$1QxYM&D8JRgj2vCVO ziE7?!XW$|vI?(~T;fx4AmiDLx8JI=qZg>dXfB~^TmWX99C^(E#iZFl$YJ>x!g&R(B zoT3pNX9LMCM*ls$7e?e~pP`<>`Ue<8y%$WNPlh;M9d0r#R~r$)d=TP^zz#EV2Rxka zUPGHo{FD(5zR?MA3gw;{?^M2Xrn0%PwBRv(sVH8Jzc^%q?GJ9kqhnVSN@ZnSJXzol zy{|i6=XG)~T>TVo!PQ^5AiWw^L!UR2E6Xseh|9prD47?~$3|Qm7US?lL!Py-EaZ$q; z`^OTMMPo2@9Fdb4tN4JuN+;d^j7L)+PsnKEv2+PSIjiizkjxgFo|?xAzj?@?MRveC z;6sF_gP4MJELQn;2oS|y^a|N}6(6MT$#pJuq%I;mcxk~h1f(zY5N8McV+sCVj+t|1 z!})u8D1R>({Jj$VjcbK#R7l~AQ&hKej4U3bZ;V}ow9lcR92;LR9b8|A1n%vkVl z0kLO5E2lExxQ16|q4*@+w?R9o72-W<6XGB&#r=HR4*o3=TSTz#m##?!&y6bTlDE`IxNAU;LXymyLU)>ZN8#6b|d7C?xrcRFyBPlC^M7x5&qCtO$a<$@9 zZ3$9w6wM5ZElG!99Z>@kwJ~)AWJelTZw{s?!WolcTouo)Ij>&Ul1htiFQ5jkZ|f za2P16IlwTv1dp-yet%-y-TuL0INrGqq4geL4+XL?jIVnU>P>Uo62J`9aczP+?r?C& z$?j{>Qr9QulhW<_J!fz`=?Q(&3j=Jp7GgpKexaY?ZKhK|fjX%9<3g&Lm{P?=8DIT4 zi8Vg^f$GQTAqn5$m10`+m@>?>SPsU-I?BI-iR+a(YC)5w$C<3&`o%9W z1i`y!2}u^BbN3Gl+qo+rsL{Fg5lA9obQCI(5ErX^|3JqinVsGhk05B19+t*{hVxABp|K7hFN8iz&H{K!)rxREW%KcPh1(n&wgId~ zT;iqSEjBX7&4+`{m74AcIp)X900(eaxhf?chn+54FMJPMd0-V8o~f9CKBPuTR#Rph z+uI6MMFtLopG-g^$E2GoumI92bIgmguVZPJ zyxgB8C1DvO_mf7OUAA{3SCF2&6SqJPK0vHlY2PlI<;g@=ktyF}=)gt%z}HU`97PCg_7+-AdZp9;?7!NQ+}ax zE-XRUPi$pr5b9kRM`MU@H7;Wj1-K-0lLG=F#{Qzwp18S%UvyTs`b9ZFw*ycDh@0X_ z+b9*1MFG8Jr0ta!c=%<)6i1JJa`{g<5wgp52bK*-53C$e3X+2NMrV)R4%poQlA~Z& z@)9cJ@FCi6vdEE@ccA5Em25dywrLP1KO~*&PDk1{!IcP`yOH2I@EGGFX-Lt32x%=g` z36;~jR2LA=0R1oaXg(|~l)&*X7(4afhuvEe=Boa?d?mD# zg7Fbun7rLrLi3*A01DR}N<|$+2!K*~y?%|jOxH2PL<$qeQCVq6&yUPSK6G4Q7k>Fl zc8mtn?{2sG9*#vGT9dHW82Y>$L<_MPpRQQr6f?Pu%Sh~rej%M0yM~0{K-$-04x-k? z+=`X5r!Q01-}xFx@d@BD`~v;c-|j&OcN3V3P};#vwHetHf{!T^RVCRZi3t@~!}}oM zL7GHcP>nE#9_o!TD=VF8tZ!_70*?>~-=-LkE=LS1kq-`5G$Y$IYI=p59@x+fnB8XL zNM%Fu^ME~CtH02gVsgUSqxFY3ntI!#HJ%4P67YB~bMyJxqb>Sd?e=J`;l=A>*`tjE zjRtr;p`rF@Ye9>_9xWR!S*JbPG`JlT*y%}i#AEc#c=<)QNAtqH(fB@}uVswMT0O1`e@DTZMK(v=%CWYu}9lJ3Y)4Bd$czY_CI^Hi)xQX{=*1|)`#J*ZI8AvOnJ51qeWp`=d*O1 zAtVsm&-pCv_>Iu#A?|b8qb*`jYGjZ0?aZ3?XdfZ0PW-vn^=ci2Z(j2%?M<{jNdnuV z(Fw}_`_h%4+!H22N}Ud!E`H|VCtcaiHfBMFXnmC3v=7(uuA%M@=e9?4Pgq8)peJh) zFW_X1CZs3Yt77FB3X(-Ik=(7=m!#U4Y5I}gP>YfjMZ$ovK#Nk46}*sQ;YK@P@wcxK zYril;gERjXx8uU8vVt}a1^bvP&b*3(`|pEw@ID3bHvD#^+AB5d;Dx|SC_dbzi}+?N zS`?pw$;yC%@a$DQzYa!xVei|IP!^?yFhm<64AI(g7!1({kRjR>Xm%GsbW&p8`lc7# zX!OM!+g`kc03~Lc7EIQ-9DEB0=X^)8U1=ON7B8?sOBO$U@guA>nxtU>xMSiG;O^Lr zzIsgk(_qWcFN%#cPJW9I_U*9I_z_RoLhVt%{3F?DAk1x_q}aE+V;)6uybbc0O7N&| zLWIhghw&)d7nZ!*juKD2p`5TE?YD=vlaLyrGjM>bS!Y0j05CL_K|c!in4(fa&ohmf zo-2^6JLX}g#c~-JY*O&1jz*!7=wdn{jO;QVE1CjQ2k@jW;@&3(nBY%Xuo_H-) zHUbC>hWYPy9DSKR2}j?_@a&NK;X8z%+gBKk&uk|uBMa=d!b4T4P6@HZDl(d{TkVvx#B1ce9MuLAI1_|$Tbd+7*EV= zEp%RsuO`c6;5wDnG9HKzC46JuD>1Lx3;c(a#G2`~anQuW)MQNcE2Mj{V|3y91w8Ac z#b6x58-$upKDDzJ^aGK-p8BdrpVp$Ua^G!)D;RUA4?J`bW;UVlP#736yuRvPm)1S3 z#lqn^jrrCfyoSE2^shDbRev9jtymrUs!UiZ={S^Bm%i%w0!^|YeN_dfd0n*l|5RV~ zZ1S(JugaPHU#+jY=MFJ0>ZPxG|J|_qs$NuHE_CNfHhcO)p<&|@zoTe^&VfJ{L!C< zVSH5}^!)Tye}A)~`l_3B3XJ+HI|u#-`l?r}!sx4xbP3zJr*dm_ZhZujYhC_6_8ZW! zJ|@ZO*H?8EkI+}O)&uj^SUl=-f>B?U4S)rH-|iIps*(H_hqqr_U$y$~-&S9>@D^ix zpHpA;63m2{=aY2-oK#n}=&RJb{5)^aSM5S*9r~(OB4I#Z^%MerLw(iB9(C%g-WO3C zs;|1^fBGuYS6xMm^M6!d^=i*h3eHPk^})R~MV!1%phcDZR?Tncr>|O*cW!;vV*mHB z`l@^J`P}-dTJfb?&JzUmA&tnPX6^cruJ<-TA9CUkpi}5W#^UjO&*#r6s$CxvHT~l0 zLq-s}7jQm*1!ytoLu9mMo%)d6`>46A0P&nuufCt2e;s|uJ{RRJd=&g=&*xujpyYh? zAx~r6U4TBM5g0f`AF>SXUQ-`(dPhU_AR@mmvqBYjA({B!9; z=1ilCkv`;89J3BRpT7lR7p4y((^zN}PU`v)*k+ZUk4~fq=|qZ<8ID5Ktq*}B1p1Kc z$tnVN7zhprRWSWad^;txKdG0_C zSM0Fz5ttaBgmz>*;QGpdcBBV*TxdrS7|@QipVMOs;;os1xIy5h0i#UGvf)ic-ge7F+ zc4SGd+L8VK%I()GcLqo5D|5xiruFVwVA^~$-o#%NH-wdlC zF==@Se~-25NACT-e=MDkeq_>(A)|@)BMyYt8^7%k$ijf%Hb&@wsea_yHW<(6tsnW( z{6GCj;5<*|og}thkbdOve>gw=$ly3Cx`uvaO-7A1>zw)#%S6KfYp{OAmlbY&RU@?C zU~GO1bE&fPn*M(5T?Khk%+ zzmNR_3F}8<2l(|PKlkTH=tqu=Cmd5$RXm2%kE8%_@mbDf3jIiTe)|S*zqWp)WbALN zAIWnV+xwjQk;!rc^dnW*`G<``Kk{#c)}bF+BoYSnBM%_pH`I^pX;r6wtCK>PH@H9ZJD@=||SU{hZITCqtk|EBI{-zn!0cWbv4D>qlJv?_u>L zH{f%f`Vl(OlY^sw2Q*m8EW7h?^e;aFr+L<=`A_p?>!*1TUa!+U9kE*lxKr=bJiD=- z#Su@5PRTUjIFDIB&XbJ2?*QyTt#o-N_K|d)$EqLSApk4+0*>=!GWcai_5^L5$8nzH zdwv9q*Er6TO|GU-e%O|$Gn_`eIo_e%m4G9PNjRA(&huoA!|6;9JCx?*nZLf zfPi})I2NHf>7;Xsz*n3;wfshE|0*Cve~=3|#mj}2bX7n*srRm#$*$gbG*xcs6(RNB zIkQngXS_y9z02sX0I7F5LQGPhjj}XiKR)#L#^UclH)1P5Zw|?x`(kB<3OS+<9>zG- zA(S#ju^)2V+d+eK1fM#qUGNF!uC6}7PLB8y8n$1>sk9LL)fX{H1pH*MUtNMgNK`nJ zB(SR{gzjXxr^m`^QbAjRKayqd6fJRDXBP^Re3prnP_egj!)X@$3wg3StB($4rN6xo zNE!~r#ok%Z6;GV4>k1C_gGQJ5N$MN`jiNcQBE$0}-$;)ROGam<*rcRsNBJ!2B>z!4 zwp#U{CpG%c*ACe}nMenp9dxqx82p&Qc^Qm?m!s{f)R=6RgwU!f@X{3z50&^2DP_XS z?|danbGLJ~?73g-gi>{_jXPmAqFdpS)J=CB!$m%h`KwRj6FSe1b8ao|D9B#wuXd@Z z_UtkaMYZGg`&~Pa(mSIxQ1fO84AU8NxHI7UPTNbm2D_Yi>oIAC)(hOc$% z5LIoYQFe;lzi^MJe$rHpw4)#mp7^T@ItJxGN6Vi->Tuqj2xRx|qFI5D%|+{m9ADga zp8esvA$)&$jvWcpA6Hmw?TC^X z?ucb(2N6BYd{mf@`_d&3WZx-gcm|dn1Q|F-ZZ-PnQ96+$F*t0WhRmBg(%zen0sBjM z|6#snBm`hzi=(_f;m1OWD|I*XUKZj%>?4jPoOU&?6uv-(4>8=fio=@lLDK`r_}?Zk z$8d2h&7T3g_Y9oTlDXp6EsR=ZiU~M4-QFL*=jpS^Ly2Hd$vw6>e7NlD z`h{od5U>)9+w>l$Xf~gofg`s}D{blqS(%6os4a{46$~H`BFMQT?mrlT)~O_GfBX!K z)qa6%5NB_t%d2jdecci%7CmeCSZViH6(m9`n3WjMegYD3T^FtjO@JF?>9z7k!{S#) zx!TGeTQod`G=evKGbU)b?C3l2D7B_p_Czm63*b1%NT1vV9{H5}O+jlu^vj&NP3`B_{)9OPgP6SfoW@P-qvXnJ=X8e&*%;UPFCiB87NWu;V0+aIk{gnQ`yaLB z2|~<|Vil+Awd&4pHwR&M9Y*HPMTrZM1>Q!}+e5rO;O#LzxQIi@ooy5HFnj_YhF`k_BW6G04#91ww!onv4%IKR0olaFGEjadD1 zb6tj@czGR_9Ra47n}RnffH>0k6S%TVtZziJ4Q@aSMo=BO@kGmg-5K6Cx$WS?icV?4 z{U)(2dH%8OK4@>sms?W%;nKLiL(|%h9IiJVG%wsyNrCOivTp@e&o_6HuPRlRN9SH2SP-2j>oCZ%GS9FJ7hBFJi?8!oQCV425?QTqSE$n?PFOSCSW3f=I+cqSl zcoc5}GsJ;_}jO<0e`+D1?*H1R#43KbaQ%Yd!fINMc2d)XaJ!csL zaXEOUwV)f$hi%}RPsK2D#``R}_=cYLw_AlhJ_1n_3VI_dd)ps?+mcCzQfh+d7ruSa)woQoRU6x+I4i0iMxT^)P&F+X~O(G#XsB2#!uy4mjW!)RFr` zU=E6r(>|0IB!aoq7h>_$DAc3e+Fo!qksJkf7elA3^<-B1udJ0s_=~MklEU_tZ&!yW3Gc?60J7^q=`1RI|!( zYX)tzGvES5M*n7$=w!dI2e}J_1H!K7c0h=PWSU{{K!^}_(RO{JEG6LuPTHt9*ytLl z01ivyEi0ZGXXlx(h?6j%3u&qRGA`B!#Ct6B_hMn3`vCl%7QGC%M$9}%kKsA& ziw53E7d(u>+e;`|PTMhUD0(!9+{>oYMp}56b)*f?cUi;a`V=H)sPeu^KS{}=t{1pyi)KZZs zCJ!MP<8%NHQmdGw&hF+>4yz2kr|A*1l#JCr6GH$EM<7~DjY4U^xkr=*J zo6?ExhZgCyXC&t7ek$|Tfd;yvPeSo|bd}!&Tso94dFrF>X-^Cgj>m468h-5JRG|-p zHX)(_9>nOk z53#?Doz@0FKZr!+K`Kv;202Chq~gcnP07F|aJ&=nhoy;>7+l1^(VfZ9Do$+6QFP5v zscK8+zQRDFiM2|-hv^WiNz76-V5xW7i)g$@K-W-KnAmurjzL~qX?ElG2TNhv(}rq+ zO*`C^O+AXSioC4q=u4oPLc3JjSBkD9@1_fdb5kt;3o&0~Lc)+Ixlnj2Sm-s8za{%p z7|N~GT$}zO8r|-Xh;mO+Vz!c7X|R$jVJo>Vh%CGaw8N9CctmS^#>A@Iagv$_${Fk` z#Z(lSiE~FJfvKbguYyn>3c~-GI*QZRXr&)|2N*wyfzx&p19R;&<4^n4=Hb)78aDlQ z_3RFR@|H**;K1Eq)#N~p<_E`NCf1gYi5ST=(K~uzd7y2&h%>#XzMt_}F4=_%p4Nww zEV6H@5%=DG2?CF^%!!_Q|fIG>+4L=wDVTaKwHtYgP1))0BI2N zXx``AuTyT_ zZ<=9Td71juJs^fSoJ3p_&OIXDza!P%-+krtHddcR45lDYEpKz$M~gen9Wn(9YzGYD?toCP0iG!@^6F#5VsUFDB=8^XMu zY`)<$#4-S^40mTlYZqt4h}4QRhqNc_)?+t^EjMqQ=WV9lbf{Hiz<~tL17+Ft{dX8l z9-Cgx@ujT9Y)H^|;78#BUAxHEu(!UX3+=5}QTtZfRc)tw06Wzk5EHv&Z-rXzP@Ddf zcB*#$p4lDPPpQ07#gaAqKrLJAZy<83?^e~dPqj*qRazI$ei|Ky+)Ur~L#q2ua^Hf4 zag@oR(P!lRXE3+$tt_HOMWiZC^c@it1P= zz5a`4k(tR#)NVbYQ~NwN6zW5#m|AQuv8|r{Gg~uh>+(kSlh`xR17{4HwceQDR*JvnGkJqpE8ifGzXfBh5J zn)lSJvH!t0^sv9lD(tJVr^c1Ey%6B}WNi!(mB^It}I_k0SJc_~z~d|Nr5ezrR$UT`vURT#Q_5#W(*kh$l6x zTKspK)EbI!{sGBVc~ku+;Q+pw*9*yxf3MF?J5%xc>T#No>c%(EA~L4ocy;%)8pT$c z4iJJFsUG;|t5n$HjdhV6jBl>(i9|#F1Se1)QG(zyl&<5OC5R^Q%^RlaQ*luTF%`dm zOt0=xgs5+8ub7GtA4NrK;+xZc;JJ7(^7L7r>K-%~Z$Mye_+}x#)s1gjMDCyUpxmv< z-H31IXxZ0>ZzkY-z3|P>FW1C3n&Lr2iS z0)Jt+z{_yK#|Ttn;*8Y$mVv~ZcI*2PQy->*(b=AORF5PWsPE1nO{2a5_00tJzQ5_z z|BNRL3R!(qB#AkTfB^NL(Mf8fx~bRk%|7AiZ;!zLD8Bi9m>sGC-+X4%#l|-yzQK_6 zSRBY09GpX2*>mBWJG~sey@=j$eDmez`ku~!Z+_D$zyb}%H?K+NtyY8a%|1yw{~GYa z_6Sr>;b@eDXsj>3`AnY%5EqPZF1jKNeKQegK(78{_-6Mf4f9h+yr?s_`$xF*3IF^w z5|65>W1xFuWd3NnV?RcC(#t$QbwrScZ?@;JgrM#1z=>kw5khE~5#Q{v;XLroYcAK? zllSYoCjCl;s@n{pOr8$n<*QkO1P1X8_~uh@Y3Nd(`bvxuU2^TNi7wIDJs*5Cl}W<( zZmash74^k86G6@e;+wy}l$+g;Z@wHJKpG^XH4xu?tfv7L@#C9+jQ)?~n_K@x%!>{D zm{|45xQ64K3a77uZ?*y6tm|!p82IKl{QzZt6kxhh;nTkl>P)fotAO9c(-`v|b z2;aN}DKHh(#5Z%0FbuwVhoR7V;G6Fx8JbDQH=m2p@y);DDG1*@{Js(29DIr+YWU`7 ziGF-D*Pp|Ucp`jr9*jc(+xqd%d$jj(_~r-i@^(c1v}+K)`PTRleDfs{5BTQsj~L&4 z6EOfrq8HT9eW&V)Z=QrjAQAyQdkJYm@y*8(Mqd}I+x_v15msM(^P`o&7QVT^xxNDr zk8h^Node$-iMZCUa-^}TVG~Umd6G82kEAjf`7fh`I-yDQkjBiHX zs&A^VZYDO>a}ZhJn}t(^GvYB?kaT?Wx(Jq~(qN4}jE-X$B`yWlfw$50_E6$n@%ES= zT*M)_Uw{E;6?&v5!1-^4UPOTN7|5>6fYV?f{XhFnYgqeDvgN%%`^|Zc_1X18@Xa;I zrB-~iq8m?YR`t0>G^sTd-&}y?YTm!>3ZXv?^9uGUaE`aV0?2=J0!a06P;iy<_hzWFS^)s1fs6uJM> zmU7QQ?nZobu9kgm_@))#>xFM#^JGnYvj@V0@XhW6FAU#o|BwMcFyTc_*{N?FOeV#T zA2h?G`fgm{XmU&}e>C0r9`FNoIpYVP{z*p&_u&a_C96+}BrzW&fDYZjI7+kMT)nEE z_@;zru7Pi!L8~h<<3WSp`g9DDI5S|~HHK+md@}=&s$`^oB!4vh^<7ZkT~OZ{K?0ra z$R9!dC(XISF&z*Ppx!e&Nj>(jI;q$3%`qUg2K|E&_#eeLTkfp6Lp9)=8~=5&@y&!i z7?K{#9mu#o_~!Q?a`ZtWdc*O}r(^X!odMsBYZhSO2IHHPE@h7fe0Yp7llt0kj%ls; zzX9JIgh2IY+^r+FfCd`#ni^@WFTT04eFKOK#y3~B3Pax$2>ic*Z_Zp`7~zxgqAuO$ zpPwc_=%1hN#G~3PHqdl2dHm6|ZVN`Z{3Op$LlC6ln}hf(;hU$Lh%ugm5RCC4cqr}# z9_0j7YL>e6Scm=Qq?THH2H~3ygsNv3>a=GVfd-c#fdyd$zWL{WYT#6!y8GxU1G=>M zt?*;_eDKXXm?XwGe`!@;d@~*7Tp+$VuQ4|}1`T6K9Ws6s@re=`N*mNwEgB!4^k}!zBvUav>R%_`39%2fo~1~-mLGWf*5$zN{xlA zYRPw}eCqw-)BgbEw`Th7YFr@swMZVoH(S41lLOBW-@I|9hHvhGkMjoDZ@yd{mS4ID z*Q9~?<}6s-rY`FU4n=Qi?_02bEy?eMOzPS!z0^dCHqaN=$gw+?{ zJpJgeg>U*!Tp1zv-wd}1;qlEIPhMHO{pOt{^b@}6m`gj=2I8ANkyt=5`ccH@>-vWPHLmpO_=aZ5X~ei;9}?R9*B2;hS?~k*2wy+UhoV z-S!?+Yrr>eLM+BNcaG6F)#H9734EKn43P!C*$W|RiS~+3^_p#zO{o3mHPC4Rf{aCu zKFghrgZ9)40&BxJ$KYF?_~t>hGctdn31x0V=Ef~`FD>^_eDg=dJ{P{(@!<_i}G>czJlvI(2-8~N`aGR9Irl_4zCD_w!&Y0E)%Jar&(}c!R3vCc4+sY|v_tpLpeg9Wg0)B}wIm)}i;V}8#M(W7jKtB7 zF4$X=mme5t<2*ZG)s3TWW<09zLH&}hs1zx(!agU$k^2D-tjr<(N|JhQTe`7eRR(#N z&RT}(Hu5e_E+gFb{Z8d;{J`z*ghlYykBi=CB_`3ib9>s4lBYcm?F_4k9vr!j&I|i2 zOF-iJ-&e3!Jqbz-_Z2KfON#pn_F#H=i;kR1uN@HQS3oMrb*@!kiKphS!ut_*L3?_> zDEAeFHd0S?o4*0&olH@U}2pDJ7!S_WzqhzzO2k~D|d?P^3tubiTD zKEq(*KiG8-dyzAaMGa_WOE z1$Pgvh#sW(NK6d%$a&t?yjHy(wKm*M0Bh(eYNJaLhJL7Si&|wUl{TF3pzxdW&vJNh zo5WWi23c?gkyQOT9t`pCoPrAq-UIvmu92Q34ks71TPW!kOSq5F{WNd&Sz1L?Rh)Zd z-xk@8AKXUz26Bv$rSwf;(e2a^_YfN}TRaI?5^T{#%?FF*y3y)fK6X`+nfyLHXcA3X}9fnwSspciUo+mil1NABAhX$NLsI&ALX!4U<`@tr=U9hmhU$D>GdXJNcc#rL2OXebuv z;Q^E_qgDtyceV^};P>F}(Ny~?%?&Up z)6-D)NoSaT=-Ou2Q0cYkYZf;4-c7|$G88*DsMx7@*Ipz}IqeTy;tuvf7gA#2qJjl< zT}eTg>eFYij(SWZC0eNN{v{r>v&S@;-zM@Kjfx_PRMJ|<(8(N)ze!MAt9}S?h4{GE zXBiNwT~x5vS?nulN(T@u2?(q6q5|zm&H1la&+yDv>w2{bl5PFhtHlu@SvZL~=A#xl zzxAq9$8)S#PoqgM&U$qSBwomRHNqUUUa4rwI@hZx?sBnS?O{gyRo1In=(hh8>(z0S zfsi`at1Jwh3s|pSL#;#CtLrd-gj=uvc}K(6tJm`ywqD)xGgYO&>(w`4YJI&bYkASv ztI1o#tXJ6x{NH+YvDd3dnBhZKk6(4YN(fhCt?ShjylZ>&q*$*W;Q$FN@IBkb2-ua5D|R_l7z8WpJjdi522&S>k^P&}URdi6(0o3-w* zz6V7YXT7?bs6Frd;MS^3;LFIcze>TJQ|Ed$wz)nr9Z|1fM*CIPt8MIvN!wulC-+yw zjD*y=UOk6_a{=pBW3Wc(di4w%Iox`6=9Y%7SIrQ=A^WR;pP;JLcfA_SZm~#=X`-6J zA{Tjo^|z10tXB&W_`mh)Vy{;R*`L~PxnAXmE3ww~>M(XeK1xNzUvkHt2~Flf+rLA(ykcyj~(!1-MA7iL-PjxZMu8% z-<4+ATwf|HL(Q@e2l!7#x>^*T{zY0`M%L7y0p7AHu@u9hSVLlz7XjaS6EV~uHnZB0 z{7PK1=M1!l1uft-GSLCg6tUH-DaI~62Klq57*g@W2zMy&Q=%`mpa&3S@Sw0~|2YtN zm4tFa;4AY4q>Z#3P%jS(|3qq4Sx^_E9fH8Wi2hcueoe=vEtJWrwTx*4JB6v(gyq$> zcu=qja#ySI8o6*cN#w4sp9h6AklWRL57tF*5CTv9sJhqa)c%387%8ZYXKH6Zt$8QN z_?-6irgtep5@HD0y%R#!OZ=~M4&b$!c!fI>^~jB9wTKhw%TduR=u!0pd?B>m%>EUQ zXoW0eZIdYvh4?J*d>3!DKlUO}Ao}EA;bf41g;n?#2A_{+{|Y~8nGY42H|NYJBXc7@ z@6mE^RM3){gFQFEzd{zmRryk%56-q)kWSy*)BzVxHl>Mh4X)1mnv`!97_97XVe)-w zfA|vNK^5>IZJS^lKWQR)T2NZT!CgD{M68XaW`$?OSSo0bqZ+n&@}h2bwUBzp6lu$ zn@43|&~P&xQkloZOG%rKOW74tpYo}f;^951&(^7}Rs*6RpJ($ic9ZM!t~;Hn*CtOl1(3Cjs2vVC zYj!A?ILZ&g(_I`KA%9db)1i!S1d#7idYNof%+m@c2=FQwoFThA zRSb_sM^;onN@EZuB7WN5f?k}K62eiH`x3@~-SGH_H*)*z2C7b(yXosVRP7Rs7nFjC` z{)Qtn$h&u8IsEUyF&)9Ynea7yDH(iZXP|>AI6<8azj3niJJ~Y~7iJDmlHC)N<ueLI$C+1_MV#L6IHX`pJ4?Os-qDBGKof%;(g<=a! zhUJDNSRH#tm8$Rl9!n3I7i5wmb<)SMvU%P z=AA{om`tNK1*hZ+==2?&5mE~#k=wsKDwrN}@EcO{Cs(uw0mxCkj*2Glt;$v(D!zlL zND!Zzpg&7O%J&|Q$LdH?KuPm?WXq98Xn^ zvG4J>S&EqBWZdqNOuj}F3WxOm_{xZgf*92Y@+)IH(i{E>0%=MzwYUzpc%SDUMg{=#2y#}AiltD+ z5TW29e@(=!Ni7c+E=Y{$`BL`8486R41WRL>u)yQ7%$`oA$_X#sh2^novpWuh zrANp5EGw(gg(oT_3qZ+xKFi~HrDD(km@lXo!EzzR3I0u{_Di7l(>(Y-NJ-r>zRX?` z>qrprSqeBaDCFRKkhELLploF~^tC&R?kOgh>KG@#{1LR!iznt4@e$Y6mLnH0rrVfO zJb;E|-8Ved*qSvKM{%y_!#FkFX~Dnk2Y#^>my|#(Wk1$mrn_(ZdwOcO+c7lIk5_~8 zba%IGyg8Lh2XVS-6be({D+E2okR)#c#|6a3Zp)FY@cj?5L36xy8ys)lwgZFbN80A zYWYhjK5#CLJT?Y|oZH}c>$cUPwz;5owR&)ZptfFi8-8*(Q%TRws*Btpsj=#7q#65y zPHbPwq74(Pn{5bpS@H05jh=X%qW>W3hQ3iR@u%G9gjD#kzt(%{b*mn6k9w3GpIOO> zqdO!%k>{*`QL!dF^7L6&z%z;Ah#JvF@uLe8Lp^YL@X6SC{Eu{f@WKtChn7I=C77FB7}DC)m?q7=>e+j#zL=A$)Ol^c^7Z#&>_saly$}wD<9|M6 zgW*Uv1HbSt-$W#;3?#}xBIvd78FCIsqh!!RzlU`>)2z-K@eT6#3lns~gl%DCaoYr@ z3tQ-X(NOyDp5>>%+)`iquMQ-72#L-`|C_^qUHTtVs`d7dtT+AR0*SV@IXC^|CpV0K zOh`f81f5;3J&u1a7zp-O%3MhrEhoN)d4 zTI7Ub@TWr~qe;KA>LSX;AS#$+EX&#p7aP`khzuGLFT)$3kPA8!72!pO_fL~mWU$Cm zdN5RE`0lPCb14=X;Ofr6#0}-&S=0Rd8`-+P{5v9$Xj`ju_P=z~F7R8Ufkfw+KdAkiCN_kA z`2W0Noa|Yt(w1P}HxY1MELRrO;w;$?{4P$ZRHf<~xA3z7Q;C_aLP+4}v>q7q% znE4awVj|@oUuHI8@nlHMSE^L`u0uc-rhRqt)FXt16)ng09J+B{PH1EVaAd0%c^XH? zE*(S3wmS0lh=^h&-b&6-htRWB^sGS~vZf4t7^F%?@6c$jEM7{~^1xnGf=BDZHFJqU zJ(kC@Ly$cldQ)9lBy6N7CX#%s1GfW%}VSkdloYlkn27}!VjMzt_F&4c@^Tex`e#*m6AA4cYh>T zZx%I4LFrmelJSU|BoI9w%N~-^Jsx^fU$|bYiB;5uqZF>Ev|JN@SJqPoM&G4|s>~x2 zZXuceTvZV#N+C8c7CD;ce~M%#e?`0yu+{g-XD4{c@Jt1r-(vAfrZ*GrCQZYFx z(MrS;wf_*I>f@9M%#%=5cHaQ$^`lKF2_;1`=W`U*)E3EnmKpnk#HGg(xQ)`Sv=*cl z9@xMoX*DPLhTF$yxen1N7FZ*sK`V->DiJFa3I-G&*l#Fx5BdY8F8_o|ZG=*dqSR&n zVsXASmsnNf8)<$PGcGev^)SKl0sdvfP>p|I3g+LPTMYbL3YxTDUyVof`f}mq9>L!{9HnqQrR84dcV#_g5T1V@LT2jZd+O+P0S?bf?1gR@S(+3yhuU_z z-h)4o;J@c->UNq+h=2R&{F{x^wVGt&5jC+AJswLtQ4@Moz1QkBf#46O<|u{hDJ|E8 z-<9>0K`s1SP9!{&Uq@90|Mo#eM2@D7A0wG_nO>0|luHXy5o`m9e|r%VGFRc=op#K> z9!jM8Yu`2={QD7JnSZ6%4>X@f9NgT%OA3z=)AdN`v%I!9h=cbakU1DBn@t;xl+Cy} zt@_NwM6J(4zR6H{tW@}Tb82A0 zLDGDM-V|o5>ihVaW?~sraYO`oSD%jgS}A_VJ#WRcpdr8{PZ4o(m9T^kj&T#mU`U1U zZBl+IXyO@crwS0dAhQ7^UFhU$jO8WC+uRdvr|eOuq}Nqisyt5I1%a8eM9w8sRO|(u z5oF3(ehLulj;Z~MeV*uR=ERgTQMr3zZH?^+-B*D9=o8e}^c=7L_yoW%N}9XJJ@{cc z7Y2_RN;$1;DI(V_qIgjaetM{m7W@orY|m;%u`bP#5HfYs`ka zU!q$kdh-L8fBUxNQjwaeaipoeHNY2vf=!XvOq#6tqMI?q57 z8f_fwj+N*pd**}ALn*giV6r@c;euD{q zNg;7{hB}x0B*8J#57e-@A%X1632i9)f?Im=QR)_sIlSTsnu|=XGn9&gs0;-?OgDze z(3b%T-ze`?<*rqQ2XPM?Zq`uZs^r|kJ2BMA&%eka8ae2?YUJUKBKYUrc_`^Sqp9QB zFFfv_>c@OAfVd-*w}2tNf9jmQziDZp_fIa>dS9X5N9zobbH}3~!6)m`EL6x%#4Kn& z>_kFJ+6#`@2aee1jd??G#6BZOWE+ZlNGl5RB|7Q)#C&&$hm}ou7?8F@DjJ8>>A+Hn zJrDMxwi2xJVflByVxLsxMGtt!0g`f^;x5Pd*m(v;?e%5mW252RTl2n)y zQtK+M*0NGea|13fBK6Fu+e?(OXu|F4bKPlZpHjxQ5kq}3-mQZwU0q}kf_O|0WoJjw zCH+n0fTnYmdt>|UqY>|oMtdgEpe8$Tw|%LrF-u^-Kw5EQonNmA@3H2$UZ3cS01KslJs@KKqt5RvB61)QB^-&R?P z{)p;}b2zw0XX9?na^kD&Am!88XZaU}i3xEo*Uo1-zLTP1n(|pn_-g^?KCRWKzlRl< z2aO5Pw^e$rvicK959{*Kls=1_qhs>b%4G2A)?VNEU~~@I98*f3?CE&?Mu2;0svIrV z*pO71W2@BO##Gr9JyT5J#U<2h?lsHtb4FJ;|B1>c2h*LMEnUkIg#VPa8$oYi1&DA@$f>m7O2gbU zYPQeP7pbZBM7v^cL<0?Z>m>N$DEcn1!k!<2OmalNiHGn(d&^YY;thAZLZxKc&4H+=Gcks0qEPHx1Wn zf)S+$q9&AEfqYXO3*=|X`OP@Q615-r8X$O?5~0%*R>l_eFFbG(sr3Ei&uAFz>?)ATXGwzV z83X+8K>1=n8BP1ipD3ALaTdjiPV5H}jWWl6GNe5#iYZ3K%0{%G{Mk_I0#Rxvm-_E* z!E*R6goG@DvHOk--ZU}_3P zTQ9{AGc~`T3-1|^%+w*b)N^J`c~j@t#ApG0^ay zH->68v5J}`h?=D6HR1Pj;yn)&2~&SxM^$RzJ&$ZfvX1_W{ImzJpFKFcc|1>DAl-6?&mM|qTxNCuQl**X@JPpcnsh@)gN-NFGryIwpHu( z2)uz6C=mQhX_ z^6{O9!vDMQo_P2>IS;&N=R)dhf%n9?FB;x6(~#}I7E-pg;5{w7)PeULKo4P$LU_** zJl2W#lysm4!+`h9K|llWo|4Y>#d~ge^+NHUHpt<^@Sc7N7lilhelXDcO%|LB@7aQ8 zxgfkJ&rsBp4~nAd#(R#zy$xpa)mS{$uUGxHc+b~Y8KIB!!+VB;`Tnc$p6>@5D}8== zj}x8tYv4U=V5Mfnd!EC42;OtuZer;FKD=jFIcB*KyyqDUhK5`yRt!l^XeXfCY=-S+21i3?-_@DL-3v#0VIatJ&z+O9NuH29>Ffwi1#>OtOf5G z@PQHUxg2jA-n0Au`r$o=Pic71GaCfnb8JMt@g50#kqg3mGG8gZE74;cvPM$$XZjYlFt;Is}Hnd${I|#}c7F%Tz?u#%D-_Ruof= zF!nts(H|I}Wu;W=Whm9SPaf(o7I@E8VpWZAr1`fp<1&X;Une*oS|80m?Hu+!-#=&I z-zw0g^?Df|(d(=6gI+(qnR}hy)DL=Vy&l2eJRGHPJ*DMd=XYg2We}c!UqoiA$5}_G z>&pw_Jt9lf3uq4YDmGvy`?NNc&&k=;?YezWUtOJ$htjp0zJ_Fz@7Gyz6y?%eR3r@E zbM`p%?@N>@7O@2XUiAa`_cR)#cD&~W9wDXzB=lK6d^L!JPa-fp-ow>rCMIfq7AjX` z;*eIYD5evWV?0VeGi0J z7zNZ}-(yyj&_5d910A!|d~W+5tH5~7>gV@Tw-Mfxq*|u)HXNS)g6(^p%b~PJrdi0; zZ{Cv<#=OU$t76D?!@Ugmn6XWPd5?X$X5CYU{!zP1b)Y@R&_5d5GX{@!qCNk{1Ych}%zD0|7tdlbrH}#8lxNNl=7|T} zkotCp+6y^c2+U(vN1;~OWZ+o7->fIN)5Dte_`Bzuf&8V$B%p<y7)F@& zpmT%`2HUtC(9C)ckd8XYz~z8u;BpiOE)kl6iyOI6L>OF=KS6S9X-83UAQ;v^p6Dv5 z+f6?tl23hD_K+L)#1#C6aR&lm=!U;&cO0|UOnc1XOnaE_ai{}BJxrKx{GfN4)@jhdHgHLpU=_i8o&Q<$3X)oNa**ZfS^ z`qdovJ%*YG?0dN86PoIH4^yUBoy~fD_Py24TB^Q7t2*p^D4!bkJs+S&jd;)7cn`sQ zZYd|uCcH=FFe@>$0rox3&u!mBGx4uv-*a#k=D85O=RFDw#(P@-i=r{!vzosOyoXzT z2_2lnJZ@Hd;Xp9sJzhu;nx)S399_pHG`uIezX9*bhq*{$vVafrv{chVQZe51UOz*s z9D;|kHT$0B)NAfFgw6)p_i#9-zC5+jy8@BP6ZRz`_C0}kPXJynf%=|9FkE5ov;lS3 z$|2hxl(Q5+x{1$X4nrB)>Qmc98QH?-C8Uf%ysNY_I7F0jGs+;KXEhcD{3nW+_Y~NV z-~1fve49&^_ndV|L|M3x&m(+ z{PX@D0{+Ps@h14qeP#rk`xHH-!9UNwB;cP{Qbqr9)pPvjJ2|1|J2FGUK3CBQnpArLkC1A2;0IFejo27qCZ{)bU{_5($BQ0_eFCLr zsg{!{>nVfq@_8IGQ@^#k?`K_Au(WsU)9cb;q1yF!x!A z(zTk*#UpBxPxQdAIufBK^rqf*nN|}G{^2Nv>nSbQgx{6*ltC@>xs6D;tgfmA;2)8r zY3K_`_U;tDBE0YT^F34%h<~Wati(R(Q{CL>eU;^N6D7(+EFqr{e+2URjg*Ll=bG?O z3qHtZ+Vf8mkW-%z63%ZzR$<^Dt~g8PM5oWv8qqY#JfuA(VgD84 ze6Bcuubjpq`xN!7H;AM$DL%_E=!B$I>@_sBKlsNOy)VO93v_n7H+|jY2y+VgD+yh{vKO%mp(k5c0CoW=WYMWSB zjAv*hIe!W1Lt~T5?zPzZQ@Yis6mOyNGmJ25(foSt>%IloGS2s3V%7~ z44hQVOpRhcDy|svn~{mQ-YBGWq-}H+P!%#AN_*jGg>!xhT&uL)fh zL`Tniz?=5z$Z7DQWa`VX(eY=g+kIu!Wo|@p!+(wfM>uX!E@?h4nmRo;v+91C#vVB! zDJ+9IH)IS{UiX_3;0GD!5aMm*dL{w>QQ%$(KgXok${P)f#|3*9*<))&$1GBZnK2Y$ zAbZ_9%66<7@@^K9Dtkuy49tnw=L5Wn8^3a}F)4s!7R(0}1(w0Q zJIUkSN$7+iZwgEZ@+KqqYW{m@CO~(emX)R%xf@0Q@ev{Lid47@?VyZErj1%99*3qz z&l~CKFi$F?vr5GJ`P3;nsjUmT-j0dkdRTCK#-ymb)}Xy}TVrg&kxz*h#kF59oRb|< zFoniVUjJ`7egemTg#3u{VH>C;Z$oDV_Q`J>j=xxOgr*9IXmNOk{6}@I5=UsF5f-;Y ziE>BEzA@RZXxTj_Q%;?d?Rts^QXaXbAwt1TGr&!mlQyA7hBtqs5S{TiXm1B4?J9@T*a0UjB0y=3**SV4jg=WZ zea}!LY;Fudp5^k1oo$nB6DPvomO186ZF@nus4J#JffFH|6#~=eF=HU&zyu7%8dT8wa;eRrC-gC2f{^pAglZ z+1u4q>U|7xyHVB&u1+HBc2b`Tsw;XNI~iFTUXGlTDeVuk(uuv=RO%JlD(7O>dplY# zKaE3W<B<>Z>C%#&;0l zu)rHxK<04}r1r#5q z8tWluxV3YxQsij2^A%*p=a+CbORhD}ZGXd|fKvEjgToO20YRzo&q$A`Z5}3~K5NZH zT~FkIC?W?Z=kOQL8c`Dwzxaeyyb3&s52iv+V($2?`0b{><9Zk{MzX87)O$17^?Gbl^!U-cNs#9&PbHKc0~Ow3WZS z&96Vu7dnF}^*&CIL=$D*%oQsoZLMBTuSr$MrSb1oKZfVRUm_(ws6upaZN`{Qtux?T~EXkwP3ob7NGmMAh^P77Ih%Hae7bCJ+rT?kEm}F)wipwi>PmV zs%WEv)|7?Etr}^Xzc+5Xa_usPq^*@ zm*7GXq(=nkU0AN9_8;c5QC*L;q`H-Zgnm>-9{1nljr!Mgm_O1h`lFoM4m1G{^R_|5 zRe14cj(G}km?Kiir$~zT0dC4dw5h-3pG3)&ztc5}GQQ8B@nF1yfU=qWU3~=|-6=x8 z7C{tQkT}4L_97}#a`sV_M?o#9{7!oL1E~A~C{!B|gcG1mc)aRh)L=k8KKqjD6#SOd zXCS{rnS>q4T+K!J3?c@Wn=z5=4Sl>ub^nCVQg3R4|t`L3LZyn5x_YKMrMLtfNOKTECE*$<$Y|&c*<&9H>?FLKI}*Abac^ zye+Az_eor~y%Ir~tIf&W4+(a{XVPn%6n4v#BM+R;MqIgH-2ncZC&y~KuH=;K!HBahn(FOQK%1>i~y zdmbC}5rNupPxV8BQM%=Gh}lvieml~8x|lAoYMz*Rg$t|ZaTI`6lh)97__$F_4DWbN zaEVt%Qx;7s+i02QNpvgXVG=D9lPJxen2c!c20>cdDxO5EI2{P0tBIV{7MK>$yfm$d zmLZlAPtclQlSgsY!3QS~z}@7D4CuLft;$es^wbH_Q%CVeJvF2Ymv$1btq`e_e$kev(3Zb&PYu}{ zXBfZ`7-^=Idi!RMayh7{x8SqX`!v!G!Yj{LJf9OQBvFJiEkaXQ6VN)l(A!z?Noz0z zilGn_;>F}69$xK*To-$xu`2%nkN8Sf;;*t7Y}g#}T$s3>o4hwrQah4rHN-M>LdaQE z!*2BT8YX~V+iH>8VoZ*&5CbzwH0818T2m&G5JrUe6@v-GD8oH_Kb3gMZTAY|_G`ou zu!|7wtwg-h;mJ3eL|{_6hQ88voSe>J43<*p*))W9#ei%=uJZ7$WI586(2NwqOc|ah z6G=34C^sj;?PIb-xj%(nKjP2*2kcVPFvulekjxzLtR{p!@^>x6kznCB`H<_53c2pd zL_r|-;UA%Xji|9#lkZV*{i_JbT8%&USEb%NNGc%bB6v4Na>Iz&h}F_bu{b^w3yEt! zOI(q58W$}=Z>4<)Y6S5;t4xy&%W5nrW!~ofcPaKNI%)m4jYYep;tiApqe(1CW*lhu zMyD%wG!*vVS>Leh9y7{j78~wL$D<{q88IJ;=L7L7(YWvF>Mn+OSBfxf6d$+xO0;#8W9jQ=CtgH$RJX@3 z$d`%;{tn0))wki5rebWFnj@o9nu@m?rsC4TRQxZB?(JIT~?|?I_g0E)~J9y7jru#xh|*fX;jdeBBXHydd1kKcrB%*je$1!Ay%}( z0ki=Xj0T5u0Gj*+8S(xnp8O_IUFlo!BhS z82cS|QUwM;caYHm{6=vP(`Aj04f;5Tqi-?JGjNVsX-ChG%te1<uPf(&*au zTL1F0j4cb1Z&;VHYY@fI7UeHUEp;x!U*aeIlNn}l$je0;TCpFEaWrA~*j@2>gLq`$ z*{xlWOD0xej;&N*y|OK$-&moHjZ;QN0}X&^1nWGKQ6Lrq;zDbR{Ap9%lRI874?V9x za@SAguBV{TzK1N0zP}#6L3oJ(eMF-RT^{pXV?T}m7LPS(G;1_6O=xTu;F7p~#JKap zdutQQn$=fnN2Q0>@)F!cew}Ak%(afLAHwk|$62m5noQXDXC25N9yZ2eBE1U}>9iEu zALmF((1&VssKGrRj-o`GI8Zb3z^F&{Uj$RcJRL(oN7yLS z5XFyhyqQRHg>)s5GBoRuJ1JQZywRVy(*0uMT#g1<9J_W%23Y0HG2e`a_uL~0K*v#l zNkPEvw_~yq{Ka_4V@#$I5*a{{h{+dCZ79W4{Iz;@TQlDS$#XL3s7n?Nhl$2Dd{&+c9)&`&4 zYSSy)Vmtba7jEIlpTy^*Qc{Kbq5tz?dXmPU@&hGuj~WmOP0{I666%h>XcFrBOj!|4 zB`cz32{gHe_yO=1c*sAOD^V z3Jm@Thr3Dj!{|wTig_T4SR?dn2v@Mq7hI8v6hks7g~k<80A!^iohxYRCxk4Axx#vk zxS}G%&lSlOU@As{)H$8Fj`6VsKQkcn0X^`?bhuG3%wgb$bk|V4TQ-V!VuyZsr*CC5 zvG(AX7@`w?X>&)v0hWNXb-@xyF|b7B;OB`^T9RS#z7DQ9X5fmC65B=`W3D)aC*}%# z_H)JS{?AqP6qYMu0h~oKa7OAJ=89zI3M)?t#1%qHdXq;3N)udxS%SG@Ioc7BT7EEB zV13c?w57n)GHEDQ+T#PuOx<`|Svo*WE3dt9(JkaA%+Z=WfXNm!KdnI0YddI4#twjx zHNXm~aG0oxP#@DS5mCh^*G$+N#Uw8-;Oby>EsD{#l}K@n(6x=|iWpNQ8M^>L5d4^g zFbo>}g<%+ah2gb#ba)NA5KZpYc9rn@5m>!iB3fX6Av(lI-e4|df#xA(%oauP_mXQh z!@W!>)`pJS0h>cH9NO$867P&)65*^$3>hYo2*ohbNt})Z1h&0_zQPw%Z%$+GsQq?p zA>QpJNKi)56@Ce*>Ve-~G@0R-0Jlr=OMAw)_zggAU|s>aArzR~2^v_%NAVZ$47zCznZf}ZbKk)V<#ZIaM-@eBn9K$G2B9Q8Er>`gdcGP~mjl?@L zJu!2TD}^&}R6r^Ztxlp2R41x~AAM_y7phQG8h{MHA)svLRjvW}rPw|3yKCmEZ}M+5lHSE~-&McZ#!1 zkAp1+3UST#CTO2qqp^>QAQO?X95L}~pNrkVT-00}L}G7&;YtHo-&~yji6*H;YxPff zpbu!Ex+Z}SP_5b~0j@3ymLOzcXAt6V`B+1>uXE92VmfrzUu`SiMYRR5P*3!vIQ#TC z04q=_SYLTB)9Q_u=Xz6E3&f3Cfw+i6-sgmPHzQotMGcvIlB=7d`dok7O$Q)4pb#ty z`WMzvhz`Y(;bKdBDe$;bZ_EG3-nYO-S$uz^fTFqXs%>I7(Xc4ZC^Ip%7G?E8mqJUU z(xfzhR9d8vm!e2qW8JpsV%f#Q>_S)RqS8gh8(>zVU8Jj2W)D$nT1r_y@AsUU=hV-VM=m-jKcE$ZL`?nh z*Cb0iMKG}<_aA2DQGlBeGH*@moOJDwoo0r@Nr&l1ke80n&(hs=;~>)l|A)T*%X6EM0q?B^X*0nU9@0!|}~>0@{Fg;$sqdW#rP9opl<0@2r29UOO?C;I?CN z5rr&~-~TC?x44#WCP7M{ZJc7W%imL8$NNah^wE(XVsxa7(cwW}X03ENI?_#} zqt-2SVB}>4QF^hc4|!PvzvSJbJ{&qqR7w84Zj{k*=z+j+=uwuQ$YQh%Pg2}zbLF_- zThA>cmtLbS`(Do@T85R!fR@#xC6vbFemU}T%Q9ulGR-Y}8FV(g_K*|D_2J@)x~qX~ z-ds!$M;NPpJYHK`* zcqY;0td}$jf%$eI_Sg zci>#%EJao1f?a)a zfv!FvffQYaSFsHL1ZbuK*Dm9#S%%l3E!*dg%yAO><9}y5ko#^R-US`{=A4N<J!LB8)&hJc!%UymmkRRPKwC_-wQHQm}-}fAvqWfb=gNf>44herBpru8jN9}0``q6!O z=hE{8@!SW`+voPoImJpBnO#!_b+`lmU3G<>X3167t3KLqy>c6(yma?pJluchgRF4< z!TsmZt0VUvrk;xaj-yxokIW8}iS-$|V1Cfue`!LY09|s{=g>g5FWK)$`9<;E7|Lw} zP-Yatmo4xHKGp(nU^;mNtD*vK$H2;p-yw*b#c;D(Lx&(1QsUGz7Vpy#?rBTKeiQ_7 z@r<^Ex66RdNgi8@M~Q%2AWp`SA?_}U3=l0NjU7k09}S#HJX8Vy6T1bxkuTgN*=~Mp z7PHsqO8y);)aE}%Or1XmmucZnoi25-cDE&!_M$|nE{8hlvs$dsLnrau(w;~cGku3L zc}xT%*}vIEak$CHbH8$8vTt4*S<*uj z@=nNpZ!FDjHTxuFsk=$3m>-)7bU7p(&lz~8f93O8mEra^Y{dem_KaFUL}5~J>geBg zQF!db{D!FJEr6x&#u*lbdj5M1(KZ8-HX^@f|1Ot;3b8(RuOJROu6uigFk`F(p84)9 zA~5bh^V2s$xLux%U5uRY=wEzeFr8_+=`X@k(3|IfjnjMYCuVy0>Mf8)|LgR=8JEE{ zNAJ0>f!?5ex@KQ~yC969Y6p7rZm1>CfSI-kT=Trg)O8fR$7DhU2@hNXTJ~l(sRn4G;spfZSZaY%^%)?>S9O?Lk3%>&P9P=FQNclOj_+* z7vS{`I>HYxKb7)MhT)XuDWo9_-72;Lx#{!OINuQvV)0qCFPI&$W#I)R@+CqU^4>#5 zv(H2tyZNkL;J&~#nD+QxYO9N~cCq5=3iLYMpDqL#Vj$iZ?q5&ATFOlcBrva;gnJUDqOzEs-479P`pr_>auavf8ZxY_D#HI-+}Iv zO_bGB5FjWTpLUG9sN5Qn%__bmvAkNAD=zK90;??PUj)RG<$TI=KhngAd6lZk(_hh6bs37&_(;V0k;or`{F;4gPQduM2Z_Oba2e7R zPk+U8Gq~<%?2;uJ)1@7TibCS$5?j!vT&Gcf$Qle8zQyzEFd+rGLqgcA7%y0iHug*S zB5!=FN0awm{@IZlK=)mi-iEC~{`)Rp#4AxAav0S&a^EG5&%pZTHdEh1qdq0DzQIRV z-&h>6+|+%ZCmQutqjya0+l<#{+sE<(yLjNpqoE-0^ISx%M0c{$;Mo28gCfI+t3%Ia6f44TY#G)m*#3PVc zhZJ~ErShht&!DK9kEw&9y!D&9LMU&NRxi##f%6CHqNppC|2;uSpB1lzieAeC%JMDJ zgtXd$RCT+|^7w@;pe7@WX5W+*AfR?5F<3yofi%)rG%JCQs5@-uQIbU>fcADsMIkBL z6g_Q|T1?MHck1-KNo^%P$D*h@fGm357;1)|SKf*OyKr8bAl7=!57g&CUXtd0N|>G( zP?iT|+LeQufW48X+2`L9K)~ma7)-!hk!B*`OMf;+Kw9r5`_+6`ukK;sfFkf^ zC#{8Y0`6bkM|u|bq3!D~-5w;VT zG+=}oci}mxre4iqOE$s8BH#*87AN6aH9*JpHJbc9Ku78&t?7iStt)evCKKg-_K#m> z4mq9*+`>8NLfw8zxKUT;IFpB}W&h2@FPBdb;FlZ}D@>v*b^D;iVQ$V0_zqJ`u^$-U z&~XMW%HbD9*0$MaBkSK1_y-^$@Lj~f4^0c)%iCQ-ZSQe@EBxmvu*%4axWNaRg zgclpLfthkP5D=2ul)Ndrs>SlA4`wMsejon6mGb60nBeLLvYcBeZ)(v?YWBH0Z;hq$ z1Hoz}Z&tj*+*D3kdKv839jR(pndJ)}L6&96qS+&F3Sg(x!Ck@PXFoEU#82OYO^Kf- z^D zhI_G0e}L2LsXlHZ_8NbrPP>YZc&efqYL_v4xax1m235`NgSA2XlDUzF^~U}=vpp>7 zyYM$%1YIvHKVDXjc8-O!o_qoi?4!oFml+PA=R0qB*ofKD*s*AjhR zKdxo^eAM_R^!e3f@RL5jaA)iF`Kc(ZYJY>1TcOW;Wunk4{q%9S5azf#olethUZ3-P zf%LiWo1@U@Sya=Q=CBRW=Q;mDkuU?-Z!lj_*PR_opNBt>j`muTsld~mBUqnbc@C@G z-pB#_@A?3N@f;Ex)8{wfTeJH7FAxybZ<2P#?KAhk*q0isk+j4y#Bwy53-5SWtWI{m* znE-kD-uc{|CDe;YFE4k4@Dh4}y!?pL1LWn9NkU%Udr6SclJoW!$jdqY$^zu&wVWO# zFNfS^$jc;`ke6M8t8TTtY=3V9dAVx}QGg9XU0(LuMUB_x*eJhvi7&uw@zOEdL0VgafU80uOb*j&uo#r zTtHI+p8tG)6!OwRHT7x^+W>j#BwVXb*KvIf2E6(}Tqt?@aS_YQhzC z6hdBp8PEJZMDTYgd3kLEdHE=T3ZDNEoF?RD{!d3QFAsHXATN*CTN5-~JBj8@U)uO^ z4KQs&+m|cRtD)rOQjlZnr8U%eU0y!K85+tf+d-XzC$o)tRfY~d!J5n+vGKYy2{Wm1nnLi5?(wk5)Z)t@{RDnRM46X_R`wRV0)`e59rboz6gDJvYo@asKQ$jus%sH&hm*U zF$O2Ui7DMV1fXjy#1EkLUcv%r8D%+wWA2cJ)+bM+bK>y%-99W3=Hs(w-+gs}v}u1$ z!|B||$Ou_5ix!6l>?p`x>=!<{a75*nA|3sgTZ42JzJCqzy;H4sIrrfx zK^N|r#!9g-wNSn4k^|cOvYaTzyR-IZN!CmO7K^#%7=JkBh}QsVZ5b3zQ)jK9C49P^ zmaa19i&YWJoIiArODs*dM|GZ|-{MX2p3-&`ElktSRXD2TvKn@s)2dN2A5O&UMp$jE z>xyi&F;uPrA}^3a9!&PE?o%7|cmY0{I=m}Qh`7Vm?XB$atu!+z`Bm?5xCiwP??4N% zM?x;bZAV|J6Jzu~Pb3(p%1%A<1o!!J%FzSTvvP}hIom2 z#4;0QHT$Pm1~9}yBnHp#*CP#mS7+fhOj^#z>=dCSh&q)kr)ipf31z|}P*BGP`0wU$ z9^HSJTS@*qWGJz*8*Z^?Pv@F2e^2Fu^d8tHBt8w|Mm=8oe6s2B{`|;e9`D^~y1?CE zTh+?$uYzr^z7Bg|%qCkf-akXPsMnsV_x;5LpttP5^B&{Af0MFw7X3}*eE@P(_io`n zw>*r`n*HDv0o~jEs)pVBJu?2IH@2u8!94&NXJ z+{8=YSGx1wrcN(j6 z#3TuI?j1qH+d9953RfPwQN5({e= zKr`hJ%}5ebY7ACplRX2+;uT_Q<{P@0TI@GVI!d!7Q@2GHlTrnyx-F8)w#YEHMNEW* zDUxY2MeZTXp6NL8{Z`U3nMly5wmCZDAmefeSUN`HXGy*c<+gU$Dfud_ceN0NEksk} z=-Y-}#P0RzWzR!I*e&Xs1pID2`ZokHzy4{dU-Pma~UyC23E9koSaP4slR_{Zk(6`=Sbe1nuby@9%>N;-Z5n_gW3OTKBj-9X-ag7&MEy6Kc0N?>B_Lf(|pw|qoC z2zk@vej#t#;4>2y@}`ebvhTadyjyk&EB?f56;&4LSCFK@O#_dg|X(y8Xg zltzLn$T6%qfu(GO&=xQ3CN#a1QWmE zWqISJEW43r$eRwxPx59dj|9t&$e`IjNC}WPzaUYUH}eyOym{a`mF%0_@CteJ=F9({ zym^5p25jHtu4^S7r=Y0n#7v@<@@C2?l-t``r{ss@@mj)!@}8p5w*$YbQr^6{P{^AH zbh<;{tT0NxyAqjilb;}Oo-n>R>B|JY5Xqan@Qr$+JLC=|e+~LTvky}O<;``dJxJc1 zgQS+ooA$`pq`cXU8j+zXd9#7C_~p%C+nbR$G(V#N2tFh}1_AKu9G)qp-P;q)-asy2DI_rRGV zg{VKpd#f$gdqcFfr^9?+lM4&LzRQ67T$_?V7aPUG6>ry+{J(88uob3LEFDn)0Y%y; z9&%ZSm1DzNPQ-w+x=3~X*E$P!#Wyiii5gIbXP&1xtcxpXB^%q$PO6JgyjR-@lk5kC zKN79P?tyQR!8)IA5pX5O=L}H1^TmNVXhB@6_aoe7NEU7uMU70Q2?HN#lvF-4str!i zsojZkNqKhyC=k8IR)=jE?eb>#2+P6doN5JIUisxh(@XY&y1sP!GJoh{?U@G%VM=0j zjzwhR57~PNQN@~Et@uXAq`f#4T42ip@hNu!Mt- z3QC%oG$D9D3%c*~w?&Zj$pjzqH6l*>wh?@UKAgv+z_e{CJh~nEk||nxl+FAKe>QmT z>J7Z!19(Ybpl!!IE`@f@NGuIb5>SzYq#McGfE*dl%4a!Fq;C0!c;oKl%^x-iW z>r?5Y&qDG}vyT}LWLykDD@*YVi%Rv3j!N;ibtP8jSY3$Gp=S?{VQ*X48z(?!+fqF} z_;Xaw2}rN&lIpqA#tDioCjtfVLI5`8&B2x<_kQpQ&d2vEz&r`bHYM?WF=tQlrrGik z@R!r8JSnRJ~cY{jtp?Gtx9fl4g;?Ymzt!+oG zC5loryU<-3ZR*h5@PFYd3vdlp&pkfh1|i5ibCRI$1|~GKu@RBw@_xlTX3^Y~is5A} zHocLz#Y=k->n|8PDW1`b3vdurs%LmHn6kvWa(-+HO293F>zU@qmWt;jK&YXCi{EPe zgz@4|QYl3UL(4rdzeiY#Z*-+v{5C0dFC^&}3US4qDaqt$pp~Crz@$)i0c#6M7#GI& zo;yB(Tov1T{QJ)!@r|um>}-o%agNad=!-AtZV7C^j;DJ?V)BQ+cAl_kG$2+HxrE;E zPoP23xRy09^}~AGd$b!h-!zt2(QpVF%QTRY37P@%g4lufkjN9D+o09twz32Y)v2il($jjB!icRKLkZDxN`@cK3A4^eb5 z2@Ul`E`QP3KeLNcM0^oP0L3FW$D8*Q zJH}mx{i&Dpk)h@o|6<9BKcB77O!mRu3pMWY{^}gCE7^1Xv&n<|>;|7=tLh*uJ|=tm zRO1cDQqnS_*K)WRU3k$~z=u}%u7VAsJJ6C7`q=tYBnv9Q}7)#5L&777$rv|gE~rlL4Ji^6ZMQc)C^=SbWr%rS=c=wVEzoE0OpE| zNMm*%8Zc=gyeNM}cC6StP$`xcOEml6$ZsZIxw8aA1$zhjV(Wl_{Gfn*HA7xKgp6>_ za58?4R07=wasR{xbm3TPm1chq>2)yTw$P$z>OLCXUsMM-kgmS-rj+(DR?~@6 zX$qw39kE%q8J$S1W1s#c^dr)8kwkkvkdlfN^p^yklUeRehv>+y78%Mkdq0t(TGX9W zRqiaK45cDNk!C+mWGIyxO3Ix@lwq;Rkf+&yLKiDuA5$0Ic3QcZ*ie7?PYI&k*8a{D z^9|mQeT!y9~* zpuTrM`DPc!D8 zO>Gp#34P68c>xy>YI?bwzM^9!!ig@R^L+-PjZ6f~o1 zM576UX8(8~H#&6fyfc$%c33Y?EfmG8x%k7PI3+i1IQTFF|1-gtSzvk%&$C^g*Yc=c zp4SS*Poemsk%7b_@k7Qh-b%zzDSj#zl;JN%0G>9=r>PYSD)Go!tMH@v?&Co(gG40v z7)<-I+Sv!1lrN}9UU(q*e6Fi(F7MpvlzffPgzAXtyZ3!|@a=?yZv#2_U}SBo>jK`b z$wAD`=bLFVM@4z75bXWK5k_DFov;xh0~5-U_;4FIZaT>tYYE4|no_-+QWC$`Ya&-7 zRdfqgloeP}SL8F?ig?y*0sIaEepubiK;VQ7!coN$Apk9p2S84xiHE4&K{lJ zIT;dwO4FoAynB}r2s9xQ6s=3eAwlRngyEuE031y7k`pWSc2m#!LrUOcmS>}gnc5w= zZNayQQSn*^orjX^4`ST$aY03x1gQD-5~U7wr}JQW%9J||2#A5OTEQcllRzl>>>E&s z1RvhiM~h|Ij&k&JG6^(%<>qi9?-ByhSaWV9EJoAh!(hZv%@Hd|gV7iP({kgvDEIsC zdSgC@-K?%WBoR7}?sXm_v9eodLhNAvMcvp;&`;Bk7UQGXC9OE+ZF>^bKI z%+MY|BK6zujxz^Rp^kbR`9ftvNVAVc9unGkF%b?*0|{YNw!_SGsB8zl!p}i@RQOCh zRTzN^%@em+y~ZeO{+)oQ^N4jG%`ISmq;sWTqj2ptNHN4Z-z4C#slT1p@va==B6Wpq*FX94%|@Tn)-2q+S9!xhd6 z@>bJDja4|;Z{SbQ^kb~Vx!suzpKs^EH5blO{K+Xnwp2XX#63Z6vm+F31O#hN1|fxr zXNUJ=E|yh@*%jP3K`1%sgnRf*oVc;nnPGhhmjvZpPq{EZqeC;PP#vC~8Opkv2qoO9 z0DfkELRe0Z{MivI|izH zw;Kh$^|WMj1YzqG9*6LCXFPf@0p6@pJGjKY3THiWTDkMDFbNl$CkL+8oM`-yk=tWG z>5trE5#d}s;+_g8Wv3gZeTW3|I#D~K^CCBH6Hr~=T(Ht4EHTZ3aybI!lH#=zDqEBI zBKVZVYO~bu1PSrjEs)D|H|PVJj&2GU5?{#WaFfVCbwC-Iv=V*24@?+`-d6X2#k^Td zcj5%s*d7fGQDaZ4F)EBMnyD@dgOq~_LDn~JMwO?bN~HNkrL0v16CO5Ii))7IAiM_T{XQ2}dp~k{ z$JKySt6hD!rL6n2ZK`{FcD&2Gpajk3`#qG&T~ZRO?y%q{Z`b59mxsS3Y3p#ydqm1) z+>X6|##h8K>H#`D3lEz8#k0UN2q)9*Bl|@Y?}4QvU-?Av5nLGYVcBr#PmH5wR4fB* zQA_V8#@+&d81j=Jr8+G8c)-HR7S{_{cskq{i$J`U!dVEIMd12^1J=8+*PXmW>EN6K z3=_=w6?O5?yI`8p4JMwPw?rAlA96$|vb`m;WvaJwwwydbD;ANUZfZ7pkrc(_CL@iW zGx1!;&)8_|ag%{YUL%^kz~ydvb6O8LZAaQL64blgw3L{0B2&8zDvIC{FYoUEgH|if zLP1I5UX;AmRMII*c5hH}$o#Odx-71cSP;e5n~HUAtk{Z$C^pz!>~>SJ9rFoKt9w4I zmRJ#qfBIsTgNWr(&tdOnh93{Uw~2 zo(3Q*skH&yS*2n9mxTCilEwXeN}6WB5E+nCOp?DF%v7vVlk}h5eIEu1)M|?NYs{!; zm%H=OWZ)eR!HJ7pldLN#00HXGv!G0T;Mcg=HU&JZph{Wa==Iivn+qr>s*dNX*AgLQ z)yLxyQJBYE_m3w~-K=^3Ry?bzP&o%3p!)WrVmcb$!xI_l z0|C5Hogx8t6JPAd-@vBiFQ>zlRDNOO6BoOw)9bk2@4L-B$NJ6zJ@cVGY~ht5Gva^y zM2F?w5qn{n;hcAXIe_fWa)R3^+&aBUlPz)`;n*vqlyQ$ezr^ zW4SvWe~C5vVM+tmpjS2ONq=P@Q8pJ$RNxbK3@QUhVMZDxZ{_gI_~&0x}f8YsdXX70`(P|TYyLU2iZVR=&!z* z0g-ILtJ?l?kQ&Y;o19{CD)Bl#@^qAPDc&Un#XKD)e}$Y}e+BznU0rH6?Br}z7_VZx zhCa6*M8bz*TE0Yk)TuawP0X#63CW&^iC$9G+>n*NfDEEa3eY zQ3UHk(axa-#Ht>t+(A&2!Z6eGsROK2*hbWC=Cl-{XVc#Ehofh&Bx zXLP_!`yHfGjkfGlbyk^yBaN7MAfNEHE|OaWyE`TSu4n{IU<#z!ufvy=ijnN7PW8;P zC6%`aZ{gfC-(s*at*92fWXIw9(m{UrMw%}fkzVGtRf?Zzy}x~-<-g-^e+F@Kg=9pq z{qRru+g*SPeyc|>w#eUp{2Ht0+Aqo`fXvPK+Yinpo~8BjCjIS?f+fIGX#gm6 z!mB2KKZ-ZwZ%-G+ZT{j>c>Fi~?I+CQmREynE%LV?nZ#6EjQr|PSaAi_=($OM`}!Gz zX3hB9C!fkRD*-r3vtm3-Z$D@j!6a|g-ySQ9@ADT|xi~cq>g0c!zx}Bk(B!E7?OE4g z=6=H)5W@emzg?S%ioyab`se)Zj}i1|UN`F!xnl6o``dF7sXo3IJu2~f9hB}y&yw_ipxNa=4sLvPNp z_}l-4ovnVkyt(Ey@VEcj1LfQ}=S?(bGJzRUBO4RwZ-4q~wh1b!#Az~11AqG$AOx&{ zWypl{FQWsjfYU*^=KSs7p&$uuLxS)^MHBw^8$^ZYafJ_e53~Z_LMqqTw7-2ivi&dh zx6k$de}6kJCtyE&%l+*e!3UVKnEmZtZf?@w{>54@(L#Uw6oN1O?dwix!ry*5Hucfe z=_vf|XQo3gcYH-3(5>~i&%+)En6|C)w=cf}H7Wwe?>OF=f)80O_$ZXW zUAa;E+h0KbK!5x1T^SZ;<6eAgp}#%u(-!&L+iwh%x?O^0yb-h{@Qi z*a!S(awRtDZ@*F&gF|so7k{yk{`RvuFS!#pAZwHU_V4dHLU32@{f2}2gsAi=>j zyt*0WZ@*9$!0^}#O!NYc_}e>iZWj%6S+YxYNv3--6KKsvET!iPZ6EX#A_-+CKH2jMMAkg2w>JM~$ z%lz%{Vx~s2frj#<^FZoj^S4g}I5l;t*_3RVzx^h(M?J`!NytV03G8fj6?J{<{O!My zeJ=g&m3NEc$KY>YLTKDs)J$_4_}icAh+=0NjcHF%exl?0$afLwZ@*0y!zO+?=FU{67lUBA>-TQQ9zGxj{&V(7vFx~wdlka``cp-LH#O;P{g;B@7V|y zt^#jUg8Eeky2Q7Lo(+F{241A^mgIT4Tftw528wUrm;yHQ`6xv#xs%J%b2I+-1rvy8 z8~EF)BC&Q!FmN6|SOP>2U4KJ=JGD_1kK*ELdoE7N5`AiVxtqSS&BrShh}kgj3dk_W zw}<(Q)}w>U-Q;`@q#C8D&rjl()3f1kFT;zhmh72wcQO7-s@+FN68n6VqR!3bvh>`f zzkTf0f@VSfcB)1+njmQQ1MRrcp=)pGZ>JWD;wl$^OB4^?@c(uG_Wsv^CP(dW4;zV@ z`yY=(2>;9e_WMVmqQbz6{yBg9nFRejg5HAo_IJUOBs7|jZ$F*m+Y=z8pz-zi_SLtB z@V7tnYnIinC2M~7E+G)+ zC2MnhJI(jh3m?_vx1W>DHbFX-cvEI+;BUVXM=nAs4?rf(z9=lf3RsE6V1GNek=NY` zAovmP{xINS={*mCY}R=T=*`Rg zg#FJbT$_y)Lm{>@z8zBnj&Cnzoxt(!r6J?nOJ#g}*UjgcV{^6N~_Nm)Dtq zO*+|KQ*hc0Hm{{cQCKt*DaQRH#APdpaZk5Cv~K?9oLeZPRnLfhKgfk(cSNB3Iyvy` zP<#=UtqgT1kezjq(Y4b>w0nAOCLZ+aWE5c~u7{(5_cT(lBH+E$9Ps`a2fSC-(yvas zz<_teXy(+&fcN2G49sCl2$&3bFB~7>fR90tZWXe`A*>hCevwxea|so9ArkAAJAcz1 zmi2%eh5t7EkCp-N-)r4<2fPE16!2b;IkE_NuSYWw4jBcgA3r0Y!U3Pr%7FJ`2L!d} zVSR+R&;hR^;5`OhqyD;rOvF|>;QLdJ-2-ZDfdk&C@o9bIa?{}L@juR#Q{&&4(r-y?5@7qnqPHn81 z`>|mEyVq3g$8jRweIbltBi>!F@u#PWFaBThzuW#GhGqZzbARew)_lDC=k=l(9E>-c ziiPyQzsh;Zy*M0MNy`PqySwwiD6|}Uj!#L)J`v>6WxvST;vJbfU5gVdWPK-~*}>V<4z9y-(=@hofDz9ujHtoOLyATNBIGPe8PM`oONa>Gr3y7L^@R`yzoS9 z5!y`D!~P8V3elYx6!rcC;K-pe7g>UYYlx`#w`2hfk`z;cM!fI~I5!QGlaV>d3xC!w zoi*}+qwLAqcr15k;xF~&1(@i7HRx6CibY1fCv`78eW0GaKz+8mU=87gcOYE?Ou%Eg zI}U#d;4fs{`+W4OuAAlusC(h*0|6YYUM2zRUik0?W{t1VB6Se>K`zitct@~Cpcj5O zR1u~G%aK{LclnL`YOtR*&H=Lodf^FS!5V~tX8(l0_=_2Y zS>_$=C@WN9nnnM7%IsEQjLQooMPIp41zMz@r zh#5Dw&@K`XEz#7NWvleY+>PmiI^}J`M)$&Bs7I9la6WVW?)}J;ge+z+{I!4(!VCWs z$O7Jf6Gb$;{nzec^S?B90$qTb1HJIvTAqCqa+>`&6eGsROK2)K^uo^(6%OMHpWW9z zVE(-ksZ^uz!WR*3IqJQDYg>S?p}p|a@Flbtz8Is1qTV08U3lTyZGQJga;S%hdROv) zj#KjIM1^5D9`>ljDBd1qCu4)?7PV+3+sSk!O$^T6i&L~dzk^=JI~}0w7{|x&$>V9J z#g^f08X^vvtn${hCu0jK!5f+Jjr80*`XvNq0Ok$> z1`{0nx918fy=VgSH`h+sOlB~P8UZsfHGdOP$M+aa(SW+o%g-%V}mnzSm=A&uo?0|9SV9tM0zAm}#*dH$)8`$B#iQaf) zeU3e8O%y;lvERmLkBjdSR{JhN!~qFGHR;(>6OW*>3b?YwIXF~V7FD)wo?cluRuV0kLZ;BXb>#N`xRGp8BYcc!)UReDDX(d;ST= zio~n4#4Afx=Lo#i{?uf`YoEID4#q3DK;E&JrP&8FTFwH2)$}|dl@$`H(nlGoB7xLC zLdtGJYOsOS({B<|+iLwt%^?&(!g%#EiPZN7Qa1G*fmGoAHw3L^#EKDk6$`xJY2Bjc zF832_DTpJ8)t>PhY{Ki?vjtvR>btWAu?84;6{?Tk-hf!07_Al%%lilut3)7GNJy!# z`H|{mAT{F+BG$92pI9!5RJ?k+MCwjT;U26~+X|!th;I2x5KlI^op`c!grnR{&-$j;skw_T6<({+cp8g<+hnoKtrK@vje`lf8$;hj6Dg z`4D)uxF5A*i&`Q&hc>9IpIk$?_!1}I$n`z>W9a&Z0AT(aI*<#8eLGgosl##DAE~Ds zso_c1WGtZDf0K2%L>)LrdWV{2)X|RXNNA*v>W5(pd9|c9i2Mx8TT@AGO0qhS0IW}f z{auiX!S*n~F2^X)?BDJVjr!dJY~C8$U#bI)l>nbL0j!*;)8ZNiSO|bgYhWW`Y!7|+ zQy58ahlPzBH_i^h>brTm(>E1*F!GrlaX5b+regc-Q$W(ci7uT{rOUmtitAhXHyZI* z-Gwgqui3edRToo+U*OJ@8M51<)L(V5>^@RIL-J@}#083*k03%bHIxO&Kna!N#VzFE z=T~=WL<#ht+KF)Y*`E_+*X*DC0Ad*E0?osp#bE)zA}TffpewQ7dhcjj!4Pm^*}nC0J3pvk+5{+&GcJ zrrF1f3~@3;Ou5rW8KOjnec1mjGDOJ?ShUzj87f7F5}f}iGE~Y8WpvOl`y~8#mHx{8 zpBhg__Ssp`T3%`4-o245U%!z}2fwz)K6ZQ@WFPlLO~O8o)OoJO_VMI2VGH(sMGB+O z)U=nxqtCt@J&N0PMD}qT38D6731NrY*?{mYL-_3bh7eG4(iuVkESDvH zu#Z1}QLp?4F8W01qVLI~*+x-^y4Wb%pNnSri?+Z%{t1?rw2zlxDrnN(Xpv^WiHSgh zX&We|*~9(71MK5v0!$_{IwY7XNe$A}u?Coh4CcM>LQn=HZ-M}m1u*MQ7gX|?z;eqg$Ja?P;{LWug|K`CikI$yL4BL6vTzQoC@xWM^tf$V_P1cs#$5Cj@(b&gnRN3pZ^vasCj~_(t7TCvi zr%`8bRj)MQHftZ30kWXm>FIv^c!5lfS2J!Ard1xLuoY9H4w=!=J}#mDYMB*twvQRq zY#%RtP8Ua-{k0n6M&g9y!5^A^#7@6;wTBvrUd~c0Zx(n}a+8I9{Oqj_OuinBRtrqN z#aPLNX;s7=I*#q*-=Fm()x$vQu3|#!^>6%0T`7@@R|iO>HW*0RRI5NLz~sv(Xe}dF zn83?yA5S#lbvKA3i1p(OgjWv}Uh8`6#Cl@7AXYa6uR?WJRs&-FOu#ByK&+d*OsoaMXdkyTQg!?I6In+;Q3o5cX+|BpF@~W38>yqz)2MwsU4s2okcz?nF;++Yeg?bl z%h05{R)7t(k0T_&`6htH2EdCLU={!x_VE+%H)0>p`=FtHya)QIN&EOie+ILCyb{SR zw~s5I@!Q8gk74`REy%9f-}(Z?Fx$spZaHfEcsBJ{Q}*!{B17Z$@dYA7 z)8f%*FGr7R_WEiG)Z}?q`_9wv@%uJeK-gTQi!*i4Q#yqC3}Iym2vAlRpDYBx{jwz4 z$8Q=%Q@H5up^H8#i(YONb*QtAqMf;@!(X%o_VN1&36l2l{jx=eBq7KE9Q`>FfmH14 zpcKx#+R>0GBna~bm`r4hkzh(pU?L1KH!_$f8v!#!fFb*M=}Cf0H<-Yz=B5!gr!kmu zjez+b$2Ou-WFHTcV0xRt+-89J3Ut)$of`r38iUdO$JHkagsLUIi9G!bNDnfkjh}@k z&lCX(a)qqg(dG|Cf^?ftR*Jj?7JB$vwi&OV}7Lm z01^VJNsQD3AN!FSERl*=yGf*$8A#dGz1KG+)?~)2MJ8WO9^+LkOi>$|U_(uKU2EV~ zfddRR`ybo=crER&6YKWt1hEcK3U^|mdWFEt>}>ylfVG5JqXklC`?z?qpI9G&ID%N` zF;Y`ZNOh7(#jCro6-ZrVAXTNVpVE+67cf>WBG#LCF|o}4W19)D^9{Tn$Ki~)|92bV z+0Z_o1~5(7$Eo<-z&_4Afk?YW%@Uo%_VL4tZe*Ut^-XA`zQ67aWgqW0Qg!?IEm=n= zQ3o5c@kSlx7(>wiRiWFo7|n6uJhNjEWO4XCX(YSz z;EZ>0;abUJK7Uv|_=+7B0uZppV3xQ^*;-WZQ*Of`f z%WG-0TLaOm;yiNf!GPq%vHsW?QN`(X7Vi!())EIN$Ij**8#yN=Y2~!z0B7(cV{~1a zhEH`HDQG7lXeUDc5zXqh15>B_p!L2^ctCUw2^}IJ&N?Q!Sne*uU*rBoXtQ#fV)%TN ztUm5!8--sGoz7iZJ+IRo$mh$$N7bDyh(a%@g32;c_}#mL04O1eGKE^?oZLK7&IM5fG)v}(D0AQe zohaL2>Z@;oMukA?l`c#aCuJ#;X_vKVzEFTRV0t5fk)HjuA&8%H!)TPyt_nkw>Kh?&QcL@Yupqh`m8YeE)^jy^(s&4<6Tr z*L8AvbBa>d?T&DT=MftmycaXa8SjHuaok<62Y$8z32 zhCsA~R`)}Q0ZEyBNd#e|&|%>2UkDo~WCvkGOIj)354ALbP21+MX-nArEwM>QVSx>S z(d;YH*}#U9B{pezEaz}Kfz5RhVPOZ7aD97}wSSp);Xp*KS>5N*-~N$N7xfF9+s-=2~6=-HMWJB0RmA?xoDlu6zZoiLOOwxFuS zMZ^8ysiwY+MwnY%?a9P&nzM*sy3q^zknS;&JEwTZ73~8RJFWx=65GUZ49vJY$THXd<;gnay z<=V=f0RnInO%dp1iYFaB&TwT&er_}kak@Mt2X}Lal6d!^l$trI`N4fYf>8j+a^GeY z=y9JuvJb)5R=>DkjO>M09@#fhmU5(lSrLn_+0Uy0YCPvCv|wKLviO7@z%e*SygPCQYlNZARtrcc!L5nI)MT{@kvmpW|K~xsr2nu32Ja5i_5kErP-&Tyoow)BocLI zgE}{2@PaxSwO7$Y1$HTtl=tMOl{+0~>Ud}p;7fI=85araH~;`P1bD{*>ZFCH&S+{~ zzlqILXCSBpIF_;KNA+v3PMvo#VNjp)3F=&f_94qTlw~2(bly3*QK!J=$AJR3h);q# z>y2*;QRgxV>Llhb%P!Cb>p!5Ni8}uQe4NskL&_ji@T2iNqZhkds(VJ*u z<4Y}5hYc0fDFc9NrcN2CQx%#zXH)AsPiUSx@t_XiSk4E&>e_`mb(UaSr{;l`U}_DG z#y1kcEOueC?E^ne0X@haF+s3fl6QQBW?#NRC)bA^K@x}f#(egQ@u?$y>LWf0O3pUE z^(QKK5Z@F;(DpYF${K{w?Y-zdV&+xc50*SoSF?YI(k2>*16iVRHE66tFoOfjYOCp? z!d(vrlyZI_9?RV|_-iKi5wf>^K1x=%Cvs){0t0}`64k}KcLf0mP5ajYM1An8=4sy# z>Wr!a`B#9MREI|=|EUC`jco0?9hf;Eq%6M(f-p(1T(47mRTRj!U3?NG?PGjz^cF70@nsm*KCOd~0bY z;qy_l`p|`feDngS)%aoZ@w;~g0SHaL833YQM)MFp-k@VG~AjZ)XsNxc4bR@g(mFntgwnPEH$We8ug^XTuo{X#y~xbi5iHBeW7XHjtKSR70uIn0K^2~ zSS-L=U5u03ghsuM<`!3i?$oe0?U+x0LX%Xd=nJOa>uYtwT9HFNOMDX4%Qe1*)3?qN z)MrdZ%hLd*+1r4^CO+*A6lj3ga|Bdsjb`76Z0Kpf@g!}d+T)34UMKO9b$)xiXi>Fc zf{qE2j`8Kr7&9IJf=v%PB0gx4pkoZGN?9_`^)ThTcPe)uaG!Aeqo6sgT z&8^e1Kb7wSejz%}5p;ZpvivPb4SQd+k6EMBaYrO*^&LJ@_LrERmYK+|**`@d6Ri#+ zk!Y15XceQ`H*$(J^Q`k@_tShvHzqNed6CEi6Vr4X9p)T#?a-R`VXy@edWk#l*{F=i zUd-YM>-=YEC|B@J6;e9T46)ozlnzTOg?a-;?aRpU_xUJMopk}DzKHt*F5f9KLoCE=3 zgGS}<<3>?U7!Ta2y0#^_;?=bfMcD|hAEyLDb+}W}ZKkYGKe{^}L@5I>+m=5P|#T{l9-f_$6oDXYHEL%}i zy{UVX6W3dPcfm+a!c@nWw>0(8PiUsmg0-Xaha3va88-Z2#6?j#iEqcD1&Esf`(P}h#jA*% zrz#bW7|}N8e_Y-uc$e5;P?@BS$*OBR;LA~-lMjvZo_vTlR$ZZZkMp|)=x`C5Q4Y5$ zgNMiPsUq0}Wsaap=kRD_(ute;roY!cY*a)R=!~1fHn7U6V(28g5t!gS0N$|jh=jH%O2h{z=v<+0DBh#h zb!EakZ^`>3Lh(kacLAnsb(C~P;%d|3F#(ha)dz!H(g(Hg5F0qxq91C|Sn7u%s77Z> z_pNl29Y%yc64282F7NfXxDs=$Ik-`>4CiUobxa0#CuwCVS~<3{;%Xk}%gW?&%Uy~4 zb5EslGdyp|MQyT=lQ|Oi-?4|XP}aQMVvzZjzd%WhC-*WufEas;xdNP1d+UxHu-)rC zG}x)J=L-Xp>a@CZsD$)xh+A6s;?h{Bh75`8ac>kp=~R1Ob82#*Np+cD!U-9kFVEMZdj zlC#PJ7K^wjslbWeNZm_RuA9{y0y{7sT8%(VBM5Xzf_Db;HI*6!r~gjajjMy>H7t4ehg13 zg&9EqdXlh32Bu&v4QOqH()Ukgokn}PKtlcw3RZxE8d2~MCGjv{*e!?a#kUa!g1I8jvM8T*spj12KpJZv*68IKTCwH(jk}L+*W`UU$8$ z0enyHIBC=t(hw)n3k$6h_RvZg3Usj~E}z1EYCqtW;{R#3s@%P?2tT^|pL7iw0ROQ5 z_vre63iSUS$E5#1ZbtuKOXMJ10Q!I5Kd=91H_-pKVEu1tLjOM#p#Pr^)c;SlPXA~4 zTbjDpuh1}38qxnN{^#{S__sCs|7sE!|B(K_hCoUEzsFB5*8fdv{leoKX#KA{25J3% zoddM~L=wj3(Q0sdD^WW3@2i|B}>)(EiTK~l6H2yof#(%xl8bANoHU44}bh^ez zXm?9B{+OfD_{%r6RO8pqB2=2OI=;jpXtmPs+XxOVQ~GNKxmGEp^xqKVGAVtl8yApc zH2vF(f5go}TD66Wf9!ux@h_Vmgkm#_f0a=D=VLC0eSfbA#eX`#De{fxX}Hf>zIEic ze)JZo_-~jtSt>;K3m^#9`l`oAbp|3A_?{h#h{Y3h%Dh1R(KfAxP}|AUQNqyH!T zgZh6wkxT0T-F|YlVA_9wcmo6AtF}P~K;L!&2EYUqY03cjU~xkOpa3xcJp*9>OHCU9 zbN_7v;BDOiC~36;FzfZIc;I>sM6P66_LfF`+@C@GtAHhB9OdP7@ znYc=<5xk(U5v1TO9*^@!xZ?5iG}Z$ig$M6`tPk8{?U@JDH_Vy%yVchVYgX`64{7su zJd!l~D&Rjl1XIQj==KE^>(yvRE4kov;g^lZb5OHR81o4woM zOY?SByoizUj+@qR(G!kS%FeL`SEX$ zQ`Y?mKmP4DW%3nx{|M_IfOVgyapX$8{>PlI1Mr<9wqujMKVk?xUDpMn*DNVg zG%P$`|MUPYW%4FhVoh!@!SC=c3<;z4gmTJ|SVQXx=m*M*<6&{ngnK$VfJUWz3Nu^k z3q*y06@?e-jzh$^bNOKBDj7>Vn6e@pQCln}yg*9{tCA8o1ui5k*PN^BUQ5z8F-y|X z*D>(;Tl4QBs?!@*5@zKpzB^)LQu@N@d?4pK8f<;b*(E+6%Lw$WFC%=2QnY}8#`Hz+ zZ80w+Y?#>&0|?6 z_zi1k>XO%JIom5bC1A2jGHfr7J;KMenmx6sJ5JgL53lw6ss|&Dv=*g}&;B$D`F(7vmh<#`M(&Q1WQ?)d@lRsy(55 z4EpLnkXt5w6$L@#*H`a^)>o%-Ut?<@^wl9|uzyEiJ;9M1LT3woHJs&wSs*v6uP8=D zmw3djEE|qSU)fDqKwo8_5(qWA_719vG{Q`JFsm#%NiK~msZlTMN~-v=hDz#Tq&20a;7>hD z{nQ%*A2XZA=2OFgbZyTT>ZcP3OQD};E8VWA?XBAW; zR9>)xIs<8D1$D*0tDyexpFy3#?Ec@IK|TK*u}oln4QEhchj|9oYbhzG;e|pub>p{z z{6@;@YMdL>xN>@x&uyX^)Nv0rR8EH;BtCC)1_k}p_F6`>*B*VBzF(V;{FnQ+ z(_6D&J9jZ}*B)2k->scm&|uPDASUgFgPn`TCT)ArChg6db8%fIc>@xtuqhxt-y15$OI3C}7^BU4)O4C=@6mZ%Z=mF0;_Y1NVjCqxx+-K@@rcQHt=x zMB#Vu3IY&%_d^-x1M1Q~%@YM16&DF;mW^nadg3w6Rf}_h>tK7lSxVz(Fhq zU5gnZCXZFL57r^~Xe-#GohJQC%Np6EoknaLBlc+L@gD8u*bH{}%1zoh@<94`8`P6g z*BPsqbYKB?Yv;+`+MCG`Kvp?PrQOUuu-PyDg8h)F?Q1V|cR@T*Nui zp@;i6Snui^y_z5Hv}+r1EY)5Vn4G4M^&~1EJ64SAPqwiDTtQiENP{89o5t?&05#sV z{l!*np8I_ae-fL<6yw`%D6M{uZzLj?UdAHgMu5WkKgeU+2=xmRX(Ln&Hq$%+ZiRIi zReLu*fU(h+l0dV|otb6=?Rk_5l&NlNBM6iUF+=&8Mwy_|?9eoN6$RD%Vw$HBj;$C6 zIF`2-qQJ$M>NGlq%7@8@l~gf}9-u5g3o9%xIQA0HxXQK^_xSaT1ImcTmg?%b(Y5a#P|gSFGCt@TKWj{g8+o4+IVX9pi`Tt8un{063{GH zp_kPkTsq-4JdD@pK}Q&!LodR&;GNwIK`L5YohN85c6NX2)+u@515j(K_{K!uZhVTT zPou>rLFA{5ZD#X$8PVu%rlMsYKxy_}$YWyBNDz)#v<56no6sQVaN#mN;NC>Am1NOsJmUUG{56v) z30y(k)mQ`RAb=WAKa4`fT zoLlQ1`UJiOZ{NNYL$<`22Pd_{_u?qJARxkR<|WA&vo%P1L^!iNv8yEo1vOHB#TcEju8$zTByr zN$-YT4-Qq;35NxTs^~ktn6co!C6Baniszz_DBcZc#s1^oFgXX~*NB zJ2h-rC39$B%CbQ81ygVT-8zNRkVCymd=k`KV|+`dZ0% zU;ozU@5u1>`6y9cSsVO-18AM10e2;4V=%aF4ixjy=XiZI85T zgKh)26&V#V*B?JuvdbiW8@RjkR;1#KR9nYeK@WTb_ruTfR{WEGm-@r{Z$rdZVU0I@R;9g0UV*__?yNEV$ zw{ZNnx_|qJzRlggJqc&0HWa^|nTB>M@!Rv>X!-c)4Y(cm8LT>s7XZ~tR)E2U;qJYN zSRwQt?in0{iz54r}uAvdaZ%PFp=EK z{_PoT0=jB0U$dFOo|Y<4!`M@<@|4M*CexEXlKa_wk6s)(;mocmLL;$HVCVUVg1O@70#q{{j2A=Dcsz{}m1B|H(T2|D0a`Pi&n2ztG=O z?<;;~7Fz$$`|b5V__s0pwK3klG(7)GYsvwf@~92>9J- zeNVbUrT*{j-}?G;1Bqd@zOsL79wuV4<*9qQ)}O|nMCEBLds?JCx!BW8deUqCmwQB_ z^>3W5)B2a=u|cg*k?{P#7S{hOumnc?T7I|y`hNi)ntXoSBp9;|&i~KzYsGmlw!HqI zi*;w+`E7G{8})x#1N#4Vo&JAbum49kPXBlFx77QBUzvs0|1*Dk{SQuVjQ*e4!utPQ zjs9Qn?=syU?%)Q%o_7KafF!)q831>c>kNP=@x37fAbxD10kC7oFKGbuozbuXF!z@> z0RE*K05tzsXDzx-Rw0jVTl_mS0KQrD8yf)ALJ;t~F#uMk8nkPK2Ed44Zv*#N7aK?n zV*qU78@T6UCWd?8r*H#cDtmfRc^bo>@|7nid%BmN^aj97T_Z67ZkVPs0Q%xFG6Mkm zzlr+|US(_-a=*a`a}lQ;>Hh7%PX)bvzd;OsHg!MTdf;vOVm4KO9|QqTh}d zaz9+}fTVEY*Vm9AKUMMLn+5On@Z;Z#cVYH$M{6hvzK7e~;2!Q_0F!=?fw?hzxL-x} z{yhd*cGxQo&F8xb^n18p=q<6~i);_~n<-MG_Ha*{Os$A?@4>g=a?T|tsr0^<-g{7h zmKyhP--CDBy$9JaEtA-`{=kq?-m&zZ>9}+!~h}q`tu22g?5K=Vp;g zduIYyX^*p~&FqPGAN*$)t!9VXzkPWgHH>y2c>fT%``|vj3$y!xoj2A*ebtIVBc#6S z1Jap9|5XnsIL>C z#-P56FbsiPdqjvy%4ic@Zd}fY;sH&#Oc_h zjs1&Op>Rj?1l%&={}1|gq#z!{#ZpTUOpZM|>y4~_U8c?_5wll659n(iFLTc{34P=bOU#sP28zo!F>ugyi_Hjg>+|}+aeUo z$`#!0kcytzmB&`oV`bKri`HT<07^@&2M0)nT@?vrxq}MHIv2d~Hnt^2nKs?Nrg}Z6 zR=I}VT>@%1g4%~^&fs-zlqT=u)MD!@djV?88MPZhZ3$J31LFe79ZWT)h9#G74ZnR2 zh(%$E*+lF|T~uOU$2>rKB8iB_-ewTHXf3)Pq~$)z0{OdB@_F>#dTM8U-lc_K*YWTD zx=|5{XNM6Y#^>mEEfgRVrH{=^Dg62jYs(z$-*;`q{m=M>Ve@swPW#3vq->R!R`~T# zyyTD3btw5+R&p##wl0(N61LDl%9a$R=xE#;MkC6~t&}atkQz1AQYd}u!Opk_;F**q z$bq}i;0nx5!d+;|E-^P1_o1KJG)XTK4i2bXr3$I^^v-3KybjNzS z$=h*zl-Nox^Tc)#3U|iZG78N3`v@-Sf|#FTb>bHt?*}CHC;ZrS00MrTEqGts5@o#~ zN14mjxy@Pc&xP6D(0c!HI{ZS3_h0c~%dhv(G_LpG|Ds{N|CM#2*ZX_lpj+?%6C{j3 z-v2=VMy>ZxBi*31^e-O&;&sUN{;5NWSIH3j&Eoz4J*08#{kJfyLvvG{xykpnT}Ml8 zO056AEB)OS@^ZH7zp)j5?d5FO;Fa!jw&hSObXlJg*uM$i8#<-^qKv>5{x6>YC0F>J zE*kUDf&I&xxx(L5u?NH5*7BCR(EnPa7y6g~&KCNk$CDoU4deTl+#Z~O-_1h*>Ue5E z~d`o$zbHC+`0h^!*>7HR$`&)uHwM z)mQ8E{hxLEUP^D2zQ2!cx#c&}{9~zKfrZrf^9TRt`u<(;Z)4*7Mg`UPQ2I^V-#3Wu z>E-+T7A*018FYT|sJHKZ@-cVHEmHh&B{(qnOC3XI2d&4?^ zNi%i+`KBIW?_>S{NZ)rH62Z3}>-+bQN22fVwCVKyNIW*E@2$EU*r%s_?7xB?+tpB` zN4d;ZjCT2_*0M}Cu%zYX%&Dfvh6{B_dyO_ZM; zT0DOpPVpgs$UQuNob^gv@oU{2eQJ9vczuri1n-QAduQro%MdHNK~up_dtKD2?c9fR zoTsXiEvZNaUyu6^+(NLy=~=WHe!Z<(p2=m}w!!aKWh=&!cW9Pn(*sKDdJ}bYuAjJ1 zhL);C12?c{KT~uP9|{-wYuR=a4T-BOd5V56Cue2@*X8bQ#Q1dV;~O7W#N%^vxzd73 z{|Y`n?TZ^6pVxW*I;j`SA2>dHHnaQy+>qR;X_w? z!+AXz|7O8)z8HTikb`*VfK={J?oyM>YV!H@&?*h{eiFa8+r1^v`@s^akJZZ3gFZ4_V_B8%hJ0UiwYvK^pGUn2SGR6i|zKd*!EbNC^4+JVUk2v#Aq<#e2A?d9pV9-Xp2SZGfbP}_V-SWT4~=1*-wWK zMwwFW8>g5G>?KaGtHdd86U6t}@>FXuc@fqD`H4$5xo9O4;}oR0caA_%K5Pk5>+O-$ zx&#-|Ktk-1R*X0<>leTlVgZaTdHq0OY>J<@x%*9GlQ2t2#ID+2N@kb`BG16he zaXG;&e(XRb6>Irp_l1q&j}&b34BF!JBB|KVA0rx7>%Q(GYW-VP1kLsF$6dFy6n{M4 zGa~-@Iz9y5iz4A`9e?y#Rcrm##{BdW`5EYA`M=(-;{P&9}ljpY-QUR{YF$&G^{8bmY$Bdi@a_y#r z$WCEX*NKmxgjrbc5Qnh4DwAY~)!j*b(%cu|@GOpBcF?puT@y#LNn)2QZhcWsw;N;3<*xaU?s`IFf%Nx3p?!@Hmnk zf+3D%4MHaU>MDvGB8D#<`wEI>%UPs{&7kWD zLmbH?yyP*gVoIzOK$0$Cj+e|0FS4Z(BqEqLk+WtC>>0Fk3QT|d4FN<-su?==b@Us}UCoIJ~ zLK47%;qftwQ(G)urcm2Be3+=F+SkL8tHVbpBKEIGRATcnV~{3%6^M_1Qy4zJya3;C zqVEQLoM8}4+=1`1<)ZU-_!x{jLf|6-pTgi{Eid_QR`TBNdVCziTPoU!kJs@&1U^1r z*8=!B+b%+U^qbsld@Nbf9R0Bel!n$HpTg8;_;~ZtCg9_*G;=9F{weIwS->jv;**d@SW9-^@yW`CL6d_Tp_Yd_0Et zA@EW9d<)>?(>4*}qthRnjSs7*Irw-9l!nH~TbK(ld^}y$1bi%}nZ$$*;TX<cfmi8Ws1Rq^EwZ+o6t2nid!$$?xw2{o~$no((67r1yk4o(IR74L(tR5dH zCNO+FPswGp&4`aT8N?Eo;k#`4x{D4UZO|bh@Ua)^!{Fl%Uh<`^X?5&oO)~^fmz>E&AJzfaM za0Yx>F^1BfDit3ukcI!y$Ha2s{K+4YHBR{Whlf+!IQ_ATYMQk^9JxCC>d|wM=K>$G zXJNNXhYk?2dVIWg8^gz)lzc0FH{fF-gIHn~zRQ-sn|1go!^;r(cnF`u;G-um`J0YZ zvJ)k1@iAQ~+K7*<@IC}S?s&Qd@R9%X#kgJ%XXe_N)-zcmjZQA?YHk8DsH8Xw~@ zQ)KwaSiw22QTVt3xh45;;TX<4ULcMF;istIByx}xJKdQXPQYIdbW}Hh{703B8x&MmYYU}IKhG8@$n}lW%!s; z$f<1{K88|F>0!y$;bV9L@_bgQD!aE}w@a(vCt~&Z$Q{n`kwVD}=(_vnc;KPYeVes)e18?Gs?WyDhl&r-^AEjs`K29Qa2z>N>JQ92iN4!psKVC2|We@vhFUBmd%AB)^kJF^heYb!=bG{(@$jawM)@kbdr*|hwnkc zp)Tx0@!lV34-(FLVYm1qt!%j-bPKq}SD?tEd5?k8!W}tdx8r15obRL@LW9M|A9<+% zHCQH7Hn6;z!9wFZ_S;1(1gk?Pd}1&-eOryjBmoQT_%mzcuc?RmvY5 zto*MB1TDV;uOlk|fmeL7^JlILLjMDfpykiRYeV@?@zdeTVN#B=%n}x3CC2^flyA&t zVayz!?Dd`zDg95FI*v%W-sQY6<2?+j=06r6W+kRd zRpY~QaQfB$AAAkyFNmLD-~}`w-H8CP3pC;aDRMA5dU#II+i zMM<;omx#?4_GiIt*~zk{DxN@>*`HdBzv+}~XJ#^ZZDEpmPFoz~C0kzOX_AyQ6rUEg zGX~8;Jem_H5}`2%9zkQkRXJcbt0wl0nnnDiJ&Md5H*i=|6x)~xZQ&Gc@q!l(af#(F z5%reFOMhNLH#ZN7mo5EKwe?h4bRH<#CtEHdN>B|t05Nw#PZLAD8{yR-U#FZ3)rGQp z;*QQti`tTe2FR9JRv3%0vr>dzIzsB!=a34EK{OpsM8iL`^spDS(1SPbHU3fXoc|O` zscD1aitvNN?X)8pF5WKTq^eJAvC{%OG!gu&1ioes=-saFVj9P5u_YtR)B7yA7SXKi zM(f00s7xCFEa+KYVp={%6RMikzjr!H^@XY`N1jc_k!O?X$TJ(JF;FIzQt~2jtv^(? z5}`ODk393me#X!w=u0xS8=R{vrlES|SzK%6D%!1TlY3#sOT(}q$*1~^N1jc_k!O?X z$g`(uB0)!<&B^D~DynZIs11GOnUCBNRMXXA$z`fT228w!k}tz|gyCXrq!)ZS??D3TZvF*LnM#ji)r3{j5+pRL%Y=8SoW%XH zq|~mB(Wy(KOQ$Z&c^E2=Njo2(pe~hT(k7P#IVSB@bT>*~$V&cCE4{k>32&+B=)5Gx z1#>zgiWSGCy@U5P*e13|uEYy=TH0wZ#(wFJC4fzkuvU(@e(#f16-xwfVlP)x6hu?9 zqi`3X(_Zjq$78pn;2CBX%4|%EtVCUvQsFovZ@UpcwEsknANNjO3sGK)iqX^!%049s zlUYfoOJ8FXNmX4pD>wcC*ZI|voz_{w=$mk+n3AkJezl@S+-PScv#et{Rt8oR|}p+ zRmwi4qsl&|y0^)$BpSRU5rbYKjboR6p)>bLYv20;Tc9Dl9G=(|>U-0&&)cAFqU$Jj zM46U-hzHq{iAt(>;is)oj&?6Z%_iA03NM{vEoP~#=862R)kn_?qNgw3-X&WurMDjY zYI=opXUe4k$={&u$ec@Z>}d~ujv+!mV?9zKN!SE|pR`;1r^+8FZFLqWpcNyagKXIk z{^10$a)|)E-HNxG4j}@j$d(uAt;f!2VgwZT&=SxskbtV5J_7O;0=CofZH01-Y56i@ zJnzs%*^;9tVj6#YT_6#YaSou7h<-XE9$)G21y})#R$xOo_y!D8A^q6fN6mjLcz0aQ zsfjf$e~?p?AX~OY>$+qnigB+1N%*u5pA7wSr)+tI-g@lod;_!Q0&Tyv(vT$DSD*tm zG{s%&qiKvn(^_ntMGwWXA%dd5(nk-gfrbcgyZcCC14lzN3F~H@6vj+!h%7o%=Hbp_ z1CK1b%tye-`*^1$a{^j30@}%zSEAGo@ezQxPvb4`3m*Z0kS)vUt-{TWfXB|)_Qk0O z0tm>w!biYpg@Dyi4d{V3J|1a{d9$7f;t{;<5=g`yGWOCLh%o7hn5`kg$Rqo&@=>$< zUEUoXIW_UDJ7B#$D|b;KF?g@7Vh zspyWjjDR+>rDq@kc-uaZfC;kYho21uq@-#I_^2R&fKJ!@2q;$wFmVFfF#=l4mNh7p z3k_cn;O&D{6+7L~#}MOXOP-N{!t=BQe6=iqfD19%Ql!>kOrS_=J*=^cto^U;h9m?SpW`m;|j~=nzn(*z^>xDAo07iU81D?Qc^_Z4j4ma+^`*$+uo+RBF=#= zs$R#5tzg!+$Bk2D-J6m20i*@7o2A=xIkEAa*v%lef)TqJ#Fh~m>N&6)YOPdL&v4W- zlL&iuN1~`iJJDKMqSE?LSj*BQ+Ze56KjRqKRXBndTF#PTXa0cBlwl@Ppm8=4hjncK zu}f5u?bJ?lULRZG*T@T0#zrR?h>`^pzr9`X()nn#OL)!jyl#fc6{q* z*>V}a!3gm6%TD{|C?t)|y9`OsD211xGf}vQ6<&k-wGM*zO6jfG!La`0K0ZKdW!FtD zeyRdGku>Mfuc}et0Yz8Fyg{aD7VUc8BNwf~ZzW%`CSM1pM9QVtcQKZ9c&@_Xt*$mS zO?qV+KX#T38XP;@AIHvGZKl-RTKsR}VeG$E%q!iVp+?(7FCC4<9=iIE)K$zLdN3^_ zduVvq{~GO~5{w^5a^&_U=Iz#%RqZ5-AB&~jXl(j-fHck z7j(KV`@R6lasZk^kt{RHxnwcgL+^mQ0_~v1k=LZl_28<~L z94q4l1ha>%dLk5i=+ZzUU=MXR67if)*V#2h78;itGV4fsb)LUp0_>q5l6^h2dnfN9qdjz?j~<`)fjyMqBgLnEU=N+DW2E@) zq2=AR+UH^oDGW6gQeKLW0Ea?=(H>fhLJjH<_K-+b>D3?XA-9o$SRDa>pX=`ng@Aro zEme4={2kr{!R(>#dLk5isC6I_u!m|-8G4~Wr-OTHh%oZVJ83>@u2ZNn+CzUt>4xrr zJ(N#%>bnE>&=eyjKXlWM#}n>=?&u8XmC_wscJS^n+Cv=!34lFx=7#_RU=MvoZ?y(l zXWjH+r=}~E@rdc?BcNCzz-SK@p-@8)z#duKKk%ojr6l(OR-urS-2cqNSx}p_Ed_l3IIc?ZRKf9(ww-NbI4wr+f<#3oeYv9xCkeU-^5z ze`q7dPow4{@(+EAlj;I_hl3Sj*d#GC=5wM41jYRa*5%JY5e=mG*@DFVn=%Z%e+q^r1*+b7B*L8{39$JA< zhJJxPG@IUP?V&YE+J3o3LsEb}vXOwtx@!AkP#^(ETs{K&D+C0y zhZ6KeDE82)Zv%P(_RwK^tL+7oj)>BG{k>r15%(}3H7~x!yTfP?-H*}@-2r=OdLSjR zhejDG`KqI~J66!bgx;t7d0)K*KtJ97dE_+o^QfQ#SYJz%hhP9JE% z9%@e$1+s^}xufy+&_3AL(uO6CvxnaM2ARffP;HFssEqSpiO3$BLiRk_LpLbIHp(7K zrkbL|QLD3udK0Z1|EbdYFidM{_QqiL(0TosJ#?}fDTX42Y7aekG?+c~6WR-tWhYYO zyjMwQ4>?e0D0?Uo-@@8MYk1+)SmAq6zt$eA!P{W=&}(?F*h7{0sS0Rj56%2GB75jb zO+M8gdaRhSq}CpKWKI+8Ar>z%(I20J<@Q;E=k=78a54#OnOz~i6A{6;%+Dw9$Q4_r zA_?X{=w!jOEM*C0zd{-X8J(+6bml+`tLm{(p$3$P$K*a6IWF@f$d|i9eg0*K; zg1Mz`nTR0{6UwC8bfQOmR^mz5OQp0V`aI6e=U{q4DKYSY{Ec3(q#-uXIA zd*F}6`Cg+CWC5nLs+YBy1E{3ZWF%UP=GduK4lpJCg`h810UE|Zsdg`56(=ro$_Big;@0Z=j z{j$}kd?neuInhcPVD2uAoPE+qt#DZd7G*)q0T6>|n;iV1$|)Mf$}&u41C8L2U3q3f zjFxlw1&TPPwUDDQ2cRN)N|6V=~R`AT_yYBQ;CT z1g!Ph=AaL$6YJZ5=F`XB;^NeQi*)t?4;^TF~aDX{?)1Y8_+q7 z4c=^{umP7RIOxqOb`aiZ6ZLqzsqIi?ul+*%N+-#aeKz@#HK@hu9hWi@-gR`_J?Z3A zA3tHdHoz*-pU&D=X78cI7bGFRAXyOOCRM8Q#)~0GeNj5=a3GzAxqIlDyFz}HGq>+O zXKuU?&D>5pqE5@)wo_$b?p2Jr+xVHgLSgQ?_`qSJXKq~Eh-&vqKgvgBoA@EZgdWFI z1*#?%$H{s)(H-nP67fWU6mhq!jPsL8!``m48eF9Hp=hrdV6WoLeW4Oap)j|rjK)gk z?Jcsss^$&D=%KQ$ys{1c$~KsKWMRmVS6AN#rM}Gr>{}J?y%p$HOC;{Ct%(ucR3IxX zKBLwRE!u|8B1V@GWLU#nv-9SGH>X&_zdd@G7{W7IMpmq)A5s#`qNX2G`Q1p*p_&e8 zKhCQ?E)1~Crbh|hQ-~VQwqWk^8bpY=WTEu)SRuxBRE+l6+u+1pkG(zOMQjKm>1a2J zwgiv86R1SJDy59k=t^~8VM*0DE&iE==_ewXIWX+c3bsS;3n~k_PEWIr;EL#WfLcZIBf_c~pzHqoMG2 zRK;5z@YaUm&9s~XS&1SAb3k-Wf>X4&;cCf#9NeF{EhjDNgw15O65f7%lW=v9G`zpj5266UpPoqBv9E+6Arh`cV=g-qd&3 zf>ifKR7k759+V`9C80+%PubCwy7Po-Txku(jm5RaXPcM<@hQYAb$VQd1kx3rks`w> z$WVZ)2!o^kRwh;NCxFWKHq})MQjNj@@YM?goMsBXGDF5yfdc9X*P$}|5#XKHYU5T9 zMHeaE!n+8aLtTXKqIR`)x50z`P>q99--gt@U031}5;C9zhO!hPJ0KpP%j{3{+B@2x z09mW3`K!5%TCJB+j5YZHCshx_RY$m8y4poo9x1FCfs7(kK$g#vo!F~NH3c-%ss~A{ z0h773BEh3dE4J<)Ok@SS&!bW&v7SjuCjBJF*~)#=3YV=gf%PN5Y$Z@&0TK|a+yd4b z3H-gmNMJHqV*zu4eAppE_E)GDucu&5+1u+&3xxsgyIeON~VYroM* zm~jZ#RzP4uZXpLV5-MmsbONh_M96;8UNyjeD7e64c{Bp+P!NGN0}_U+g1}O%S{K9~ zVe$%%c}_}qAj8GDmNk3vL>5=yBl(;7m2RcroJT$&UJS+_1#9I z3MbT>E-w{KgG-Ut%tV!CJaPmTRU;!5RiCJ$>eH~IstvbWAga)}5LGj_f(|CC%F66} zR8e*E=7>a9SMNo}sx}f?nl%Oh_2!|nV8)EWh=?)S*EF|c58;%lIqJn7t!VcIT$&T38 zg-9RASkP4t6dqlS@aXjrQqOExg;bqOtXHin+z2(DcB8bsSp_MjpURMwY9C5UeII5j z)AvMhDFvB9X4MmZv+9XZ_Qey5uv$I9zAm`1!jhSPKJ&V4Ul&YRtztEfNKvQbV5S=$ zdW2k?%B&U>1C5U$RjGBw0Q)M%%A&|{Rkiu7EGo8XR@MwMEg`iwXsxUb%s-$L)*Hya zB6+nH_Em*qUp=LlSMUqcoaXilq4WsmG`DXiAYF?lX2J@Jvkgv*BH4nUL-&7>~Wm<2p#X|Bz?o5w8BL^p=lqiee+ig=J{MqB~*AzN-3M zMb7CQIH4y`TEiq5-s{LPSu;-O@XZMf2Gk;-ZxRdiU(|Bz#OS|xZmSA>o&VzaF9G_X z{);<9fj*m=CZXq218~Z1F#p8{4*J!8(60_+FRWJPH|qx2Hw4G~YAxR3zt|82?~@@~ zNW!e}SGFR!|6+ww->L!jClsVxg4rijVAGJ!95+DvW-Zb;hmv=j)%jEz@Lr|h{S^i8 z+$1v-*zHvUe0)NToz!unJCoFJn7LF}w*_h994svim~?XWr`IH^8(-?12Qby3sSGnK zOl9^?$j)X!e;L@YS)nv(E>D(~auuy(T*aCMS3d+cEoPu#awFAIJLEEZ3@;oV&_|IV zeRLAUwL;sZZOmYJqI!GN4F;Oo2*pGW7%M7>^}w7mw~Xe}gyexb%?X_01e@O+rc!+# znP*bc`TXXNH&qGZ^TyCklJIK%N@l|ip(IF32nlk&;sLGu=7?Na(h7P{?*g3x*+Hm= z)>Yjxt7xor3UigBx}O+eUmaY4usoXC&FTOF0={58PRjvVVm(_fBa0tyHMT34{QWdd zC3hXVbcKt^!ZujYW#iK>XG*$H-snvW0FGu~fZ7223Ps}V31(YBb~RDr%qT-vNE~<- zSx>PU(K;VJy6#%1+83K4Z^}aZOUo30=?3zb9%ug2695+Xm)0?V=@~8{j_U=4&QHMH zq_Vv%q`!2lQ9zhf0Wsr{Dj<%Q*=q>Hn2SJ2bab^Tv$yA%HpflBQ4tt@n2kW#cc$Ps zTqdd96_kQ(6?kDkO7fs8%d_Ypr@KN!H@?U9|rHF|XotVG~Yvn{+W@xOaZr^xA zg=2%x(1Mi_d{OBd7!SvjGj8FFptE7!pYE*!p_pA>?ehNACBf2;C#sAWah;C6_U~ zXLEI0)9s#+^6ajm;Th_<$O^^C-{l-6xb8oQe!JG54H>Pa5|fJIL+)@F<(wH{vRYl2*0yF68iV*ARk=Xgxn2$6j5fxOxm>K02M$K{W%-k(z;+ zpo2ST?VKD>Xi-O3Rhj)DvNI=laau&P#Htz#YX}ae^14|-aUj#sm7xZ!l9|ZGyUgy z`=uAzf0u?_0_S1!+PL(+3T{ zo|z6L^v)RBAwoGNIC~^W?J$ z)#hrNSOtJAbl633HwK$f^~;E8LZ!!BInJMCzU?x*#H~^8zfj`UZ~Ci>xmv9cqxe_D z-1ni((T~HJqx*5}Xb{ZZnKGK$qa#uf&#xGyw7CzamVOaZU{MBGgv`ONqtV&(snD~>L)FJvdHy@)<0>323!B6leftpHZ5OE!bfMK z#?lGFO}0@dZ{#*=k#+^N$kc;XqBG8m)Od?ESpVFp#9NpG*Fy+{INz3G@JZ5IKttlG zo@r6vvo#Um0tO}ikLY!LK@<}Hj}_x7wCH%TyEhLBoydaNvr_KVWSWY1X4t8-YNjJg zoQNWki2~WLrBp&Zo^~xrb6>)WYL(ZMQZ3@CD3rUSlA40qzh}YhlwbrBU@gS#4`!bT zYxhn@=2RHEvlRPqqTcz!;?LA*j$H&^*}k#5OhK_xP^>pDha6T7-O1EF@u3OVocd=RK&%YVO6&unaE(%>Z_V=BL@p?XD9PcyoQT3l2B^I zN65hT5bL|OehF90CEPP96N!7pxI3Owr5jG6)`pJGK+9X+sKD3p)^rw7VUTYrEiB(=G)}(J{97yE_9&EV z=HEK`CV0COfD^l%&*$Ly-HM40NVT96PMw5L5W^y#U$L! z<4m(s6tM)*vkD@WO^LuIlT8%)L7F41Y=Y6NOu`REG`KKykUTM0B3AWOTYmxR!KV8A6;Y=hf z-9eH@A2~wyQmAr8Yi-gr;iX zQ++IY@cC2Fc=VTp%aaPlUcwQ$-ODMk<61O#I2kmS=aX2l_Z9SeBmdnSzu#Zb!+pMK z3=Em^kO!lyOsU(Xwy^w7sgHeb-o ztBExx^dw!EGYd1SCCZHIRYgLmtHiiN!oGxyhpd#Tf-;}_duLL@2+?4+KqzCw;_ie* zard#r9qmQHR8dV^WN~9+W`7d19wmak*yDPO=1?^0u$Op7mh06q7ZYfO7Jw{rUA8Z& zzA%Vk0V4w^v_2y?JId}RvN^KE-ICx*4g}JN7Lm=*zk2T371DN;lhQ)Lj#i;<9gv? zNE8;2>XRtXq|71-BgUR6pt(7R&xTP{#eJ>zN;QBL~+SoqGiLgZax$ zs^*SV)K@(%l&qKA)7#(085znX+-k1GYxrGW>IkY^X{8#3s# zGtNy8G8Or~`ZwNeVS8f+1>-@P8~4mb5kKnuw`{*0`8Txt<&qRxr1&=|o*g0p3m4pf zyH)kyUXuWLh4Ze7hp zWVhF8yX8gX#dE{m@)v)i2D)V?QsHJXP8H5lf;3!By`oG9aUg_lqNTHpx~i5@x29W0 z!Q3t^`r(0OF6Ee{TDpS-m`=(m&fJFLZFT1>!5VtBP?dHUYv)#&Q?|S-H|X5zNrHGV zQCENu4T-u-UJE+6`u&_|Hc^o#I&aHw8Q*>nNkMM-nT?CXY+=fZ7DCr+WYB?%%D(O|4-Y5GZ7l&9&*oNYnDoioc4d#s3emFu588uZ=^=EKU{oa6807NkYbf z+{+!}D6^39!Muxvv`-uvgOc5y*o=wM^yEM~6q^nvDLhi^h#7CLIoFuPttLS^Ny75? z^Ugy|Yb#nz8yG8Q#(M_FQ!wj52x1iDC>)ezriQ5YT~Bn1fGL|$eLnp%NNi-n3bt<| zI*NK0TRgWp(@GsUKGts9G$dX+iOV3JG|wKC-9XKF1+C77Qo*XzJD>~MF2mL-vzZ2Xe1+OjM5mO>~ht)e`-b1WvJH-IT zPs>YD>akBf@QA&RB@4Q^J9E1*kso-q4Ih*PuVx@M6xca6mr>m}dpoxkS<*atZi!(f%BGKxAlL-24g7KZ-=wyuGPUyF=~*~RkU;XZ=cl~_0h zEG%RUHoMPZEKC%Abd!dIg_s^SV0vAGfB6!Kx5kI#U!ibtypDgl&z1N$IUN5Agb$p; z;A7t`#=ci$y6qBwW=%S3*l!;H%m1XXAL(G7%;QG29nAocspO>kar4& z@0i8dD*#j!L`coLft{jTnceIv`F`IDo@uF0?`$x7Ylml$pZhTJCA>J&Iyl}^ z!+jm%4qs^QZlSaqp}FrlGAeUZg<>8M{9-$2MhTOzgP$bUoVEh2>41F2*~I^OpH9p- z2{?XC2qIp2d?%Ng>T%m7Uzu-CBVXN_#KfQzg5Jy>bAq}UkWPyMB+gOY!|zdbBsqP_ zlWHDkq7Hu=mUEEQw;~q#J=WfDC=?k?<3K2~GiDo@W+-aEHAxx=W6CN1gkFlLUeff9 z8n&$5%P#&Th(A#KzRhz&!H8KMqye!ew-rB*4ahRZy05{ndi*lG`+$!+a6ZDmgWAmX$XdX7OA+k`Y6RSYy8u7ze_gsT}Uq&rzF zexlh8Zn=C{8o{2San-`NBa@G)Rrk>6!usgNCa5#ei#!$5VO;-Cl08Qd;a4N^J`s}L zIsuoK*C#Ko6vPukTAfh(bF5JKbM)f>x8<`Og*eonnY_mqxeEl z=#9OA(Oy_@Uc8EDtEo~9ppgCR6mjSJC+K1)ShQFLCwdy!usiA)ziL9~3s0lx52-!R z9HN?@zZlA!+SuR8x)nE+Z}AuC9|BGHvz~W|rH}*;akr3G!LU)^itd1C5P{q%ReHb} z#}8qF(OLvygBDas-3%ke;_A`szLDCaX~uri|;TQtM<1-OB?Nb~aD4pC7xt5su_{4shwkd>Nj8=+VL$xiV!4UZ^+ zg>hRwY>QgrK^%?Axte0w;ME_fH3of&6xhX~&6vqj>tlUZVnEu%93 z#sZ6ItIrZ0@wSZ8{Pco0VswVhoPTjv#iyoKanw8VKtRD zXS0y;Q*Nf%Ni=2b&d(_5A`Xttg1KnRD9OL9AYL4tkdc{?-z($2{2m3J@m?Gni%L4- zOJ+jG;Dr3PkR-5If10z^DT2}y&W!(<3hAb0r}x%+;&W4vWq68;65HFw_O^^&ribpw z6Y4=7;_z6|Gfj1j~#N8vUz)#%9Bo_B*? z99VA?Z#hdr6*%MR=2*MuX1qYbo`GlaH{RyKYZMI`X!pd}Ji}v=v?IOGPH+@%NBjR{ zx_=Vb&XG}Pdf>01%jq3*lG~?taoAb0y~{iMY!(_nyTD=-qdC2dBwIYuJI01in}YtQ z#UL2C(X^npJ3}W*T zyudtU5J-!mVWCmMpooKO^{o*KkDJ4{sQLl8Ua>|3JWxlYE!3^qXiJPZ2u(q642tK} zXV!~@@ILcwmZ!CcNb5K#-ZLbjI*XjQkbDA3_Z)|(JA&B9Az%}*g?`VcXwe;z`N_=t zIt~{}gvGZ@gmnAdnfAWm6Ux9lkS-ae@-`plv8v$kc86%IAkg2(L7zmRcLDVE;xOtS zALbzdFkXJlCuuOB0QsO|K1soRl2BMpg@whuIU~~?9P?&a>kRX-+kKd4^En3m=NW`< ztwsD<7`&T-cXLR*GXfO6gKF3+TD;R52;n_mi+2a`?qGNazYfGFhIb_8cn6lYqwQL} zujY6^77XumGN;c)v@7_pyX`w8fT?p98)JouB1h!&w;X6@+)Q5AP1( zovu=%!aSK~4tOGv0X_lvNdn+OBmhq8OeiRbcMymp(39N?(3{1h~AeknCxu{0okDu#Gt zZ-RZ|5UV7!=KW_v+981$Xf;R8z(HgG;F{8DOM2Q@rfxAj7jms|0ee;8i$iy@~G%?hj&&y zo$f~thg2s-Ck_U^-VSR%N{IQ6jDaar05-)Q7>`jOe~fekgxcJbf_HAMqwshuL8c}; z#R_M}Pm31%)8nokA!e6Nj4ii|Bg$)S5N{Hr+2OUxYF9Zi{ml4r(H&EY$U2Sz{hiA*KFGHe z3}uwtGPdWpEy%PF$SY4+bUjr@)p$Dck4g=UNP5G_ba)3MV0yQ{g8a3vNKFHI-t+-@Lw7~ z3^OKn`6)^2_}N8J34O~dV}j&9SQe#OFi7txfMt;xn{goj)`HfyjD-pLLmlES(N+un zW2OY=f;8A18K300DY!7>zJx{R+dNThOssrNuILx73OQCBb{MTwxd)%MeVS0JSvXUSv zJPTpbl%kFMOw0SSxd)m@{bHs$tq$KnHq^Oakz=X_yc_j+C8i&MJ-c(uJ1{yd?!8x8 zG3CR*>)$~aM*;n@TJ(>>WQ+q@kN$z0_W|hd?fd9Qe@DD)5d9=mj!^)LMgUkx-3p(F zrpYwN`vyFMc`g=;ck;d1m~`({S&`%zi3M`@DPmzd7|q+qju(&sl3y&~Wwk0Al>IN_ z?T53(+rNb3utPAo;p>sw}Ojm;OvdW1= z@{904cR$JwAu-qK9fg&#tV&7Ee9V`*)|VNQ0htM}Y7aRfA~Q}ef(*1q5j8e3p)z9+ zq`?SI0Fwp+q(P;5kP#ii6;_*6bWmZZOUG#@p>u&Pn{9E-2IMa5KS`fc;7^n6?LiFN6Brwv+ z=Tmp6h`CbsNt1~e$yz`@Z$gjYv+a1WJysfO_7K;ifN^vR1=;2>z*T>fRV%N4!ZaUUY$9USYKf z>_P$yyka$zz}l$@Eb4M5u*@|M5?K8pu#$cHPw?I%i31NqUL9ug>PyHgfdm*ytXj{& zc#>G3C=!c`ViF4mSt(ixiPgs-v8cuIVz(^uT#S+vES_;NziYt|OyxueO{Ciw48#=9 zmN774(EyQ6-joTS-E*#X!pGGaQbHx#Jl*sYJ-Y}4vSSt`_eG{vFA#Weml9@;R6%Fc zDw>_*4QjC^n7khLB(V7y`av9x@}L+<_fjTOzVw<)dZNPPP!$(x>D#cq{v7gQbOz<6 zG`&Y9@dek|GR7niX6XZ?k= zA^OW4&|gN%mHtvGA7c*QUu5WUGeC?M7u1SlPQreJww-glt_wbUMXPh^1jt zrG4yx69k<721!~+>6uu2zg@tHBjbZb1>7K1?TKI0zC-o-tGIFJfF~qUcKEuXh=K*B@COr-}|0{$4Hcsz0ZacgI2H8|3cw6Nz4E^EtJYI z0N^vH!&vH_85N6iG2j1H^>Iahkxv;Hz|+`7W$ar1{^Dth{lWEdY$b-wppP+p&DF=K zsNk<`%!2hk~hiv5%bD_TOxDa&N5bq>#1-072tg=H~r&sZg{2-{vv zso!I=21VRYhRQ_{_WOAbGJIdi%SYln7pCV*=v3}^abSmzO>!-3eO5MKtLN3}$ zwi)H200%g~u)wxYDmj`MwXDS5+G^T#sHWAG2d$^dqVqZlh50EH&2tbd;7k!@%X9bA zrQGi6#AB&6y-kNREf1O+w?Is!is{E_{Eb?PKnGhf=B!bu{;|!tr5H;Ng7oJvQNMCu zF62!m3$fszWKdOPsIMRDqpGLUCXsvVI^p4&6pFbrrBa71-LV9}eb*!HW%oy0iH1~I zI#_CF%Qtb4kMZ>yYznNo|0v)PgLEgh7AF_p@Tc1^j*7~Qljz#Pvbg2+g#Xw{{mgzz z{L_I;qoga29tGir3;UbrAOa>kS++be1GJT8_UFycOs8BsGm~NIEKD-b!3utR*^bRSCb&X;ddkdauC$P&d z4seO(E)n&X#!F+49feDCNW5&RpN=ceX$(QhKG{-@N2&%L0H*;?#~{1Pck#ATt93Z4 zN%!3+zJ>TiwtPfcJ#kM|T^h9|iM`pu3S-w*v(ON%y2foRXE#yfLQ(jm@Xss_`5v^; zgEwx{Huh2QobNy>HHdPEv*HJ6NFS?_U)GVsee2cYF$D(*-sh{>rgcr1t5Z+Q^T0RC+@J-mHQCZ^l ztp2@gQL3^|TV|JNsIXz`aMsGnm0;cI`Dnb?RVf|*9GqKbf1b^2@IokDB$)+MCVq*F z4htD)1k=Dn!t#UeIGebm#)O#|a&Mo9i|?P0LOk!2sM&213gx)mxWaO|rX5nzlj-r2 zSK$MpF&fUnBb2&v#l%tToR7l4wj>tuCBTymAwCVOW)$8#C9mBv5 zYD+-vMkF1Jq@Z@AbfrQqCV1=xs4ZvIZUnU@RB#GvGbS@t6OebQoWCmgvt@XH{2WeB^BL+;Yo`&yP_)e}P@gr%PFJ~GONSE?2 zNS{iN=cx&+Br6gYSx@bZ&%3nn>pEWMUUUk|d>m!Umb$x0HsvKKTuXFO`q;db!mrP; z_7iel8)eIXkY3w)JM9|*m7T5f(h9%+iI+Twmz=>${tHUBE|Yyl{~K?q=;%E7slf$v zupiM?DO;A~eN7zJt!0d&i=EQ(#`owN7%o+JNRy{KEW3&?o{R8o;d*T z%V$(U(%CQf+Cu&4#U9x%-jO65-kpqGqc2rO$u(5SxqSe8n?&!f=TcZP`o2iR^kOj?hBWw zF$Gg)Qxm@(2Wm#-Qyp~V?2?Z!7*4&9SgIF4pWS7|>%G4w>T8bp)NFrMM#8K&vXC^ZXLg9|uxv5m8wSwVAv^7dqmZ;!USA~rNiBUXFa2&-`rbe21==yZ zrQ)OWI7S1nZt4=R`b zH6PUD) zS1A_w1>uX}FIt2EIeYC&yICGQ72CX(ZYLPA{F9Ks2z%DzWnrqj8!mT*W;lq!757Lh zS>yM}mMSm-PyN*()F$3KOVfg)dREn~^R@3Na>%v(OVjdr{MbT)_OfLQm7xauC+T!e~Sl@gz#Us)eo-JPM((T6;0nk7ZL>SbtzL+qZSA*j+J?v)>< zf*m-=0E010+H@f%HbllOMh3C#k@x6(4~H0wynFfG&_of-h=Fshq`J{e#w@ONKhmXo$3Z-R!A?+r4JRd<@7|nMmx@VO~D&=h*cJ> zutAX#R=c4oY`nLiJw$qxu)Nf?>_7OyE-x#v9|jGzrqs_!u|W6{Vw0zwLL@3j>=LBJ zz?iXNRsH!D6bA&ZS(U zE19NZiPfDTW)u~>bcYo^p*PwZp`Uv?o2{Qmqll3DdD=aMUa+*VzX|#|4Y{R+lVQ{y zpO*Ob^JU|atN21y;r)p$|NBxR)6byFTNdl+WN>n z3hP|j-7C0$zHS}U&)Jma?<`G#exA^q>E~1=ku497)#>M#@G_Kso{4Ya^>Z{YefKyj zy$?#)PB@%O@kagJ8SjC?NcD3fQKHIfrk~r7^vPSUpRZ$bFHk?f8sCt9emzB_pD+G2 zh<-ljqLBJ|9-8c%B!(Avi9=Un86dpO?v&jYjl8qz5wU{gwW61k=n;qs(#*=6;wZW{Ug`U8@@!_75!W|AgF%seyyUP zGf+O)&-YO-ML*B@yyf)s(yV6d=VBBQQa|s)1di$F_3t)8Ka0pMO+OY!-5K?>cNB6Z zou}&OQ!ve?kGn^vpL=q84@>oXo1&jTp}O9z2}7`6KYun7d8Tz!$sJ5ZT*}D}m_Pq{ zHPg>8QI^&$O@MyhdOp+7E0ILDd^239pWCBnLh0uUWC*XH@8G3h%1VC-rEB%`%Xk}X z{+x&RjnL0Ch!Ry+GyVMLSf9M*`uUSJB=-XK^DSI(!lIRnieZiG=g*iB`RC6oYJ%wJ zZ8$?a1lFrYXsBZP`EU0SCjY1P^WRndT#eQ?K|dpZ2>mQfqsBu&KLIA-`uPW}bT@VW zd>@sfjydV)iB_L}cHyUQ{+wirKtI=v^YIJQ&y!wgS^d0lM}+$M{eQKbexA}VKtDfM z8=-#wei(JHQ9oxrLu1JF^Lt3(*U$IdMIWG_-=Npf&#(SX!CQ;#=ZP~L)X&klI$k?} zz61mr=Fj(5gw)TyShE#RoT{Jy%4WX-^XI`L*UzStXuG1HpSv=se$KyK(a%rksQUTi z6VzjT{`~I8Ve~UGbG&|yQ4l{yH{bItb#pXDBan{*-WF_zF}Ns@?5(wwEXKEN7_z*~ z4H1<$-B2D||4bIVx51(0NFo9{%a#p8yF|gSffY^sL)dd>GPx3>|4i*}Pphb71-bWw zNJRTXLbR_Fsju+uJH}8GLHop)A}a5hNXy$3S^w{SCc^&z;FXBz%Quv#^gmcabimun zx<7qLu> zo-m5o*h&9a*J9`|izo1}htu*G{FuXx| zgU1PL;P{k8tlfzbfTlse`_9GlECgNKX%UWA-O_!_^3_kD@-GgBqGuAL2goU$Z;f8u zM?zI zFCz~i2xV1bg_43L(kE1RKYUu&ju*q9awDdG*hW*Z%0w<~PSIM7CmQE2*u?*Wq8uU3 zhC?~9DFcI)WfM>N<2A)hbj;2#c-j63xwjv_HTof2soLCo$?ujptF)ya%-l2jgZ zVwNqvP#R)RQhAUD$F2;A(apQf~b0x4?h2t*mZ2YXCX!r3pabP_a9DSespyO z<_kiv-L&Qz6~$tXmT${T6vz;cO2$8-eYsFLDLz(ctMU*>8ASjkQN$HHp9AYrYShqt zY^|o)sz8R_1^y>OXA!fggr3CaSC!EIAXIG4EIRKftYKh_yY%`^r|1-jK}l=@#LAW= zDC#OZUb>Bp8@_}OxrD(Sgg@4Jp==O|uqYv8NPJ#5f4txOSW%Kgy*aURIl5Aq_Z4<3#5pyd%^hNTxhi=!Gz)UOx!!u?UD?9Ku8ca6Fpf z*e7#?%iA9Vq()XSDrRb^cT zF`2(d8rJy?dPo5h7}4J+kB_;V7?1iyj}}G0Y6NQ#e7rCyNC$j~MSHaal6-XRk*@Em zA)*kMtTT{qiHQOY7J_Z5&=$JWCs`Ul9^HbGW7m-5Incm(d|IW~FTv^$J{-^5gLK2Y zh@Mxwp(E;5w69N(R_7lu)E8(gtAaCK(end>RdlDOqV-iY?&w9)n(psOt~Cwuep-2_ zmj7{9kcPx+$`}0Q_YWwaB&&vBH1?C)4%J?n9ju;b5ay<{tZ-{P|rBl)xR#E zUIPKjBQm+X;o`nAc=|juNV^j>^yK*IVLDr@#*Os!XY}-E0^K*-ka{ehiidWxuvGi9 zlDq+IMO^y)d+P60Q^_(3glw7DUW_)aBCKM-vU$kV78|ccenOJUbBGqCRgA zf(L{TQ-G~vfIm&ip$l_JTb_d*J|L2*j5&QVvM`QIs4y$>4H>=Eg6cZ-lR`DK=YsJN z$zX2Gy}~>kuw*=yB(;pjlPJ+2K?Yw=q;eK(~L>Ah@m^V(P< z&ujD@mDbZA-l+nqz#P{2YE+JM=r9CO|7tv-!Wpxt3gQcED4RF#S+-t)=3YQi%xX-> z>+g_R3ZGOAtFf;j&YMc1fEQ9aHPI?H(Pvf~L&OB{XFpbesi}uV)QtD+k(nT#%^RuG zj8&8%51T;o752w!mJ9aBYI^Uk5k!_iwmd)|Je!LslQ@*cz9h+(S?uk+`S`MgzIZmT zWC?KEfj;Jtc(}S9zWG@;GJAgRqfNHw7w%B(`Q0}~XwR=jLW4bjk=SH=emF{Nj6F~I zr~-79E>h$-Gu%EwR82B^FG{*5od$rWv%27F1*k){u2fyAd3o++=JyrA;oPqFEFQLWfW*Wg!WfEZ*vrm23Bg zLcHuUE&CWLslXh_G;A!08?^%C0{c5hdLD}mML4ccwzRvEc>e&&q-2swR|8X@F=tuK z7K&<;Ez%9d#mY>?Od)2FH04sycfSY3Y7y%dUxT)M#wo$PT2?}(cv~c*!7~{1F%TtU zj#)w_%#w2^LR<{R?)>zlE_d6n2hVSfz9ShH-tU+lw4lWr-!Qp&@BR)rhmS50`A1mVd z?Dc3XdV%~SvmPQYj%U+spMNBcImpNYYleU1PgIM)N4Wwh#Tl8+_mAB3t&ex9i9z&{ zAO!c1L~Dsc_cKGi4~Rn7Rzj9av-Xj_(Fp&@t(cd|mizjXf28n73Vv<@|HzmOP2Z_x zF2~_%Dw(_9ZNPp#yH9UVMkY@eb7x>v{3B^w6?wYgx(MazFeEg})291JV*Vd{Uji3Z z)&36xipw~-OyW{vqM?>iSV8o@%?Klx9F*Qf$t5YvtgKAIB}K8(WV}uKw%UrlZQ7>2 zmZDaIsJJC$i)f{`dWllZ6tr^w-{+ir@7y~J%-~YL-|ye&L*6;}EYE$;bDr%y=Q-#t z7=G%{U;FZtOr(Hc#*;dr)$JN{(G(=PK{$KhWLgA6X9i zCqO4@{Ue{PaswI-Kt25ElOov(qf(+pgIfyu!r`$w(_)3_$iqJPA3l@A2Gw^AXH z9a4R{0>=)iTXPK%=fpp9YJd-LdTGG93*h+mSADQWFJFAkhwtfl$k(`UuW+N`=oTOT zkFjHuRLwwz80ZZABWn|UAn<#Q<2ugW|C#tlZuB+IEX_D2n-#h_FaD9z zD}8+T&l*2?yc?c#;U9Uon)JuB?;p8q36uQXKjMR)_5O|ZS8y!A0MYw59=jBz?AyQ5 z=^B-Z1>oQKq)^sG0`hN!F?a&eUALOI{(IJ@5%m+o@_+l{*4t%rPG(=%gDcRoIM2V-`K!f`S5SNMlZbl8;e=# zx%6*5HJjn2Df;+xt7Lurr~U!z&;jiQ--IYw_x;f=KsUeQS>v; z-#z>r!{GpFz`s!kjZtpT{2dG2n=0&g3%CEnGhX25%K)xy4;Rm+ulBHqN6p}cXJijQ zOrt0|VwCI(8G(yy{_wf~MHRlQbZlJ$rZ{^{T8Pg!~uc^?BNQ$SNQE&w}+pl z!8P;5?BUIb)8K5SLTb65=II>U!ySD=alHl#`#OSx+rxE;xjt|9@Pn7=@x$!lS8)zg zVY}698{lU&$+ON|NZT`v4{6gVv;{Vd-%Ah4MShm{`Aw*4TdkxYq*O@At<~xenrt`0YNKyEJ_4#>%RNDcJ-OXY^b*LTj1l z7PmW|jfJyG6DwV=6J;y~A!6povqp$pP~y|dJnP#&(bm7(tG?{7aYn4V7l0%B)De1O zV<@E;X(a>195b>tBgen{uxXU<@5WYgqsNY{G@3*A{apk4{_FN?zh^var2YQt*85!A z0}P({_*vJ!w^w`5`a98`8{a3o5RlsO8l#7acLzof%r&OPhscI%lpbas(84#|2YiTs zV^MFMenubE*6;0A-%Sq%9`takGoPT~=wZOrz`mbG)6s({59bl`;WsMM>C59RpyK-c~PulAnfJzuRI@5kt1>ES&^`)HUyyg%L(A2Zodjnl)=TKER} zfX{;-e$m#yz^lGW4?PJYEr0l_Q&Z@nOFJiylsB$NS;}PkLbZ%W>z=6(dH5$ugf}cnP7l*ciz)5&@&za6CZ3AHw+tXP2ks zAU4p2V7j>vGF(s}l-UsL1lgvL4=g^_X=#o;eJArVC_5Ch=n)8M+;D{$yHo@$CvVMd zpKjmgl0)X=rLp(Xd&I&Ca{l3XoPQ#a*&%^q^^gFa5Fk;6U^zk*_0yA%K7T2t#BYJ7w@tdl;{Hf$kUE6_0x z*it64PSQ*KrS%Z&RZiK-jx=F}BdBJS?)w6u+Q-weC35%CW!*eP7f(1MgoA~S`~$2U zxa&-r)meP5t0PS-qP9^jxr*X*w;~?`3K!#oSKb9ZpoetFY}`1|mfFq(S}+>L_io_r z(~~dC!>6=$ncks-xtj=cbh<2{{G}FqB6`EIx^X|*oC6T0M{$X@h!4#W+ceJ$Pj^`o zE%xc*A?(qNME7y&NtT$r@PsdGa34x`C5z+4%?dl{YEN;i__nkLz=#PqJx1XGAGmUoAi|3A@Rt%QOp)1(oQ5ZrNH;#U4637JS7X zq8$qkvWISt1<0cklJKSADB|X6Q7wMsS3UjXTtva|(mz_%VZ}L$czApf505Wm;qh3` znS41Ts1Z3Z6H}cj1}x{FT)+;NbD~sI$d)tW=dqj@e2#M1%OKc;J|dLPH{vr&&GP$3paRv@eQI`rZ9%IKkd?BRk9Ga^Xh_SWpj; zMsYZu?4r(aim4?zmqGaG7V)>B!J#asPn+10?sslY*B?_Q7T*iiGz~!TW;qo2D-LCD z8*MWRvB&iDN@}x2`v$^(h;crFM2yglIpiix46)$g8D2O|5oHSU>+vwAiYi-7XTQZQqH(V^MX@k~x!cLF`7y>+5a}@5Om2*oYsdSlGhD_Hi zU1Nu*yRUJ}p-nTSdi& zI8;IYv$neYDsQ5Y@oG#ic4Gj$%QTIZ@l5C0#F^iD2CyQ3JEM1SXx&j&Cgsd@788lT z?LSWfk6y`7WAdnGu#SQmlR_vpKq$+1MyC|9BEz?&O$sfTGYROv2sDht2(%a&`-rsH zyYgDJE~%!#ZgA*gaOfB*u@Akj5+fZM#ex%^I5SG54$T>lPhmX1Qmz}P>uj;ZS|wVG z9oBR@O@5;q_p+B`Sw5;fFY_TLBD)!yE8uq+SGn9cv_16Msgb!k=$I zA(nR*mVJd30T7AevLr!lB{-1T5l;?exhzMbQq~`S;{ZDEfAh5Lx#Z%6(|%#UMQ z4k0IbTJEgo&OxD$v|KSQhbCYt^G>(Qh8o&CjI)YC41et4FI-lWX&1NFdxG zhS$=(br1#NL}_SlYx}lvhaglpLqgEO&Tgv(@grhTsbcs63(a4DG4(*C!&)IYM}V_* z+y}((k!}xXh)+EbLzq7#ILB15I}K{a2;!si`~#Vba7LI?7ss%?sV*dB?|1;0nlt$u zx|@*!y={*1h#XePG?cRdCURu1 zU_Vrc*~2`RixStPV6h)9Bae7X_lK}KZHBTtxv1nJS}%q#7fakC)`iYRDiX1zc+5kc^h`6ph8ECFwgBgd z0!Idl z`8ZEYS7^t19Xi$`mQ{3@ln8eiKHQ2aleMcl88a?cif_75rymuyR`65j#?L|&q8CzR zLGcpeo01amt=B%{)Mz61u?vyR%8@gkL$8WiCB0O9Y2Yz80FPM@54*pIIY9svQ=0dl zjd=`l!_^X}72We_!#v`KCim>w9BtDvujw?U?2b40L{)J%a=5890{{Q(Iy2mn+jr5ouqCKi_MXmg(D$Jc}g79tZ?)<5@agt;1d9m znV*D`{R84&Y2d%;y_&vfM++7M;luv@O;yS>Rr`1IP5$lQ>f0N!fA0hL;P!7mQ@#A# zzhh;ES!@3S&c^KD#Z9+=pY>_~{&Ad=S9sgMyBo8AwGF-OU;eTo`}gn;%uy5U-w1_2 zYh=$)C=As8IihqF^?#1+-})0l+rPEI4!3`2u;uLE{v9PRXRZAk zMx^?G*ZzG^L7sg&Ltb$9FH9UscsdCCHxvy{ZdQ!jJy4jXb>(be)AqwO6NbT5e*3bDMo{d*Na48s0Z`qSCJn4kZ}_V00q_%pJ9%NQB>v44600olL5X(*>@ z_U~zvOb=_^_SCf~4ATBpyV2UefAVgEvVYOW+y0e13e^5p`_Skh<5B2s{~qIOs0sFO zf1ma*@6X%*)sCaJe<#ETYybYC;74o!qA+m#SLs1-|Dsf5|9<~Bv486|c9U#h{;lla zY&U!wd-Jcef471vWq*MN9`j#r|HixFI&b!`w>{bFM^(vn+mm@2{_V+j84cT$%X7F6 z6)#_M+mjjp^<_`Ke)u>YZb+lU4ch(GBZnHX zC-2iX^t2~$aOceAubwBmdk|x=cE9w+}r{U$#qA);v@_ydlZBO1p1%J6c z8CBXOdvZAfUgg~ajeo~?jyGq-j+?#g$-)!(dM|r&_YHpR$(L+RwI_?dRhOC%d-4h! zw`B6WllD`4e9(YB z`QDEja%gxz)uFB0Bzw|zM4<`#)owKQ}x`1Xfxc$_&zU;}9-^)|yv7h=4FX!WE?MWe6dvfSuWxnd% z__-E^0o#)Xr3aloS@(<9p8WTzzll9r<+j%lDxukj6aF6isflj*H1^wHXHPD3+ie#8u?Zbjg%b8xiaxI$@Ho?_~#{|&wzM@G?;q;9L0EIu@^|)n>;j%0$d9K4_+Yt>OeK;H_2n8 zD1ZJ?WCh*Hif}}wj2>{WgE$Dop>MhrB3YXJG}7!(@=63aWI7cg0MLC`gE)i*2_k*) z4D@7kOijd}8GnFoP@DoCo)~mf5%oMIj;@pjSb_r9EpaTZf1Jy76^g(FvAxby68GYL zB9v%q6#k-V4P^Vi`GK2gXN_L$p=U}jw|?)NUY27T1Ev>W=cy@NA`?N}YXwZO%hX4r z*{vsPHB(f}HPRk7@l|4!qZ5x38X76}+<)99rbIi^q7zCG>4}AshB-mRrz0&9f94v5 zJfM$R=tCToNgI4-1n^Bs#bgLX|M<0i+SP)SD)c)kl)6ABgR=A5@=K(hLj>uYglZ`L z!*LLHckX5A1O(6qJ+`We@vOOq)x;=(7I6-+SOy^~k%sMuRz!iWtu)iPOT(#m zVX!1U&;fMkjQ9tY*)>^&y~Z0gR5RWX{E%k&AMc&7yvJL&660-~oAav3f(t@;{CrBJExC3|B0@vblXp!+u}v}N_F|7(HdYJF6jR&0oMMt)f<1*o*at@nT1ckOw~cFV z6I-X)ubb=2LsDX=#HjX0RBI;`-#MQDC)E8Ul%7I!Ij*WQ#nEvt;^8H`0mqQXwIx8p z3#(7iS0QfR`2~vBHnRIvnomG~TH7C!fvfN07Lsf5KIPyOvj?0z0FlxC_DqSyx z)zgUWFd|D^k_aBm7MpW8L<17CNn7@@c^*W;nTXWED#}6Tcf)X@FK|t9eON$o_(TR& z%R>}%4mB3!&3QLHf<3apX#j?4qY?^GL_ILd?%#9%&5M=jxt1uUaJkWR%larJKfVW( z_nk+GF~t{KhFRno*SC;y854ptAw(SI^9wMT5^{VHMK+vW5RWFDNEJ^z-lxd=8=Tj@ zjekPY!w^dO49$=j{=35}iK)LMM70({p};`LQ;2J`#`)zD zfL0bf>=K;%nkZB`C^)Y(3#Es`g|K}1Jkzkuvj7rZKVy2Gu*kN23*7y!!0_zeA z?ToYM7lhF}R)n43NeAIZN94j(Cv56eD`Cv18(;XCfzrh^Kqd|qND05YT&W_a8?kCiOgBAJP&cqVfxkdV zH&k4p_&TLas)Lwr1c)N0yEp4nv@TQT2~TXA@>T+^%V>%4i10rT$`DbZ5(+G#P_&xy z-N02A&_cNCx`$6uHv4Klu7-x=G!w7|><;sRv4dZ50#`6bLEzIHM;rgZQ3`}abt(;6 zQM%Y7eoh!W+M8w?VTOc4DW$*6C4fDJMu9!Eg1uD2lM-Hg`hYqiC{+klLMbLB!z_Jq z@`P)PH9oXD14Jf9JPp32%FKoMA-#XGvR({t3{hp~>v)uY`kZ|=Bd&;7*-OKT<&a?! zcSDAW5f7q>qu4Z!y(KKa&l^SLp~MHG{Ssw9Zx;kna_s)OUqyfhyN6KfrpTA-gQCbc zlrD7?`2j!+td61wuyGuh zQS1jgOJ=PiWuciXQs#-Fxv5-s(3CKHpzU0cgM6}jAtYENN z^{B8+I=P$AW+XB3VjP87YOz-|t4Y!VW0g=HLM&=A-i6EEvx63j1bTcaTTyr&DZdt5 zJ2DFRF^Y^r>2W@aEQ|nZWUdjQ)^YiDd_6FV!tmU->@)Jv9N zuogp-FST#SnNYfNqQ`Hv_ajykFS`nJf`CSpXG?tuZuD3pbti~3%ns_0_%V?E2=C8I z>=;LlaP5u_-)0pb{vHro#HS82K&ktGZ6MOBl9}bE9x_3TpGwhvh@9D2AFktLnWgUl z4Y54-g|ErQ1=90)lDi1SnjpApr3EOYQ$nNy(KaRip`!+tF_zJu2Zq@BTJQV{W|CX zjT{RhLb5TpgM2=v`#!$Dle^~~VfjJm0wFphN2bbH+);FTuSrg57l6HZ5|tab7mrn( zYkTqCUV+++3s}uTXT@Hu8K{wc`|(5C+mp{&q{HwLWT9*?t|zg0c$b^nBi6E)hQ9xS z>}xrW+iy-P!z8F~9xr?GP1I0j?TgguN%we%&FXkHc$8*q$E#*94L>c#c+cF%$NP}V zwBwzDy-4S=1GX2d9thT69QbS?_F^|y>pa+tH@U#g8nYKa>U|dN#cxiZ@MkYRwUg16 zr@h$wT3`0!-YQvI2W&4M`CQcpU`8tH;9iveo$SSb?_fyyTiA;~EKzs>iD)M43Z>fZ z?$vJ%#$LStGZp_DZS-c8ddTZX`3PrjFZP0O!iT;1(Gf+2>+Ho&nh*2TSN*Ey-)`g6 zrC2|W8$PQ3IQCOt_((@7<#Zt5}sd+}pb@Bf9-c-ZWU7avr*)KTQ^ zDD|=zpWec0iq!NVX=*fYs(x^j?8S--Uthl#r3!7Cx?_G-U&NXV1EMW;z2EQdUqfCu zQ~yjI@3ca(7Y%s&3+=^^DjT;K?|!EddvV()KAUG|FOGYRtth|t;y6BvAA520+uru# zyK?(VsUd1VN-%x&5>?I?4Rs&U8>rPZZfrq_#^atPe;>ouZ zd+`XKJnY5MyuSeK#f#t7+KZ{(WP*mhD0LxnX7-{}9?LAP`cY#qPL+!bq=|Tv`R&|` z6nk+53eT3k_-0qmN&VZ4CqE6=UOcjcuW!Hh;x1I+`=tTci`!Ul*vXUk7n6MMFP4=O zPEw+=mw3*080T~f)MCtHH3tQ6F?!i=X$czHcP)NM%iXf?@KvhptHGo6QHeY1E25gc zG>m)NfXy`v<7weTheDh<3ca?4_a0zcJoj@_27k znRdK0uopl16O1s>{l#VDg0&ahBRN{*`-?w|RO>w0i=T!Bu)jFF`&qOXZ^ejy_7}&0 z#OP`e1uJUy7fnM}K;52OG{2Ym!r2cfRdjj_X&S0d z|7o<$B?7S*Uvzh_QRoY)b7n72{aSA?YGvj=l9>^mxRwJSYnT424C{nPY2jKoaYdNe zOT+MmkYTT8FnjT*%T#;u5FWX`n8h1K{D2Z4i1tgA7xH#0iUYM5U)bmiy9-e2rpO@e z#T%3^brd-OrC#>poyDA{XxV$NzeZ^4Qr=Yk-~ee#zrR>i>g($rC{<|dhiENrO}ii< z+EVSs>)rip$g2lRQ7oSnAmZ{`-`_N)7pzj0Lz&r?8Rjrh@6?d zI7S}JEZG5#y1zI`E-sL+!;@?;-iS3p^jj-kg2J<9FU~Y^PU_!Y+_ssN(m}Aq8sA}T z$AWJ*e8|_gUwiRIRFLgOioax$*fA71CPq|T!t9k%EdFvMen>4LXIO+%9M_B}9_!Ur z%ncCn=jF10FO%ZpGRgakS{DxL4aSa8>iw{15UZKy1p9w2jZ7wF{%nD`%wALh0oCe0 zn{ptN*-u({RzM=aej3i;`44_b)m^;dF##Uqh!W<1(}VJR9}db*9F(6$fYMb9%08-~ zg5u8ahV)*}2ty>!Zn7-gl;{hIdZUDLOEga-J0mL9nTAxqCIJSuxiCp8xDvLEVumv{AxZcRJj`k-}PcI^0qL>9TDiBG0{V^YqSwTaHzOno|)OIG6>tw{i!o zQ1V;EuE@!6*%tat)WeL)iMThU@Z*VWdVHpP<@vc;kUAxPwg0R?Mx4#kG9Q&*`_tu0 z_(gEsC*Us=f7#`Olyu{d^`J>@ZZ5oUlHp?<()$OLyId1*^-?@ zrb}-;NL2O?!Q^;n3I1RH@bmaTi_CSrvlNebyNv&{68~7)af$C|Qmcol+_<_$;lste zLJ9ptch@;Bu60YvN&Jr@`oD3|cER!JR=jm)M7m5*t;N(Js3$^j#8KemX2CHC5r12F z_&)p*YFLG1SZq`lPZ1q&bFzG@NT7|>w-&K^vXmDkr&c8&1|nO>lnM5=G)hQb4@#BV z1J^T7usHfln?do&3cVC>)T*eEd!-=$n+oj@+CuVrQEh3TgT&5I*6dLq%~--n1fl?~ zxnNHHEP{=)pjtuyh)hr3Y+N)S9a32)iw{i$7o+({u>AGt7aBiyv?y5q3c;C+r+!C; z($ff*Ps>K4Sm#hdT04bY7$aDmd>rNUMx1;t#mRToRC_SEJcYj8jc*W(Fm>Cl9R@>vzFj^i%L*YNM1xe zOf`UT#n0(`CeT(t@M=R+^cW(!96=1ns-@{v=tz+tjDHJQMNu@}(JToi#o3>fZo?Xc zdSb;g`tZ#+*nfR(j!YbF$xO6~W^^oI_BN;Y+v=4vGIyj^+|JMIq=>1Zami`9vm#t2 zNJorl_fTYj7hEZcDfU^RlnoxwW}BFT{sznarMot!+e_oUy0sTL;?tnTp;TOb=3nEHG@QZIb-i4s2&bfCHPUGoNNuoPm5iVjeLD{1u ze=&u$-V-Av501|5uvie2T&Bz4C(d3WB+rbdgF%C%U8ZiV2>0-GU=RD#ldsNOC18RX zeE4J*5;c*9M8#NcQI3o7^CDXPU}i6kzH%RaNH@3l)(?)q!S$64C^SBlgx9)rC80m8 zE9fhA4?#&d@lTDuGM_4_N`gXcB+otdrZ)_n0y}em7hX_(^pPCKvWj2zA}L1Ws~)lA6K4dedSe9 ze1Q5&-??smG*Mr9q8;fb&^H3mSF(r6W67#e5c*0+ z7BxM8`pVY?YGe9J@rnQS`pT2Y#C6W}mFdU*>nmRJc8W|{?BmB{~N#4Z>m$i&1a~p}uZ57j*J!8o0Ycc9!rb3O!b3tP z*I@f33Ku|JxId>;h;hVj@?c~h6O4T;;f|XTe$1HtDc+7Z8%J!T(jCJ5FInjhW8B7L z##>5_mv5RHC+BNP-aF+&)I;yAs%O1v`!N>W)7Y+Y4uLa-ozcesY|b`a$>o*9uKz%B zjMQ!^(Jmb+O987J1i#8Hi9*u#l#F3cq}#u83o6hRK;kYz>`K=OI#Z&ghzIb2$p`58 zJwAoJCG3unTgv25HriVP9Z+SS&!$}O{a;r0d(I4hFOK~i;qQ|dn~uNt1I6Fy5rn_P zFRA#m|C~s99pv4zP$Sd!ENpk`x3+yl5=sO|#EN!M(Hs#g@elXDkG~zDIwGD%L3zY{ z{GVtQv$Jaov^(deq-f&aMQUZ=l&Jc;$jt;I*N*p0dp2Gg8}AYP5XvJyZqpa!4tgk$ z*e*ZvQEQ3OJ0jjiVR=N6Qp;&5oQzRB$)k!W*Np0SDw z5+=73R)M3P;J67}OoL;j+g?WUXl#%FYi%az)@8bwfYzjeN{}j7vmFfV#T)rfJkmgQ zdjcU6JPj0j8xe!QIQ&7Fj1X$V6L!-*@#O>$KU*9GJiGs+hv%^uJmHzN$s3+W9uE?p zrs4bendAH7_xSe>lkxrE=k?!rl~nSH_xHW^7|e1dEIuHNYc>m%{el>9`!_=sOZ~*g z(A?%OQ!6$;HbghYXrdyRzk}+x{uOIWdms3|=LlZE^=q1W^#6wM`r3R#xVLof&jp}9 zT+>;p+_BFU# zH{H>KF8!pC30$%$r54^%WyNkbU8KFT89vFGQ6;6dgLR$GZbC!y2xLKNr(UC-RV8&k z_6;Ht?D@4(ld*Z9QHA_>IDV$wb&DN^hZ< zX{Ih0vanW8Z40q~875HjF>XiMhD;3B=*GQy*&%qtO6Beg`n8p8#ps!Z) z|9R$Ds;X&Y5kEunq$I0ke1WA`a?++T>Jd7S(n74N2@}Vl^9pJ9yDnVG*gO?vgA_z; z9NbV{B7RCQZ@l9ay`&!)Kbo>%j6=Nvn=y4jH|@W+0Rq$G)BB}2a8qJsdUE9yQwBEH z7myl`o1fF2=`qrGxS0wBP=XOC%Y-}%OB%J*D{0iy8fM}-E zv5ZkAg0mYkMtz5jQDc@7h}e3M=hta}Dt&?zK=$O2yf*3!T-j}(i9K3vi5bXc04V8A z?jhC8Wi6>5PY*uQn-tTGBfSaDiW{cr>fy9vtWx#O_!pDh>NT3=OP{2mM|m<>?lo6b zhS(MqB;XEUG`OBnw9DeU5pZt}OQ-A6(s4I9F3v>%^>pcQQV;IcVGD8YrUD?xrj7Ld>}l}5u}@m8tZ9d_! zB{_voIVJrR_wBO4mmH+GJIHxPb`N1$=o0fYfyWah@5;>_>n z%#BvoBPF{UD)%qP+qq2tqyl?6_;y;okh~>tEgJ^;uUN(BV+#qf2q;p+W>g_T_~iE& zFH0o)oBQ)hTFvgeCxKkYBp8;{fryCN56Mh<{!;XaZF@wuq(W7R!^$UouftWdA^Yp`cP z5C=$D379d!Fs5Vx{rQNE`CTv$JOGs@FTx_0*BEWYUQ7$oT)L+(Xm<&Q&NB&imwdT* zE7YQ2#wSbWmza%Dlv4~DaFvDb4B``LcEQbHrQ%lf@*8E#*n{YZ#UBwl8dr~w?NPmk z0X(0u$YK7l0FMBB5?XZOU{8{c(w;4W4Hp1`JxQ>CNKF{zlLV19A~<|Ozmvv&yH8`# z^ZUtr0Csd}sCXQWMuM4h*b}Lbt_=1z7}vNOU&&&SoTjX=Ntzp8qy{JPu}JK_B{H|4 z{l_}F!h5)D4;AuJ0rCzgbOYJ}YDUXrK$LP$)n29mW^IYm6&!LnC3C(TCrkizdcA3VZ96X#|V2&hC zBr6s#1z6Sp!2IBs)au?)s=!_p;04HTUJv%JxlEEFA(1Gj3Y;qE&Bk}x|MALieUJz9 zk)QF-lNv3>d=5?d3Qcxw38WEqx@nQobpr%>5(>4n?~=f#R3XPd==9x!;mVZWL463A zVT^4uf5j$oFI5>Jm;J#g*RUC7F4HB8b@L|RRN%((80sd!QOixScX(c^TZEGbx9YhQlMX#Bq@N&Yi{G$#( z7OTHH-%rew)!OgG#C2!b?|rOs?7PU0B#!V@i=eST6Xt_7x_5BcpA7^`E!iF~F@r-; zk)`dJ48r~!`xy2|QI*wl*=)A<3~4BHnU+7Q!~S*@>ao8BB`Q`rJgUXfaS*YLqf>Zc zbL36p0&PB#H0I@)agK8_9`VL3IG?0aU?x*~{#Gi>pMVP^AdtX(h^^7=j@#P|J&IWn zxVv*Z+C*!%6u+AMoEe!eQ(Fd`=v+$OK;#eV+yOD4&&Lw)=ea+gO{6rMh9Brs7RU6+a&t6>z#}p+n;}V{AGYyo}Kl?m0olH~j2^{l)F>|v7j6n=~<9x4**$3tls9M&aD`$!5Iz4$~~xN+Wh zU@*`Y6t2YjS&Ck(w=>Q|opFtwbpyn7WpGqTkG%P<%T*$NVSEy~yZ}lS8Uf^Nj6vFl zzyO_qi9=dgmR}dDLKM@hd45wAQ-V`y9GOXQ^D+%QFIG`pmaz{*9nvr&S+nSxRW4Ml zS?!?|TI@Sr7#Os|2F7#)R6a07x96bo@}P+r)GVw0^C8=*CRb#mQpMVuh*S#pQ}LCW zT$_jFtS#8R@xU|@FrN>UumMTym)|~qkls4-z&Kh^{P85E4(aT+Sa2hjzuXJ7Npiy1 z0;ukbx#~XB{rOQfIHG_As?Koe?T8!=OQn>X-Fd3LgX!YOQkUCFlTo2qDWh+%m4$_hFF$8CIAfVJ$~Fl|IWl_1@v=#Un3Y3c?Ii1~E*w%|`YI}^*-w8$VNz~vPF`pH|Mt8N z*s(~Boxp+_<7j^3YDQY@e<1y#miUmd6+{(l6OB|QmaR97>)%W80d#U~qWmI<&pF-@ zy3un)?CCx{P!jq3;O*8B4Yef#U{t9XO<4%81zDS`Z=@(&%!$?%=WF?+7P7g+EDg2} z*R}|W?D0W=>Tk>vq32#pL4Hn1F2ad-gaa_4bs43AR$yMr#?6Q#{@A-CFsC%uqR0`x!{Lssy;o7#vOA}W6lU%!`XJ7q=+%h_Sx+8nnh(0~6x^a!}GKD5L{Yg%?p!DhGumq%q z-2$7^7}>mg3uuw98La5jChDUeo9d*|)mE}ebWoM=<+8UhnXrTMQ06l2nWvk#dKBt4 zx-BSC_36-cHSjpWZ+|xQ=~#HdR9&$X(#=CG%G&je8LF=M=tHVL{l%fivA+TY%{aoK zKZ3@7KbQ_uo36oOzyEwRT8q7VZlFF*mdk^f48s1%3WojGRAsze)}O6CLmlw$GTm&~ zVgEr?)MH;jiHeo)7HM&m1x}4Y$THauts`)Kde*=F=+lo^Fnu}$`t-Kk7B15czz6}W zs?cF=15%-N`fY>$?*|m^R_p)HuWZQwUGz=E{_h$#{qTRE!u0$1e}6^9q4R%ZCS;aC zN;DkCLzy(z3SDe4K{%gR|2M@m1m^!{_F20E)&FfdPyX+BmNn%69&%3o-`|{f|98b- z>;Hxc3jgYEb*eBdCuKK@GicZdk|6A_g?f<3%U;b}a@htkk?>RGl zy%_EN>g(H(w1i3LWxs&|2d%F!q?{-BbZAUKd+O_AKAK%HP!Z9;k@~(Tg>+u%d;$5t zIoR-j)4pj__4S=J?%VAfgI=$%SIk1AkznSs|C{>g%3$}@*R!@TW#dI^a1tNurLVu2 zO1&8JQ33w%2X&f92vFo-U*Cu(f$8g+e2mU)jF}iitFJ$YQX0flUmu5ZpZdDu|6cc4 zQ~lpxH?A?}D>T{hS5gXs($`PIE|K;{1vaIMzWxW$A}zRHnbJF`4*@ew8l!nLo5a0T zWq@4v2culWW|YDIjdK*5eG6eGF&v%$8zri~essjy^nb&Vq3WV__~F*qlb%p@(fw0Z zeZBWrjbqn)46ZnWs_bVsQ){c_ea&;{%;hXNB=k6H_W&G z_w;}N+5X)4zjMw^pPqpBe)Z`Yr2I4gcXd1)wk>KfUY0QJ-7EeR?}u0Brcbr8Cf{XVJK0S~Lc|UZ0-x02;MYVVB4>*l`WP?x{~ltY^x=5NfcT zYIym-lbAkz87jd4eZNjKScyXa`t)SH4NRX7;bUx@L}T>B7+QULusn#TKHUN3KJ{tU z|NUrF{olJA*XS-&XmZn!L2Go&VF^eJBLbUJMW22PXpycNppc`9`l!E(Yjm}1*(5rs z%J*{FTbNApf1?ck?|XIgR*yoxMz;kesy-e1^4au%zoXHoJFU>_iZgCgb;U;!mMzDV zd{Nmr_E&(Q8AllOL(tgo2h%}n6CND)``?E~Ybi||3od(_ESCo{8Kh5-EN0kmO;yIr zW&PROGt>d^@PAL#VgEr?)MH;jiKdzd--W^G)3YA*qfb9x?BV|gj5_~! zUHd>nNCNkNk5sfkzkmPtW+D!q{~I&$H}royKv#kJ zznOj3?k?5;-S<5CzxNk4;Qzj2)VcJ3f4bv*`@c&!{I&jXn4s`~-$~2z%>3WSxUzS4 z{of!yU;gij50jpLF5|y%D1!g{^A~;lzsIsP9V}aHL;mllUL$rIxc_?sKGxg+jncE^ z|CalA`@gBcm;akpJd6JCVP~eV7o)vjeSO;$#-0)X{WTbH@cwT!m+tukv>ROf_jokB zpr0b5eiu~*A8_^^%eLa(p(V2}g6Ju!g_2*DZ zgLvxe<52EXUswF!BR4kH|GlMgjWJ)L$&O!=QV^W~8+M7b?_^+8s_5%~04>r2WQXHZ zdI$9(V1}9h`yDokd#TC*x$F-{xrWUsga7+B-Mk666T{K@zfq#<>y}Mt)BpX9Mqi(X z6CQ5=_gxqV;8QHd{;{gQ-g|T7*msdB$o$`XgU0?$vT8=x2Z#OHK%ms}5(WE*NH^ck zQ}vnNc#C0w6jfO*m(6Bt&ya>P_`h>>*x!yqJ@%KNMAg@O7HDx~EmLvSYHl$4`pyhL z`g%fW7)cvl{CA=1|7Ngh{NFVJDen#Vzi-7%Y5d=&RX|o#{NMb1mt~kmK9w|K2?D_5 zDd4-@D#^#aVvKzzA%-=gHbXHHJRIPeXEy*G@h&`oToVAkAJPFqs@?(Mn^~xw{{V0? z-=_l{f!{0+J5dvdjije6z&c77|D7m@Vw(|)E%=H5P9zObiT{2NfwF?X`0sdm+!%RW z&^l)X@ z7!er<-E4vY$folM@UdI4jRW60%&mn6qea5 zCYHkgk1@P6oeTUB3X}2*@;W8u&C6>~x6%}9GRV~o_Zk0<8hJ}toVRs}5=+hFzwcPg ziwkto-{>~tA~Cr3F2L(5JVf1;B>?`;#-!r)SZ)V`>|NUawEj8Hq-%RM;gl4R*v3?4J5`#4Ai0 z7(xw}Qw=Zw_r*+~z6=%M|IXHF1}jnMU!R_gw}I)?A$*K&H`5sXFoss29xM;ysZV!6 zxless@qe$|(p3NV`o=Z7%M_a2R1vgBw;Yy$wD53XQ>y6GZvidRH5V%6XreyqFXH-i z?SI%LI;hI`a@kv$O!9xD4F2!ox_PTdp4cffr!NHNFfYa0Y=AW3-;e#xgF`q>B`BNXx3pA zK}SO_CFn5xk}cN45KD1${KD49B_A?6ER;Ul!RV0Arm>@|)6U&o28Hn{ON?R1Va^ zZE41_);pF!!&*#PWRRl)m_dGq6%0j)f2H!Oyc%@xGChkzjBXL>!;tTUz7(U-;XZcq zlZ`S4qsX6z^e30LCGdp|@eWWxMqGNookFp4m4w&r4#s((p{s-wHXOke(l;peEMoWo zJ`z9Du6)n28wro81Hyg1`~ol2o!tfyYMg^3rQu(3+{CaD1uxvZF83AZtFMLBmkY-t zr^ahOgz}BlRSTu3aAIJiP%2$7gjL#-e>Fa2BQnG%Oi$&R25|z>;wq;k6Pbd23l2u2 zAT@awj)#7L&kZp?(ih7Hhl+<$J`F4oQ0THuqR_Lr6S_;tP zh_Ny~_TR?&Vj&|r$~Xa<&tIa?II&5|I1!Cz(#b=h%&;{?|+%zObEx?+Z<*Dg?4 z;ymc=(w)(qCGOcsfE((8G3h3hkq-!$q)bO`;+RogsK~GvuU)2Oe55AYZZwf+^)19X z#+4P!!s^SNjKin6KFZG;e0i<>&DUO{0)h7wZ$<`?2yk8o|b~TwA&Wu8-q&ygGzkz0wNXobm|E@o5zYQ!&i6#Zx7f>H3 zWpwsf!LYrMs{A0Az0I(0n2Iu&scMK0#V1jy=SAfxx$?`JW~)Mh5_h_&l_&<@RW`iE zS_SWXekJE&#n1;)!MM5%v4}Brx^(Mae3Wcq;J|?&%YvtDA^CxfaXFNsB~B3-{D^GC z!Rus!fvt>mIuTFz&=mY*?Yn(2ZS%}*x}l&SboOcny}4=D__Wpu8`i`8VX?0 zxDvLd^kM!tbZ7JY(`-t?u!x^0e93au72+iSM-lj)N{60Jtwz(d(q(ND+d!p9!H(l_ zl>daDv7XIB@@Zs0sl!cJdEv-Chtw_9w1RAgmES8<8|6;jf}Aa7Vi{6;JW+<>Vu(?q zBf}S%8R^yz%Cufj?JveG(<)g8IPkBEs;~dHRhdysm-hX;S;PQS0Ly?EPe*=Y$%KLjU z%K4G^VHnA;y#Fy>FYm{H)}Xv!gX+|mPkH|=^>tq5eX&3k8ic&R6NUq$$A6XvBZ1<` zRA~u4KNtzr4|tbWw^dlx6EGX3X;GXH9a=|#8zQO7IF!lqz7VyElf|^BB11J0>M{++ zM{4B#M6?M?-miLB{^lD>0+#nkHtbX0R{)~G<^4%$>+aDaZKLnN} z!JuHfH}%od$kBPl>kQk^QkCN}ia%snH$03omq{9=Lvc%drC#3eK{X%pz68Y$%KIWz z(8&9$Pq@%vcHSAt``Q6M<^8th!N~iXomzSSabCdkz6%*SOy1Xj$mTV0d4J$0OhL(4 z%G5S4?|;P1NDs7DrgbQ_zY?=dt7JPZX3iFy``0td z@NZFkeTApIpMvQ*C-(hgAD?nzuR)IW@v^+X8yL8}uV5(hkoW6Q*r>eE$0+AV-gm%A ze&ziMi(cMO-N|ti!?t(4a8r)ze&zie)Yo~H_gl?Gp+U&|Y0&8zJq}qLj08$VGpRFa z_(52l$-uj`rMbeYULiANK_q8Yb^j&64bfC(3d&@8zXY|3lf}29BEv}_)MXllkJQNf zS!ffKyf0fWfAh#<`sRS_`=ZNz%liX>C~$e-lB^|K{Rh_sgYE55^rbhy2oBpH14~kN zgo5p>sgKS)S)j>M#IXGaRf&+xK4w@qJcTlsss5ij6nDl~>gD|*RP!P4D^c8_ykCI| z8hI~m<3i(1<$cIyKIQ%1mx7V^{XWsk`>*c}Sl;&~BZtZR$kl9K1DE$l24e~;KU1c* zae03NGb7CnQ>Jw+wI7ICrd6_!7PDyhl&bVsXa0FwtKH=)huHEntV9);sr^56vz&0f zx4d_uqAKrORchq@Wn1~w`IYzNmWL~MSZvfy+%x08Jp)dALHr3W7-_)>7JbTmDj!SB zFRp`6CASZp&DLnldI5iU5vG7eDvXJw`*`Vw??+Gsu0&3Jw8C3FvBrbs z#zP`=O^QE#tkV7#)_w@u+gK6O`ff@@Qe$@ld-6RSoMb;sbAT36F<{@;vB?BQJ7h95A&SquZ zsO&;Zk|lh$0guNnA`BG>t*fMGvw$+^5PTRWOp?~esIxr??(?V&J|hB~Z8Mu~JY%-a ze6}x_wz)fy#{AQJHmbC_>vC%a_eEw? zY}VFv5p;o^{X9K%KDJvjj!55D(YmUFQ~G|JGc8(h4#!`{ol=)kKSAo%i>)0Q*ld^r zyis<<1JZx5pbH7Dd(dDS5Oj@b-Q%z#Mk?z7UK^#y@ftY9#*}D1pb!zB*q%)OAy$g1 z=Fu$|C36C#s_KSJOB8|x_30LE4qT9gRExTN+Xt?d=~v0OxC;e~MQaO-qj@?_wKK~o zHDdrpS-T&z7~A1GCee!2mz=io#KG#sN&(h|?)#RoKIX{%Qxg@uyHS`<`3RqntpbiI z^rV1rJ$DnKoI+11n|DC`=bBr!{HM=FDn$m!f9_=MLCzmbJCj*s5B~E7ZeU-?7lf3v(8x&#k1LHpj66N-8{>}>UrJR**d^^v^u}?$mdE2quoCyOtGy_` z3yK<}_ztK5estt2FM9uq75S$3sJ~R+F1%Yu?}IzL=K|&|71a8yi?PR9tlf1oCBX94QuH91OQ{E2j>z21bkf*%uiPykk zVDk2z1WrIYdHW0sL0GsHZUqPO`^?^~)Q#-~clnCPBs6qr4i=j!)@`j3*@T7s^d1-W4h|M_} zU9tF>F&8j$jfc(=MY1+(D5;n8VhhkE(=dtUKOz4F(Z_HOhj3+pm)xy3Z&A&yG#m{k zHcJZ4%M=HOL#fTf^<5hyakEXNwC;}MWUgEzh>!4lM8q30dZ^$)j&%egKb5IuQ!58Cun7tu?W8rwy?~e&^d5@O(ed zrocVr6slun`OHP1^L>Ln-vd47``(UhzWagZG2d9GLpgf`r-LwyW9*H%9)bg8_U4}I zCmNmV%Wn^Os&`)g_n+#J;HH`xIMvCRQ*P?8|I7EGi8n^kWoWocp@&VhL`y#mqoXu~ zLGxw(DFjq-q(BO$fG$&F$Z}E*Qi@As`J&94J9Q{(j^dbDgvQ>4ZGxjUBYVeS+>SLc z($=q;JI*V;PSQt7X)5R5A{484cFA{rg1}6SMjdd2Fq=ZFa%g>wEtBnQT(V%H zoAhEV1=C}&)@yM`8xUli_Yqt2!(c?h2FJo8OA>cta<-SeJ-3Z~)0(tu{x>e^KAZ=` z>o|&@Gb(qmiIvh*cv)^0aJmHiBTN^v0zU$aTG^2RSgo0OO&2@h!`he=XZI*3ABE9c zk78Cahu*X-n0;|bZkWBIS;6d{>;dWCw@~D$_^~73CQa{Ai^(Jw0B`{_Z^}CDRxrCq zNbUt{85-F{z_iuk$}}sbY!KAMAZpDVkD8iGtzcHWZ?!UK-2_L)Fn$Ho#Mq;r7PT1B zsnDjcn(A4)W?zSHt8OxjSMF)KJ&1_S6+T5{wY;GeR^PrU{|Z$8S# zGaYphz=odyw`4^bssO3d-Kb4|z-CA{iPt;u+GV<|kIuU=xK3+_(^)tPlTiq@zV^#C)K!A&?WRMrD$I9&M5l)urJfaZeIy>Bgm!g z7Y|Nq^K%|9m@KV{94w~(47meGag}ji87(*G6xB$@O z?nUGsd24K9l-0O;Z@PHB9M5f?w+#@@KT#8AORh9Nf%_=)(oqKfo)?~hudvShl7a@~ z^1=n@h$ykWB`GSe8*g;wwwkaEu{~75(aT7^R zjg50yD|jTMGh>gmz1wlzp?B}0RO4#H9Si#)i4MIbAS$H$zNTXg@O-MCM7Tqli~Rub zg$0W@s*^LRH?0WTl}4cwbsmdC^J?G@p}jUS9#s1}3*p37vROriS&PJd>EmX_+Hkqf zJnAt-rk*ERuqeAL(Gp4%WVcgE^4>gLafA9b?bF3J_?S@F;$>)+D%L0LHqSdj#0XS_ zprgc=7Q~d!|I%pP2s}A5R+U@n8a-SClfPbWi!WUv?r|+%iQ;q&oDH&VM#CVN{8*ba zBAd)KXVxO%yh7^GjCOhk3a;DBO~S!1!d)Chl-l zV&QQ`qp6+dNMSjFiR;BS;I2c6Y*X)envskZQpB@hvj{_K8oh|!6$yU>asBaCI&GHM8* zKVE6EvBkPbcN-&hy%88h*COlsm+t!0g9f>8etNK+FP#-G)90vd!Qq}9E;%gXkT?r@ zbg+0GEm9r#len4|=@^O|Z;cs_>lxc2j+KB#nMw*aoiG5$x=7(S%-=W%y)w?l-YWUx z?_#CpSQSQ+(EoV@bc4;1Y>*snhSbuG&)r0_*vC0s#e_R+_DUGIh;-3SjM}~Il^?Op z&!4@rwd3E}UK!a&(Spv*UfFjc5k=tk%45**vD6PpcRh)PL{C`ajoK^2$N;(OJ%uG9 zG@(IzWz0pWE`6&k?JZ=REdQR3XR_oIz=mt7%9ALQRq}PHO&aOH7(+00#cP)-zng9; zzlcJ;y)qFcXVG5C1E35!wkLu>&NcLT(W?SQju|s1?f6DP&T_I%9-&lw`1)8Ro&<6( zq$<-2RMlgmy@mVg@ z*e*H*6rhc#z4FAX0O}0wm6egoN)6CnIWo{~ue?0eZLi$c$?73*p8 zPo5KdrAw6CUU@%XZ?AlW*r|Z+6-Q@U5gztRE(-sr+AGV*08?y+amR@b__0?WjYds> z_R8{!XsNYVa!@-cdu7Dp2JDsg4UK)7=h)wOVvsgquWUq(GqhLcpo^y3D|du9V6RN= zNiza_CCdpm8??Q04Vp{QZz=3QPT3 zGA-$#6Ju*p=*M1}jaSNgAnVPSz0#g{{bfh$`XA_8o9$$b+_$H_(hKEh-(INz4Bqz2 zT2`vsE5E*gS!ja2a-R2#KE-UiOvj@<_lr8v*EGCe6f?`cUu46CoYVax`#rF~PFsE3 zU*qxe{MlbZi@&q|weNHl*uN>wWv)R_Uo>C3$U5JFt=)jB zV>MbyPrni<0yY3B>4r}g1jJG6*7Eefd@n=5^Himd*Z=`-{1%%B@dp_lt~urY{r3h)aLhu2$MJ64;(m)*`lLl(9g+WAs9b z+X9y7xjz-@tH+n08XSVAA#F*@jT$LOYTSYQ-JGF#a(GU#`VHW=sq-oTEL zy8m*1Hje!58&MLN2KJ4{d+i&Yiw&aioL@3CQY#{&0$ zQJ#%>JsQ{i3TTG5ZT|v(RUS^iP&XRQ=>y!mJ{BzX)kUv1OF1?ibUNxd|$007?B7oz~!8!G@X=FT*f16(BaRsfc*uOa}vhHYgy%|~&yie{_;GF`!TN+OJ`Mj*J`Wu<`wYLRo44@jG z*4GhyCVDJJ1(&HybDa=N#xOeT%S`|wc%{%JVPlK6$ZNOg3EuS>*7b%6z4dhfrPMdK zzCfI~7(4^S`8vvdSzq~!_+}B7_#A8&Vf(eg%_0OV1xa*eaEF96DQ0l!WGX6~^6&*ts%fCrcI* zD%sOP?C|ds5~@(4SuP^|5Fa~o0&)5sLTNQ>m9nRAP^(Hv*ei%5;wimZ&oUt?Es^3Q zeiH245FfE!2t!TePoh}CvF>Ove!pZiMHZu>B}x!)PDDV6>8XtugdlMr&JrFIjD1UB zm(9RVTlPldh;3A`1BA#5wjVRzQfj>1VxBr)nEQJO1j&?Eg0tJ##Qc#4xtM}T@ShR< zeo7c3GbntQ;u-NF2wlV(Gz$4J+njB>lDrXY4vOwY)UfnE_VcmpX?`K)%LstQ$-sq6SJRYT#4YMN-}b zn!8$-^J|B+<|#605fdt!p?$WI1P21N>9@TE^PdJX!~(;RY@%`KOxaw;ztuag*2T-R z`KRF4DEX39OBA3&=xjerq!{ z?-xXooxVlPLsyq+7}avDVkM4MOF`H8MIk7tRzUyoYM1e9ti-XZkX|@eEvA3O!4s%X zdzYytt21SS;FvNAf79_QQ+{>08I3XpL99~{sXHYHuM*`~pYm6UC^q8{_!=A|zbfXh zVo)51Kdj)vk@Bk-_$y#@N)-MuN3{46nL%OaS`MJb3+rcFAe3gy@xlmvoq?Wapr;vF zwlgr`3=B9U9)Eyq2H={31~UNu41hl)2Y(arHwk~!1;<*Bm9-ozYZ+D?YdJ>OE@h}% z%P=~(bR~XCj#a<77CVQ6lw6^llz^rZN{qf$%DqUhQ4Fln=V&;kej9;@0N<2ImtfB8s7w()CUhM%)(}?|tig!p*}R%_ zQ3=YVX)F;Fdv=+2hY%9h&AQv&hdj&*W+tyBC zqYPp&6Mx50Kn~)`wo0J~3Fdl)*zv`WSJ8x&4hm8r#TBFoj+ua~jJ^*iL)`3sXZ7zd zhU((weZe!1!2?;t*^&&@yRMG-G8rfYKQYEM5rJ)>l1ieOn8%1M0aoC{UW(6xK?9I(V7BrF=H~rw zFlYR`78y&+iP`}u!w`jBF*H@b_1H-r1u*)SkEZLFI9BRJIufuKRQ1nWXws3Z@q|Uh zfq4tk+**+4mNU;(i%7=TJj^UjUxVeIrI70bi-=rDMLK3;7Wo+hEVZpX+hzqa z$O}EU3+o7&Nc;)&H|F9{DgBJ0pRKnF_HmKnLQ92)_$nihP&AkSnL7E8D>7;+y9AU> z4}!fJ^iP0JqQ$PPtBx8#w?10y5}Tt&91h{*AP5q9NU6X6M%j<$^V(1W@mBntC|Ytr z!s8nUfwsYyFqwE_P6bV>hAwV;gsQ&ccR&D@I9WL_O$0C<3nCLo)&*CuMR?x;{%Ij_ zhM%rvF-;e%?B78dPX`d8;-{|6NTKI`oc_waS`gFp>vbdzu9+vs>r7uN^Hd>ibJ9GK zhO=3yt3<$ZxX=@NZqMUF>n#FlynG203@RsARUTjTLOPh|Bz$(t2Na9;xuHm5P|U$- z6;g}aLqaGIbthW5|B3=^_HV+8BKWyq9AgrCZY8D6n*;lVr$K&ptp{X`?H=E&K(<3# z{zwD-?5nGE>Yi_Y>U#l|p46j+4LnOTa6AU41;lv%4(XdMC-GBWNFYQvPM#bIwS(hC zzgl+gWb#$RSbeOIBwuj+R^>*(GEsqJhqQB>1_=AXaK1>_hJ^qI6D`|Pp(QEG3TFv^ zKHjMJftEWo;B*E!e&x%=g?jnoYkc3+aiym{r4ClL9vfIKHrdiwCjkceWdpv z#3z(6oA)G?VJ4a#>H2E7wn- zmzDKXbd;mQy?!nmPm4pdembUmuAf#|H?)2R;^6kVTR&fcgan6v{cNQ&{rdTV@v27G z&udotiZDT5Kb_dwCVBl#W+N%<=d&dZt)EAK_FO-n{skNL24W}wg1~?y@dSET{0n7i z1PW;|XW(D>@d%$doqwUUHOYrF^)HA|HPydxqZTN|4!RUTfl4ZgVoK)HvI@e#@H#9j zmuXuK`4>KY>n!;f-Z-qmodV|kR&Fpm15CgApY0*NKE~E}qyB}{*D-$76#v4^$+CZ8 z`!50d7hXa|5C6i$shs|OC`yg_7j8mtXT!e`#z4Tq$l(18l|Q>dID7tu|4^?QyOo(o z`M6|7A=h?uxH|V&`xj1v{=NJQpS5rUI$`$zWA97gqo|Vq6OxdCi8Bf#QBg(-62T*D zP=Z03Kn8kXM&fETDrhtwL0!p8Mo>Y5NhD)C5_M5@b&0Dk=(-F3R1Q}q5hURd0$#xb z;(>ICN)&_$O8>uAue+z`$iXH4{=en(A=CZ(9rfO;SFfsGRlRWi!q;E4sbBaR93T34 z0Q!Zo1VKCcg>z|zihmLL=|j>l?A;zbPpn_~u&dtv^~!{4G*3rZzfc?rim@grzM4u< z2>rrhgxUDb^b4Of1&%1h<@SvNDU7)HC%tMSU{S7Va6hp zXnz>>3!9V(1MpgGU;rcojy1~dOHDu=5&gpGNZ|A{fwT0UcIG4Tp5Xl@(t3(4E^pix zVHo}u6Bvdpv>T>hcsaDaj`a%@A~lq4YN+9En)id&FLaAk|JQI-*9r5KK>dfJUwHPL z2m?0N)Q*+g`OWkT$3=qY+vq^QOQz`S>4@kTHavPH^b3DICs-cx$2~HVnW5jUexcjr zx_mVKYk?sF`RJM3L-Y%;eL?bqS--IT3?UzNNj;MC(VJfpXusz4T5vP^7_8BgYi?3A7;{N^I7)Mvj@2QF&!Uwd=ZL|7hM}7udf(LBWcFRTd~8F z^!4b;M-m^;V$g!|F`3eW@o`#~CWy4J?|Sw7mx05i@6=7c}D!%w|ACzzk=oV@;z!8GXy zWe>3C22EZ+32=AH9^i-1!{qfv7YO`62zmWE)OI-J^>hZ|pyYMC353HZum1?N3X|7= z9Tq^>>n95K=xEF9E)CEkvpvA&CP0_m5iYL}+PI5uOVYww2iXH$g&pd^@*!O9EiOB%BJ8U;fCKFst*b5ztFJB9^jSLCQgjybpKaI8_@e9;8N5s}xQYKSl_FJuOWr5nI$Q-AVHW$^yed3pWxNbR0&YWI;_ zBgpH&+#1qe$MX8pk0W$&#f5qF%u!~TR#0oaZ>UIQ@pD9FNAau0;xDV1h1$LYO+p)WrL4(!AryB?~9x=mM3F{K$wJFuK9yNK^AGe%R zVSVR|-u+H=aaYy$lvV)?uEvTs^0QoP&VOsf{Almb{Y~w${1j<^t~s|;9qoMvWs5P) z!b0cgkuUu)WzgIi; z&&@E^|0rIR3B_AA_?P{_@aG|w;IF!x;eT>2>aQ@@KbSHI_-Xx48X#V(JE9THFE9>!-g?5g^!S~@Jsi$GA>g& zp@)`}Dit5peaiT)`!U2Mi`LWSf%h%kO}iIe6*hhH!2pV?_>oBmmzov9`DBfDIc#? zzrS0RN7{X(?DEJ|->6h%9n!V<1g>rdd>Fc5R8cc^e!p6Jag_H$yrc6Dbe_`5%>fD< zEsOeV>3tXn$|Jrx0>!7R{Owe&JcdLs50gE;{2pc4*EBlX)rzf3{sLok_-aMI`vyVR z+Zvt0${m3UlrHaaY50(#fu&^lO8#F`H;g?c&~WkXm#2vY7y#x=OXH)KTM!f@N-N`%ZK}2e79L$?DU6W-2}hWotEivuSow69~$vr!T*-@ zRS4)%Cf&D85Fyr$5EpewU09(s?JSeA}d*DFsTKk9Z%qvQC!_2 z`KQ%3V@@dgJ7OZp!*uxJ1?#<5>CsjvPHL+Y(czt-fap&ssiG5nfz(4O@C?6FdHwn} zhUiU1JdQX-&;31Yh_-O;tMLItv_&3er^|4(K`Q@>!%^Ia=@~ihloDRQw9VenuyWD*ccM#Pr@V>&6FB9Quvp!g43Avr!JP#D+;}c~)-XCY@I0Z~K3Ull_nfcrWNsyN zj3~HV+FkhA`9@P5dm_rmi7}X8K<*TKbqew`5#eG1h=@5>(5!!qj6O<$98#` zl9g+oqi+vz7C$Gcl_i{iomwXq)GKeCMj4>RT&FAp@JsFZi2FML9WD~W$^ zPVQMLsblPPf!CyD#Klo@eG*1w^_ggH$l^vc;eD0>&LdEB0JQ_OM)}2>66a?WJ7#A2voCMR%n+`vZY2 zNN+LPb(~Gr9SZxm)PH4s@l_v@PNShq~euEqxrA0r=Bhw}MFT8u3BD*aG2lr6&m(hQ<}A5q>#_vyLhV^!O+l%Peg!Zorcq-FVs9Pk9v z(!EXkO;4p6s4Yv93bwobgTAB6`G)JCJ#u1K-1(qpW#C>D?C|vHaDk}1hGf~jvFV>; zZvA=nk{pfEaLa2LOX}ngm69?Vjax7pn3rx~KjcvoHY;%MHFlcwG}>u2oW({*VkhoS zYMOA|?tn|JL+8{SLEe%1)P+J?cSXF=vaE7W@sLZCEf2j2Vy(HMkSC6en<}!3hm6FR zS@@!i!{IhL9bRJ1%qq6{u{xt%%l`Qi{~N&fQD2(?vsu2$P4kbuyBnST!$uu@y6SMd zvGrzU&VL%?ORDhDd@_(e$2Ab)6|l)=D%0#z!Fx!OXdTd^waSvTyQWKVLg}hl zpCmOOBY)@u8*m?P>8Zro1op?Vpq#bRo~Gc-z=|((rdJc51m=4bZoJNpO4YhBHBPPe zWfi;Bm9Eli3~1X`xif#fv&QJxC06CMn~C&|1Zc%WE=itRq>gpdt6Q$DM3ww#Rw=v5%F0(TAPu-~TeJ+**8mmfscarn3?D-zjdG1azuWM z8}Br~mEKk-PHL+Yk31RH3BhkwJk6b8eycaEUchgCIIfK$dehU!5T%FLF8HkhqV_}O zw?>3Rr14t;h=Td8XXk|VSMXbN{>uH0$ZxsP|MvK;H_zAkty|wZD1J*`aizf%I4X!I zkbHT>2-$TpeyL!;n1k{U+O1j^m8DdH{8We^+VT(sL4UzrC%VK|Na2<&({X7u<$?2j zAWs^Lbcof2uM*#zCHcxy77|gT+oy=H`SQ4CqU97L55gE6%Y1KQ1DAwPD6@FX-w`kM zaWBFSj-K)htoN4MQIBeyf&7BS15amS@$&FmN^Bf-F+Q0d-2SIih(;p3_+oz%aa`h`(}a{qshg#M)?dF%FjL*%XI*|gT$k+(+oqzp_g#$sJ+i*eTy zeK8)Iymf%`Op-g2JTvp(k>!~kr5(sKmzWEN$}@iuAKQ~>HkTZfJTq%?1bOBjBz97s z87s;MNKj1IUAGF)X&rog))S#%ZAKC^u3|j<* zLOWdXe=kQ6y%l2zgUqjd{)6{Kpux)MKn=>~*ADj{c*OMYkC8ldaPnXR z-I^Ck9$YY@4Pj^GLt&zYkOz|_gG!PCS?=Qgf2qJI0ngX0IM|0@DN zcqew(HkaZwr~`^1+S1F?FQIou0;h( z#w~=ypOe8^+R|jqrE1&y9Eds2u@ikbj3~t6M4`1gMv~uU@YUrw8{gC_Wp2K+o+v&} zy%AhD%Xfh|(7*0lVJgg4GlB7;!+Sf~(qV)U-X7*MWEL=xgHNVmz-m+k@4FpF0{$zb zm7DhA&K>lFI?5^ZMVSjrQ>11Xsa!zG;LHz~0CM9C=buRV0U&G+ZVw9g7l_c$`WZ85 zSEWh?u*>^d8hDkRAQUy$?2Cb+OiTmiOhagMWyM|sa4Z9e>fc9thN2b_d}B5EV1q)r zl_xptEFC-}_Xf%h=p1Ae!^RLe)FF5<+_-On&ZLroOgZj?)oyviX#XHTIv90{zxR9e z>ndoK3VL@%h6EUF#JDJwGR~o369em01W-f*{=;?^i7+L}N@&KX(NMj_ZgR=P@!S(- zhGQ-gTMc7EBcXPYpF)Dys>Uu6&wx@*oI@Q+z`RTHirg!+ zE*I8@U4snV-2W!S~ zm{f-$25GA8roZ)!D*LoJaVhLh@cIA} zD;ZM0QU`~Imm>v6LOAL3T56rWD4W~oU5x+Bl$J3x1-RGB>WqirS4#@JUJ%wiA7}f# z3+SYguE(MXw1r^0*C~~_oq!BiWY1hi1xY>*(WjeZWak2RK{XU_WI|f)E`TxO$WSX% zEddkm_T6da3~WU@GH1ANXbIlgiqup!8UJwAKIcrpf&ZSx%EdzfF>8hv>z0}Hp;mDY zG&bd##HGQ4>Ip7!);(dHviNWrK42Q3@ZD?oP19Ob?(8_9G<>`J=&YjPvI(w$sczgU5Nrl(2E$#uLzt4;bfdJkA*U+$WkI z!zsJFV3gfm-~rf-HGr8xtTt$ckr0eB)kufoacl*C31vzQ+&H~0n9pnrW@|XiTNviS z0%lDm*0ckLo23`Mus<~_&hilAD-pRdh{j51d{ovFaB-j)w)_66kqujqFtR~3gD3!q z##f&5uLaStctA}2w*B+5z_xbyQ5#$wti6DDrSV z(E=hHw^I#cZ=hD?YhnI%EzG0$Az-NOG77ybCw=f&d_Nc8ksa~yZDmgqrSRLnQZ3L5(IHc%n!|b^ROW4JRC9D|4(|b~5p2e!I9+l&%zm&dKN$e*s z+-k&t!Q8+Ba|21gYHQqeb{s2zF$y2)g{j)gAM;>(JucidZP6Unp^fGo|mRlg6(F8sFiFkN{~RD$f<5$ zq1_{M33#&vif5^p7Byop`&IJ2$+=zf+*T??z6<_`I7!N^n>3s*m+}8adtW^nR^lSR zH1KC;J~BsGy&wr|l+-I|WG=(jxe?a49lZ(m+_u?ZpL28}B<2vCxg~xHYJhKAsqWDXh-RVQ8Rcm97N~H%owzy?aQs zrR?o4u+25@2XV>E#MgL9##Z{Y=#D%JB#^x!;p*WYSmP>fY;~2kCft`qLrA70%5&6K z>8J#34}8ZCVFwH*EsN@!kIjSm*?&UEtkz4J1tV60n{QZ~_335@Yx=tRJ zow=>p;_^R1RyHme*!*w@G`9uoT=FQeK=5FYM-`4PNGy>`e~!MZyZjMlx%hO_b!^kR zgobD{VAEq@Ux(c+K3mJwZa4pD4!YS7_-hP3EL(%|$`XQC+N=!R#A`fr6yw!;rT#L) zD@>EXE6iYGgN9dnmVa>;G$8OQnPv>#B3oMAiql{zdm4iy`HO&CJK-b(+}dq@9bLHV5XE?oTIZ$@n{9V?VyB z>!0)>L+o#sPqx3QOjYE#Pf9gL5uQNo5a-7Ib>7p+nHu*$Z3Ff6#ZZ2U*hG48;5TX| zm8N|AeIrP8DXf#NcLJwz zm5ORx_&7@QWiCsMdm`wP2=bnF11ONq5Bp$mC|!{sdL2#V_!(gD(Ul*TN`Owa-A&aC zdt(R9`(S0>Ie=PjkgdL6pd-Mxu?fnghjyu0fWA@502Sw__@9dZY51Rk{|*w*Kw+km zI59GZI_n^+mknk^qORd>_2dgAKV{Gf-pD-fvAnz?R7uJozJxoSd{2REax;0=8cQreOa>W2YM4nRIAf^RJ$$~nj;iekS1y@-aA|IrG!X)H1 z%5Gtz`OQjk&9gARlx|pqfcO zSSSjyeDH1Z??FBo$q-??J1X))!e|vxq!THL*;^dk>-}efkZllpjqjxDDZS7QGonwI~E1@ zLgXjC@`Y@hP z$OFr7VV*C-dBIi1M_3+cMFbD(MI?FP>Er{E2i74v6_);CKQFjKgD^}U_!S;75#_GG z^j*g!jrXH;`}=nsx^=Mnycel@)BZg~Sxio{ zA^N=MrtHFSLZf~JHG0>r>+BAGKIc4$9lX=}ydHP7vwv^@vV;BmT@v_c{~os|Y$3Lz z&l?F5MCpHmz79LJe~&IfnGdt|h4?DieC6?xV*kEiH7~yYl;wUcZ8Wdhq#j69ZQlEW z_V34$7`%Vqh?KVW?LQDAm{qyl{z-$kPS?u47!Hk6I^IqTF@&5g=tdWg=JHyCEd;9mXJ}mGZ$LVyV zGy8XssVMR{hfX%8k`!>=@bLY+U?r1~ukXe8Vfe0{_y6T?v48(Eg7@!t@maO?zbAPA z9)&i7$%zdqo!r0A+okW{ji?-jc>nGl*TMe%o1FLG#Sk4WeO|@|H0JH<^K6{uQ1y9R z{?G}1-m=4^&nr0ZaO?A41d28#0lFZ4UW*WiwGrtKs?~fi!dcE~+ocF^TeZ6uCTF;ih32NYQpZC8r1>HR3aOm|K(+RKI z)$6^*S=!O-J;QpvDLC)n$3`j$ZTGN`(paxI$~c2}%PoA~4-+#S&j+9PD>OyJ?YJHr zQ-lcH{auEYDq?^m z8NtZ>h(K2mHO8NKyp&$&PT#9YWfM37DE*rK+N#f`o21ose z1PBlYB1TS}@9R!B%lXZxhGhLEgR%-j)Ww%Zc1N+)s~kz5NwBH0fEyM8r9)c)QO_1H zPI*SzagyHxOB4R$$0H0%FtshPFY>|)1>yUA(b+Q0*bt&-y>d4~n6o7}Vsd4T3$o^h zeJ|N3^I##koj>lq2HMRiD!Amk8zEF{tWs@OGFxK!?zU$8N0G5^A;eBc#So>c89R{g zUYIQ0n^8N$fh7hI<4*rjh<8n6r@flh$^keFgF= zwQrBu{yWPLq5VI-*NOHEwf3vFN9zAmR0TxdPWB)6)rS3@{4MOOY1U!zSS5_`@-UZ0 zR>?Od*(tYXQ=nrQR)4oU%L+@fddevy`YR@z!YR%d(F~Qs4}U_a$3{uc1@0hr>GAyJ z`y)(&|Fndk5l8rBEj}d0ADlah7>G6E(H4M#f>*e+0echt^ON_(}R z5{P$)`iDiTe*hBQncF7CFN|)=!aiV`IRt-qkF<8Nl$}ev5=a_s59Mf}F`EQ8xaIgP za_n87MemsncOuAcM|mtWzXD#O)>uo~COn}8MxhSX!en_qS6x&o60wXZu^w%xIYl@^ z_0;1Sbv_Kvi%)RLI2NiC_H~p%~ zwc^Xo%Pft;WcqHB5ZF74LWxR@g;*sku}ZX$Rr<#&3Vpha9}tY{ zK)qzf0H8WiZxgCtj8}=4K;-4H+%j{sf$AUVsD4wu!0Lq>Rx_&K)G87iH2enw5zZ}y zKT{-ZUr65x+t;Eq)j-~Q4SCOM1KWcNC@9dX71)RA32FgY%Pn&YII{wczKav>*%?x&N zC!(;F;K#TqBkX>d=Jly`|I7%!e`YgYly1in8{Hr$_>%5;KNTV$S+pnJhDYUZ<2lgb z2nyUDH-SGUy)hJ;(WO5e2Ti9x?jlMnU6E$k)rYlb`PkH67rZEE2HLxCqtV{IcvQ|Y zw|6&xOu8o%?YXq}Je1aMdwtFAoj~om0_}bOfze(w9+kJpap0a26u2j@i9aS?cp=)` z)FS%#7NwcnlYEz_Sj{?DXbm<&%B#kpL(1y~+<*-IbP5@sx#cggrf_03*)10)WR*-i z5o(DvxVqgO@E6LKFLcV@-dVeG@dZS{xhUp>(*h7$V?g&1cPckP_mV}CxgB7^6P!4@ z>6%rV2?dNhv(EAtxCD7qk?4}wkOIbK9pmqLyj0LlO5fm4-$=RRoCxh*=aIWLF9(#j z0NALVSr#i#tn(HZx%k`CeJg;y0e0+##bWW zfvoFIvhHF*zAX=tc6IudE;*Y#?IQ}j_eBtRMWsZ;=Y@y@h^I>e@A@X(+N9FA2%>In zKnR!_K?t}C-Gcjeb#acG(Cj|AI!L1CIv_54REMg-eD&E07Syv;tz$L`&JH z`$)?s2nvXMHAckbnT1FXM33lx4&CV!1c~kdVmGc@=Q1Wpa5|KKcFSjat%l%F?VwpJ-f2jqmnoK;p&r55XDhqhim2L5l;@c&Cx6@=8< zdNJo$k>8@_{~yjDzFtIrl9sn=((?MCYPGduWXrW^(()dCosiez^eb>Oqc4+Ci8<0T z5%tkB*+$KU>xC>$Bs#Z&;_-oHQX65JKuHC%i)G@$GI1ST9kfii4qhfVrdXTfJ@U66 zIVDBlFg{~}Tu28RSUNLS5XuMEhPY(qp!VxqO#8L1-TnGOgG}qI=CJSAKk`0JBE{se zeR?v6po4u{Y;OMX`sQZZp{F462=CBAz=!P21bhcO^9hx_HLoA1LvPxe-=IX=n#Y1v zSY}>^zxviZiit-jw&tFku@hVKPfTXOqk+ye8FPNHTl0T6Wiz$;=6Aa(-=c5Iw}foU zyW8KC1IL#*k86K_UfkyXTn*d|*`LP*?a$M(`|3&su<*Qdi+y>S=?kqg@W7tQydM+O zYMDvL^xA$rf>%Jt`>|Ll9p;<4lNSo_#|p2L-*7*sBjBKovxEKkjdu5A?7B{vWU)>G z%xPrxgV;kUD`E_A);$6BgXN*HeK}MGabWv0ZgU{^)zU;u=HT|!-)>(X-tNAvFA>%k z*r7>S^O}BAtKDDy$rVKOm($_0pu3<>^y z6^x4gN!!kbis7zCQZZ;Z`o2pU5Ol%RQ!zr^Uo$+zR+`{B4=>8kK;uw&wvG|-Tof6e ze=HO5oGRd%c^2ULW{U})a>~#tcph6}g69FeC=(*UlM8r2tKwd$O(pGU==hv~ax^{< z3wZhu1Uy%m;rVHK8}Pt-J;O9xe-hAS@oeSeCB0hm#r2`;eQ|dDAdp1*MrF|nu+s3w z#Ur6Mj_PJx27l72G%=rV7P_A=M4K6UXat@Rw3n&{!MXl&ASk?v5hd*H%P3TzUt)y` zcxhM*MB~*;mRR(BbFCveIvN9-8dMo-42stS(XASy8(CgJh^gnT0lK70dY9w=?9eT= zGu-lCx7>t?Y}qh=u}g9nI^nM*{hteQNMh0^;y%L4Anr)>p8VK3Gu=ZPh<$Nh$Du1QvehLGav169x9f=#gdy}Q<1TG z5hcOGMt7-3qd0F9jizdiS{98!`e^P+D}9K8Ct}$M=>H)KO`11 zsl$c3&2icCjiLpvJRv)?(F<(@j(a~~P%C*z1``OJgb~AGeYN)a@kV?`L_?oHFX!ag(y0_S|oV;o40jnj}(jD!^-_HcYJymy_IeC0SSpp?4@ zMn_e8WQ);ymiov-G>>+&Qwnv}89kC35aU)PK0tGJBJ%t}wVit@k?M6?a*KC6Acu8@ ztrw>YV8zfRHw_~Nsp_2HbRj(eH~^*337Z;J5#B)Jqkfa?fIqjIN08)t0?W`vEU9(A zi8>H$la2?dCkqCkCx{J`7v(($KjWe-WuuAJSpxKoD!J&zi~524Df=g0P?uF$L3tBa zI$MEyHkK#+o>t|_m9Rz5DqR;X78jBb5zxx93tL51kkoPOXM-NTFjk9RI0X`ka@E%3 zv?v2T1JOykg#<4InxS7fwNIKl7G>f&)E5jxY+J9vYn=^d$pD~B6XSEOGfe|Eb)_?z zKU-4AzrQwts%in#7*tin zSrj4DXgT)=GdaN&tS^di=9l^zFE#JYOtij z2o?r8n{YPa_243Qh$pzd)bH7*WZsH3jObO{=zdo_!bP1$YaHRC1`%V0c&)@(+4({U z@KcjHGm52D>{6Sy#UMgmApllwD=_oe$3Dg$N%RE6P^UOv$2F&jM7I(jpqY-7<^fZ2 z*Ez6zE^!~$INVjH-4<`>n^^^9^qD|woMHkkqt+=iWX{J3Fz+maD}yk@j?8nF%N~fv z0njLr-d@V!4Ro(gyyP2&(;Gz2qR8-e_rP~tHLY<70~c*6zY_x`cgK9401IG*9Ikd{ zR(rdb{=6UYPH}wG2m06H$(D1f@3DD%Sk8&N1bnFF!HZDHQa%`emGZu@&E_*ay6=$L zQqN3fOIG0cj$(QefG{Afb5cK`eAj6^oJgB;tM%#!aK}v#C<%y5j33|J@0+iJH#4Xc)9}C5#6(Iyphgv=k?6_t~<( zXAACtqxLfUcy~y$MYXM?gwk4!>?njaUg=%Rt*N#}NDrPdOzZV8YtxGJ2UT)-djfsu z>5E4XsM7Qw3>$2fu>~Qt;V-}$q5s8=y$RAlC|G}vlhhii=8HHfW;GCGfigVe5KncO zhnS|HhxpwuchiuxH^e8gJvjGwhbzMPeu6}*VzEA6coMU;j8id7y>Op9*?TT9%2Pm8 zviHR1`xGY<-5_iu`)ckJ4t;=>1LF|}ERIzI-GRkCjbD_Rr|~Xh8uP?7mSK#D6m(+# z`e^VN^LH#IM3}$bQiSFxh^J>^THM zViVh1=P)xtB4b>)FCW#kGG9$rg4w>CJ|@F;oIT|wxCSO8P+*+KW<%sFsFO0+OtOKX zG66+G0~Ghbls?S~O84t=V-=R-F{t`9>x;(GiI9b-u`z;Pb%0 zj>JgNjB}9-D_xw*;yiDcd9DagUm&EFKQpZ-z#w!!eHavLr3MIbcL;Fp_o&L!V^mde zd%5Jww?)Y-)rkd8X++!0lvgh@wY?r_hbX|<5|$xgr6eEE;MvFSCh(l=X|G!VBm^RA zN5snnYTi`KsX)!%=JjkDrQ`Rq0DkTrDe!xnQ3*&s5rmtt=0W~V_`M!k1^q#?j^A%+ z z5{cNq2>A(@P4mbFkY~Q4{n)$!40|U3%PEb}$UwZbW0#a_%M*Z0x`dfe zNt%VMnvEcZ`Sd3boH6p`J!AWK}ow`fr5l7LDEh zCf$E582Xy`ST|yOm(x5;6nB3beM{L=082Aa&oe;7p0pHscoJwn5W5q9F*le5%Y)>b zV<|7kUm$(8J`Q*i!%)Ym7zO?OXSlu=ssn4`4J2Z8I~YgsQy9R9^$LOpa0*hJ{*0Li z&yIn+oaWMB2cVP(x`Jdn(^ugGwol-hpCmD5%XEWqHfV&iQMo6>G|(-wvjKc-5h!P) zPB{rRwz>rAY!Rp-I~$EoH)@?$(CJ2^I@3c;SJ2i!?y` zXVi3(#vjbm>k@fU9U23RFj=dPcSVgJmGg_Jj?^}&j#E(G$)t~=;T&evCqC)*_2+c4 zh-f?u)f}l3i*$+dp`CaOtdb&SH68;iEjjR*KzQ^J$H=EDf`u0>ST@L?U4;3fC7WXn zo}e70D;M9VPmn*2@-a&LGw9R%7X+rMT;fVV0?H|yP6ULw=7$0c`TGip{YCV0f_MS7 zNz|a1bcPaYo2EvDk%u&v*R+}9$#;fA!e0*APGMqWWztCRN&L=3A~i3j8k=8{U6?_8*SDDnszI!Ae+Z-9m_G*+-i zLqnG@(a>I?jfy?ElB@%*WFyfoxhvVV(NRp4ozV>)Op}P5i1%_h1yZ*yWs5Nr=sa<0 z$FeMgg(V;zI@UY|5b% z12nbC$+V!n3duwcl2JcpRu-PZi$pZ`99{@92zUU|sx74`VGSU6uadg=NVL&CD`gVhBSS{z@$>-pl&5kHw0I~R-^{31>T8E< z+SXfiq#oa!$QDPfB>IV=^UU#ipgGB{!k`x^!$h@CLb>u1>NB!9Vra-=KBfMbqNy!mr;Fs3c|pnP^7L+;F{Ca7v-%~X

HYrovU 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�!lesON=)A2$duv_KCH)nCvHMGe4TP+P^G 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�>=duJDs)#|ov&}9u^?{qIG!esA!3Ym5G z&QFui-rgBBKGl{NrM;8f2R-qry#AbsPlb~={u}wt@u`GAXPR@u7)4DThrpSL0pce{Rekgy+$O5U zsA3_eyfLbp;QLH34t_q7VcOH&m@H0q^DvC~J z&b!`Y?i}FX+t-)!ILxOxK*|H(q@{BJ_vF;zo#D1Ld4pRzzh-x*U*~t*+1)SV zZXLTTr#oTk6p^d8YsvZC(y0^wK%SgT{6qBQbg&v9VD*P==~T3L#pYgqGmP&!b1^a3 zHF8zaD(WHawOUy^6|JM>B7i!`$W?vYFm>>WTy@W&QUt)qH`f%rYMZtuv5K5H^>M3C z3}!~o(wr${07O{4D*6aTP0es*CTP#}{1HAtB^<-_E~$-ebLoXT+h&@_6_eZM@QoWh zI4RtrZ_Fx#2PZ;S3CGX2SArbbHv8f?6x(Jumai7J&A&Ee)xy?B+vZ;rvg!&@WwuR( ztP&oaA7ddk=dGr{+_w1+E@9ggA*=G~&J(hVJUAi1_%2j>a57t^!KmpkV%0DHjhecM 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�GH$FKxIyE(OBu}Om?I0!)>sa+X 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%0AZc%_`Pg@I>b_;NvnucGJZby9$I~>5^)8&_SkJp; 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ⅅI$D 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

p__Vg$L;5;dKtm|LK#c0#m% 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 z zHG8&eO5&atJWQs2G@{9q_~X2YcS_U=z96qC556sRUdPqXX`MHNdrHh_9?x%k2_I>D z6?5md>gUgMA3NWiA7L!GtHkrM;DyrAey}9nKXy&wS`*zvcm@xa91qUBz;(@o-^pa2 zT-cecCs8N(&_(tk556RC@*3Vgsnv%HJ}uFQ;BWGYI>F>(k5fE&y>xuyo{#0rtVcMO zuXJtxk7M~7`z;)kYxUt%$Kv5q=SBQnQlHr~xYu>s;d%T`3Ot$GnOrMnUdD~CcmLs8 z++W7ecP-$Xat;rEAX9i9d){CzcrYUm^5C*JI)(>#D%lf|dif`LLJcE-Yz6+*=U$?!1!{@5Mz?|d7 zlIJCSUrM}=YrW&1&oekd8oY>er0ZAx#6j=cdpwQfq`(U}OQ!HD_Iyt}Jcav7gXeL& zbp2*rIA5|nxc5Bs!-FTt7+%B~5_N)WyzlXs2e*=mJcmnu;C|;ZH-#^?y@rqepZ=(m zu4_-?K2yNYWr6bKL;o*>f45h0$B*m{p2H(Q);=%bM^fbtyz~?O<|WMj&shF2pEzGe z@&=yzsmEnr#2=-?lh4e#)OiUz=3Apb%@3XoF)}s#2;mDlrPjjc~rW0(+3=|aQ|c&PveP_=SA$bNdIIaPvH$RgO_oU zZvC5kAcgzOeB}jvNaB01s`&h({ae3h$GMC3Pr4R0M%;Dr{z;DK@ob6ruvKxT?yWX6 zc)E;Nr-X0Hv^W+QS)x@xi8dNn=@z<1-R%CO!HmJ4r!#9uMtk^{0U2d-hMt z%8U5D%;iZheULadkIzW#^BOMKyT6}b%@2-|3@_jn67|dYjpUX4@Imsel*0RHQ<`n! zy|O@g6`$|ho*$gsuYWSQyD{Rfo!a4fJX_+}Dz4POJwJH5OjM^BWio@;@CS+d$pB-Q z`OyyUJkb0v!SQTqwuwoXxm7=fC%3(b)wTy$U#e9ngN3#S-)Vat(@VGN1alJe7JN*K z&RfMsyF8d)rd21njYJ=E_?T3pJ~kxU38t5Ac?S2CsGrA|rLKMrlR>RI!A#q;c$h@} z0=_4yCCxMLwOoIH3)4DcS>jy5THAxk^6fV9U@1g>d{4^J4sM@z49{UvqMhI@iSt%* z%@wrO!@UCUlnk$8Lz-j6^olJH=Gq>7K=M%^*IdcIigxfisq!+`B-#mXys~zcXK|*a zJIoIztF-C_Gi?v%+a7#Ia#0^QUe$Pb7Vnk{uV7u`T)|ICnR2Cv}hLyV!9J&!xBrG1{m z*;3{;Tx~t|c?MsT=A7VuLtCE5uiM_hN7wJ)e9Wrie*ZL|y3ijA>Yf-|z z_i3Fsk8@?3W9zu~f##fN@HJ_!9qxBfyU+M_+Z*`k!L4?xxZfCSH^AEADTio>7lV=+ zXdfQhKk0Y4>zAkTiX)VFnJe7wXmiN(__s9o>M{B(%|7FxLd(fmoOeih{v z?Mw6_kGJ2iedQJW@iAkLI**%wDGxR-95l<=cn&|4SeFJ4e4^F2G;Y)O9G=wnBChac z|KzCE%>&MnGOytdRc-PdJ}Su?#)X?aWpD5-ekgg~z>A+YhrEOx&lnd^;W&x@6mU-4 zYq-|4t?~@ckcRqIocWx4%9g?(d(nBlFR_59%XoEyze|w^|B$IXd8vQ$ z^viL7G!}g76~_+Y_<_W+!F}d9R(Wt=nacAxU+&=z{QOmWFC53d-s(>QuYaS}pE4fw zCSS{a02fG=CvVxS(g^>rbIxrYTg2(_w2rOdaqso_dv1FSkDq7G!||98-A~rhCLZvq zIvIV#U!-{re%3#^Nv8e7-oS6?>nCsEWuI$*UDq%E-xt=1*Kzij=9<^=^M?NL1|IQU zdyVki@7<%O6SZPsYfDOUU2^nj$s3;4PeHgPPj zw%h=pOHv=#8Zsc6AC5f_;Cs2z-u^f!hmGt zj{1xb76be*JcXqz&BJcy77xD8F}#5Nt{>q0`}7T;xxxJN8vd(1AnCrleTXaFY`u5}tG5jB z9d*Wwx!dfAJ?sIzC){g973_I?%Tu__v;oOPb<&u<%R2I4MP~5e%6D5Yp26|=3`o*@ zIxoH>Q+XX%oNg`r4XEHtGFy4@EtwZ}@bG^RNWS6)?Dc^0jy86@=0Wv&8Ar@8uD$dD zUz}+yyoN{5GAF!%vn2lJTX579uARL%ZSnwq8qec&i8{e8pB#`(QXbq{$~=d2rNWEV z0m-+rfCm?ON+0&ww8@qEvOJ6XNc>K`__X@cywBjd&)E0sl<;n8{@xsSf7UgqJddYJ zl$UUo=UfZQGkA@}V|p3uZExU|7tQm&<^(r>*;?+W4>&@fu0F5T&kPpY zUc|w5<5DMsFMsH~2U#!d`H?+#u=T~~J|2(^<2Bs=Q~l>T-0CxR#+VJ*$=iRh2YB##8OCe)g~YWSJo!gsQy#or^1O@}{bU||XG#e#{>7Rp zFJbrJ-6MDkFOuf(Wbxp?tleSu1OBkcz@#)b9%}|Be=a&OnQ}N^j4wVgnH%1HU^2eP zz@+O4`w)MZXea3yn4H~bV3Ik~x$xqC1AU%_fZq@S=5$mzQw)%)sXUOyfOmui$F` z7}(sC8GKTjKVRSu>$W_HFG%d$8XmA-t2~ciwY`Cd4QHay<~M5959T*+)ertIHFc6r1|~1dJYK^ahdbB5oC{}; zFrQcZ8&mj^JplT^~P^W_>(!GyRGBI8`c9A7^gfu8$u{vp$}= z#lWN*^>M1qjrzFr*4CQmaMf+}!S4YxxVgmd;DV<}`S?wnEbLx^qj~Un8Ow{60Db8G6H z6OV)HzhO>z0k?nCSa=SH{MR|owNLQJx6L(A=DPR1W6$v5Qt#i?fgxfJfC;*5^nc_zWRMu4wwADmZxz4PxW7&Jl_Ac za$d#HCE5%w{*AplanmLT@}qbf@BMCIavHDTZ9fe3Sr(4zAMHgRyj;3pXua?*iF;J= z2`MWNej*R@;N?HrKRkG^)Oj%Z*?jWgMv`1)jqu|?oR>H7ibcATDZGqZEZOC=D&`-b zkSV;1nI2uqCKp=^yi4Zs3J&S$N=~~(Io>E;M{V5XAAH$MH%)?ldODt`aa)P`2_7a{ z<-wC=6ffe>GKMF;x{~qYOEZ%q4)5L7{QCe|{7&LK%DpJ>wLSfeI=G-S${pKZ`M|EE z`(?^;zGQg=_wMRSKH+)%bE&T6oXgc;y31!0)#GJ6dD*V!J*|j)4QhEFH(ajeSxhb8 z)%*-;u-^7yCEY3y-npXjPBvF~=gM6^E5Y&3RlAbGS8+US4gI{@{>Qgv=HS9l3efuqq8@D}+V zH%f+=@f*qW2F}lR`Rp~v5t}K$S$*6`qRl)$DJA7q?6rB9&tV%2UMCG+#$=1GBz=oD z#f-#rx!`q@Q(neoOY;+TFeA-6c%4+D4klY!*QkRTY1YAMlDgH};qKdLljrdiiO)3z zACPIvgYU@WypBhW>`GqY1>ARg{k+Yw_@y-G4ae?ajLHkxe<$R4PM9JB>E5>x{H3^v1yb0@RfNUzmlQ6f%8Un`F=FV;<(*geJJ2_dl>&Tdkj|@ zZBOzHp1YU6@e=-Xzpi91&*Gp1LR>hmlXB=$^j zwp5kZFgdy>_lUvtv z7H^aI++1*ul+_8YcS@J{%ye5obyIA!EefPPgvdAD>BvOPOc!Hfgqrb7Z#i z;Ce;-De7QBnq$Xu+k>^X2bVg_`l+AB!_Rhqe%M%W<~inqSMi7o&3TmL(k0`1M16ee zO8b0<`NS=*b`8$7M)<-M`@X2Y`lvnYXyWBgT)PG$5 z9@jQcHpK#2(Nre`LnJOeEv1(ecpKS zn3{Qi!MSj~*PVB^cJO9t{#^xJ^$lyMJcC_tnJb>gKL52ZU*y>5ZTmPJ`^?p5IF6TT zyoeXP>)PifoG&9^(trGQo_aiazbkoKntww8FaMzBW&E{nA4HuGJ+^+V{AKfug-@(0 z53ct=^Z$ze=PXG ztu=eqx$vCt%q=hB`!fGE*D|j4y>rx@3nxgH7jce^HZ&c{(G0#7W9Fau-hNzou}}6Df2Qe`=>SHX`Czzq8z*Z<=S~u zeLPe~^8!9EMP9@G|28h3$8TgVZ=g>cHeZJ?<01P`u#0TX6S-KA}C#$>- z<43Weh-R&H0yDsXl&Gjdm_?hH+4bS?A@$)>czNYc>1fD4IdANYP ztz|s#S}S~B#_|gGS=&1BBpxescpi^iM?XA=r>xsp+dNKR&s^Sf9`I?Yzm}$3ci&1i z);5DL$P_iz$nM&C9)FUBJoGS@p7OqN;;EA6dHg|gJoM@wZk8Fmh^O|pwy_4=`nYzH zHNi(D&C58luWNZ4Uy&lO;7&~4#c>({B91la? zQ|kR-uIZ7*rbl)e=D%Y*}U4~o#SdSM-_}G2%4@vPb0;S#$=9(T^ zYoM2#$ZMs3U+l6$cYo`q9xsq`yf6MCwRqnR-B;@UV6N$r#imCd zyHWR$Tx{=f!ANzyf|EBk4(}12$MZJPm)}hnu8XA_mA%GeGomS@Wkz$zt24GuX!`=65_r<3tIrF@NQ;)X(-#Gs` z;+RICDSWKyWgK^G^Iq8FxJLg;oG&YU>pb8KIeW<~IPxTG#nYITdB^y7I^HKm?U64_ zN36%qPPP`Y9%su^Ucx`8Sm*CN9#8EawmaSPB+uYg)0}f&#LdrjPJVDL?r@&|c?KVr z3NPbI7nu8x_7V5E!Z>*rf0x?N`oFS!xL%UK=o9a}%D(Utt~?T~bw3!s~DMJp6}#@K1^L;ST3F zMtcFDywezX1+SQE46z>XyxTe~(+{@YYYn|NCWRC3Yn;z4zAp>ZRB@~O8~vwofh^Tt z!7Cnc{h#{8J0G;pyo7BJH~Yj1^P7F*`_lO@ed3FcSX*AfVUITFh#gYWUdD4CH(y@B znNJw=-|mIoo@(@;#BonI`p@8e85z>v!-PNMTt&zE&w6f*j`N?h4$*P&0%Kh+?cX`h zxTJYx<^}iSksnKu*KoZT8_%&x+`j1B*C&21 z9lVC4Ub7~hwBuZf`&h!mUT-{ha=78!?yDw^|CaU@(muz*7#5l%&)~n`)n{zSuJ1Ma zN#JWAs9(_-aMXwPk7w|6S;}iT>SNE3D{05MQXc~zwzxS4ob`ok)s%4euiR_pbjaeB z-+R1tPKP3n`B6L1;MCu=uafq;0KP8#p`E93!7}ZurhSe}_t5_@_vI-p|J^<8&m+e! z*CTZB4BoPQk9tiB+gIq}`(^#$l`HlLZC%_KQ!DofTk^;OtMmvnqT@aie^wkhSxVX? z&zEO-0UwsNFWsWf6ISgJ-q0TTwtUU2c-HDY!ZM!6+a=aV9=t}6FnzUjozL?kui&w3 zxfjpjbrS0%cU#+Bx~A)Vh-Y~j59rn-+1^uj0zR8}&)tzUf&!zv%`1PLgXlC%8+W9wEas zc#q_H2|r7kZ>+&_{Th8{a9oRZj`eunfJRLLFBxQB3G0t94sNtp@RjwgkM;_lGqgwj zcL4?5f1@7ZC+%5Wns(nc(;vOEW zZ#>bl{IPQ~R6UkIQ$LL3ds6@Y0oPh$O|&QR28oa5B0eJZ?;G)}riU+jgxh5H@c6jy z5%&JlwLFU}e`Wk5tPhr@z#}*Rx|xY)fSPmtL>k2n9&s4wDE66+%m|IwPNi9APM z<^{axr$&7VUz1oLIr--v;e9ocSIAGih*N&)5mwm1y>R@m4bS3cOBxn(q>>1ie+6(O6t7lje9S8RA8QL~+u5gEB&yeRC{H|Zmu#ngA z`Zm{YYCQPt(4L`#SMZfh^wZAqtxeT$=4{|^oA>k{MIIMh^bB{5>KUf+5`MjH&#;u& z@S9!ScT0}HWO{~fTdCi*XXw61&yeLwd}2@c;$=K(@1B0IVjZyaK0QO`pXP`&_U#$w z@FLz3-5HB~T*B7rIzQoS^T;dqb6*~Lx1@Pw*k7MKa&yV@Ga_u%Av-t5;=Ccv?3u3L z$y(v=xAgQn0(**`Zr47}z3~2ftT`{^&i8BI*|j)wo_e0f+aA!Tvt7b|4>sCUc&5}p z!xYzkh^vq6D=X|`&GA5qYna9BI@D<|;>3roQO3ORHL1TR67Ds>XGm$!;@HRBmuGPK z$DId1!%W~)O|RfNPc+&K_uc;Ii1xo7co$)31no%48d-*kxlpN!;Hyx{kqVH;k+mOmQTrf^RwXpcNk ziahcrna7JbbD77O*US_#_h;jrL|!E0-8b@Cc}9KY$Fh*uF!h&xblxvr z=NG&ekNj1J^6+=h@Pcf~BWH(RVGkbptW4q+yk*s1VG1wdyso`M`~J=hezr!hFrC-% z>_o3n;gNHs$|K+VN3XDyM}8ySCZy|Je$8H?jVJJ0Y3GrT%UB-y{aU@e=X1KwPHXq_ zZ_0Ft>?Q@C#HoFHg(5HDoPO#LFi!lnrB^8N(Ap~uk@z(tjaLkC?LpQYGlPtiM-Ce7 zzYn&CI9cZKJkFK)d&3gmFvR?|7jgX1USSE(;!_gOa0NFU*6=jm()1Dz9NsIWC+Z(> zl}WsW14kH7Y{%mzjx&$Xrh0`A?G;>U!(JgAVy$rFjjaz)*^c zZ9gXI6YrK1FX8HAtOHNrmD249>xLU`W1KvVgT^{PJcaA+WL`(wQ#?-M&k%C>ex_Gg zsJ)6i?b$2LILf^6(S4ksqn$$>y01PxN2PG={;t)Y!J^cEc7%r?*zg<<%ewX$_r)Kj z#=}9q!od>vF^8W?@>pjZ7apQtUd5{q>lMnph_bDT4P>l|sVcoJWd`29%*N1mfz zdm3k7XD?2)J~-rFYjuh-;1&}1J#wOyPfOQ1iNC=kkC7!jhnGI;F~tjb_w&8HznVVr z)z{30SMZWg^na!ry!2~plIM8-Pv&wq$7##7N5{=O_4e8%j=!gShowA>>K$(0zIT{1-MZoSJ8S0|{7K@^ z2E#7B!_~X0xj+qmDDiz4BYW@GJJhsCZY(QYXq-5F-`-(up29u{yDv}TV-xky%Q)fC z-eLSj_6RpStasymIk5ZT4Nu~4O%IcL`}%BNW4+!3i$^p(GIwOdBQHI=cUX9_b;G-l z?HxKUvHtjKu6LMmsrAQ?PBfRxoFCl#q~3lvYYce&?HNkt&?(O|c%?tlGP5YJh2){pHI}g))hksn8{VMB#8(gZLr*YTIwO?%v zc>Gn`c^)snR{J&j#}PBM^Aw&f@eCL6qo&tz)OC&a46bm!xm;_^__`!!7!Qt~Y5X2X z8GKIC+AG*`Q|~Z|mvN<=d)I$fpTKqIsMnsv0r&O}3vP&y3wu4^8s2RDxXL5W;Vtfk z??{1H@%Beu%S(9Z6V`B+#|Xapl=Hx=k9$o31@+C*O^ z`-104d|VW8rA_;Uoc07R-ON7nuz4S!%cTAm-*4dfEgGK1&RaG-fpf?735k2{JC55? zpZB>JezTkPndkWgx7yu$K4|=SiIjK&UzPYZv4Xw#=o1!dPvSAs`5|W#ACnX>W7j?V z`2O8Eah$|!Gk8_gi`acHd!QzT3#5ZraGSmD1<&C4@qI$K4(AYGlMJuozxL@9rtm!O zv#~8?JtkG4mv@aj-G- z1g<;L+WLBz#I{4+OM4n8O8s}2c<^C;LQQ)P=Sf`iGH!ObbMmP5#3izT*YJ=@&JfSx zlq2-}m^tDPlI7vZKH+AW&Wm{JQSKXSu`ZvF6D$ z_>3%x?Ktu{`}>4?yhg_IBK{&d?u`<{r80vTu+QOarHZ)It$KcP?fPTI=m zh`*fJShsMJ{XE%tv?pxWg&>SChr1F+5E6yd-T;nmbOP;#~3qE`O>% zc>?c|4qn0wPBX_?gYBog_9=73mn6$8xXl@^jT9Z;}PPh{N;7&r^7%#I-8nU()uB`m_6lzhyiR=jdl@W33X{ZJP0D zPvPzo*Q$WKou^OjS$s*RJZml(&TsS|nQD6E-V)a~i!Viw_2>gD>*Gmay6KU*rboUf z3)NRKaY3^l(@l>&Tw?z@d`~(*rydg*HtLg@X?kS7>5*SayZRa?FKX6frsICG)%{k9rhDdF=1H6{g?Eh&M}6jezURL9 zvMk^g9QJu*ty1{I5|4N7;S1lZeCZ6l?_N0lYwc$`OZeC~jpvOrek<{B*dzD;)_v7S zPLdkW;r9|2>GM0^r%8(EagoIHQ^i}pw^rIq_{a~gI~qEQsb5A%l8e*k2t>Asc*$N}}KbH7+ zTai6h?Cbq1eJ_ehS;`|z()nZK!SqUfLpzV$P2#nY7s@2i4v=X7ze#jeHgWd;wc^$nxD_6-Yo1}Cp&e4ki8?GpF5g!z;8 zAM5dUss9ca4?d-D$o%YgxcIzG;uSphG-KmA?01em`o)>SeI#BRx#m=3`!!wXWZuT} z*ynuv$dmZLOPv#5#nNTY-coCb??~(?@`{4~fAjkh{8f@XT;4a_bXDJw;zb;LgMN4h z-<0~^;q^C~*S&rojstFLw5RY(iS0E!_vXH#^1FWU?PA}?*CTxG-|qE?vEhBU7#lC+ z3bPvPmcR?7roD*mv(+#2Si^ae;bmO#AM492IQrJUp@V1eJE`&-zHpnh`cn-~nd4fX z$1b+IKojJc-jJ#|!wG6nPD|yUUn(20xG*ui~+D zjsI_Zimyvt!*I9rCK>JF9%~|HUd0PbuJvz_0uH#>wPBRcNa!0jyw823zmW8Dqe7VHY)g(8aqS0;lP9t5LHoi}c#Cview2TI_6@r{WZ!uP2X}a$UjpAky@1b!^pRn_A@759y21|O5M_A=HaUK^SGU&A9WlA4+#J}>dSRq)rQ zCtm9tCP=c2v0*`CKau68N3Q?6Gp{C%hfDq3;Y%{aMjh4 zKDN+$;{Rkiui_V7lVKsRVP&mk=)9K4HLlYw>3#5w4L_0!uiTKDLee?ykj+cSw5gJLduS+{wD}ES@j% zv0T81nqJ1wn_k1?$0fs6J&X;P+u8c?1YRync@bCGMNLobxU0mU>1A=~UjDyc#*7c_ zYj1cNADoc%dMb{^!|gSX{P}2o_Olnqs5wDRiyB<}Om(gH9XHFH%RqC%=VSq|;I>nf z{*J-d0{rtlXN-sQli?ug*5+#;K5)5p<7GVg8uuD(UU=OMYdFLhaKMe$ho^90(X~T4 zChlc9Q_qJ&2r-7kcl+zXc;W1Qn$du+e3+i{JWEOtLd|Jsu{XR_>U zJlN?}sYP?-dF(U0Us%YKc!5mX+d0ARx2oYueEfDbyo@*8p=P}Pag{rbhbQp5 zyNqWa?fB1wf;7tsd`*{`yvRuJ}zq?*TO`M7}0p^TS7AtxNw<<_Vm=TK`Zz+8nWc_5LAsjCID&-TM2ty&CK_ zK>e|!d_GeDFmIsxoVno38>v6uUf>}c_Yav9turp&q<<*#uxWpvIpn{2$TyjKz@6Thu@b+B)(Csv9f=5i&&T}~Uto~u_>Gl^VO8t9s z9C@}H?P*+Lnwm4L8@_R#c3#EV7id3IpSbKo?L1u6Ka7_68u-Wq z+pGBZ-2U~~KZLvchyD^@QyuxdOflxjkEOtCxJIc_pTG?z)NCyx1n%8}e z`Xr8)SReVhEKn1<{QdTZCve2PMtur*lUN`5tJKs)uK9p7e6Ib%tsiXEr}1Ek^^q$- z1{llZ~o#Lq49TvDqM(0PV_a8aryv|pzmoVsa?*9PhbAK60t_3ClW9b3YrnZ|=#OPovO)iUL# zQFR`?Q%kstN8TcHc;xNU!ArRJF4~>*EUvI?OIV;if%A5AubbTq57|Qv&*9p8nQzg3 zaTl4+BfpawJaWaojhQEKu#|b^?(znYd`*_{$S}SoEaQ<=Wwn2sFFql$|H!@fY4O?0 zqv||{kK{SLKw|%q_sBNdBZutU62|k$-Q;K<`HGyuEBKdO%p-5!uO-~TBj?5NGQK0R z|Hw}Jw}fZ3M^2T6JhCKT^T?4C%!Q|MwybuGc3k&>mT(tO;u{CHgq>#DUz~K1wdFZn zda$*aZ5<{$Uxye!k4zrszj@>d$JisD$EC+PSN~C;v*#zY_$(>ym^jJ)^2q6@*sojl zgPl)p@v~~}IQ?{q?b!J&bByg+{Fi=t_- z@Ml?@SEsgwbI)zm7jVRRjrzz3q*YDi^U}^s=eKwqn@hYFzm#|;Bma`=+9O*pv`0Mh zH7W7PZ)E|GOkZSQc;soagy-?dOU#Ss@cYZG$roGsy5ADczM|m;-1w@-nA7;_)eW!V zhS#*zUwan0P*S&#s`Cq;;Wg|(qa|c{3Qv;w8nejxGDCahi*gsQ;J4T7KVFL)&TRIN z3&kI`)cFNZ@*4KP(S3OePm+57IA11dk9<+i;1#Uh>}-3t$u`n~WSDQb`WTpr~$ zeE50m#>+VC1^2zz;}=hT$-4189{!5+z;oF1zs7T)eaEdT)`6$-+y9w6ui@&iJNG<+ zUrFctwd4J7m;*0k|2OsN=ff$yRhDWm;f#g)pJ)BC;~meFyo?LqwMV>)OW)Jy1J?O{ z&(9K{Thcgek@0I!Veb#D15e@$ADKI^;CY`~6JEeimN=^q8XI2th4JtL?*66vher8Z zLT6GMKM!vS+kIsW+B4Yxt#R-)UMul&QN&-H9=`K6PGWl&UzGSehzf3AYj_%$eQ%r{ z=JJC*`O#c>8Tb3ieR&rDki^4ke)e@t(!7iZ{o-1l!;OAb|A_Hmr={v2wf^|Jq zdEtu^>nnI+*M=8xpVb>RSzLaNMtcJ9YkC=XOf=dv_*T=ac-TK0?KwPh&DPMW{~R8< zR;%|e<9O8Ctzk}dd_dywzsk7cIt@?Y1F}R-8NXk*HFPW6yY*VVUy%7eY0P+Kx7JYR zMO?mnYki#)ctX?j_>0ukgdVNo6zTSq$0JVaZEblD$0w~V&*H7oji-cd{jKxU))wcq zw0ixaeaE%|?i<^2wCr)8_bbNP()pQDbw09(lLq zcnP19*nec}pw^Jr9=V;&;E~75T|9?}4{Z&PM#lvkScUx!ZW4D^Z1H%`=36s_s-UnC-E4W#B=zV%;070x{Gz= z37jBHcoyeM;x+TdKc$^}5lk2-lXwPilmai}H`2jtxYe%qou_e{#OJXBuCklGc-?rg zL)v*6NA9jqp2o3z7#q*vQ&Qm-JZ{fc?^kC0xWiu7>kT!yR3`DTcWbyvioAd;jCUQ$ zE7)g(`SKL*7~S0Sxbp$6-ha%P@g`||+uGuT2O5vpGn8>b)_Am6@JESfK6Q}i4Jl|Z z;J*&GU(xY?i8VF+=R|!j)IXjm^~VeTBykMkkk)Xjj8{{@wnNRAr*O7(@KWSq&Hyjt zhKGB+yklSRLmA7f`0yl;J6^^~N4SRP@DHi+aAa#ZNs{k6li2mBR-dVDZSi8s^8&7L zw6Vo@JV_SDdVEVdzvo`K$uZW4r}0%8&ntMqvBuAH_|M~vA=cofvXmF_fSh^0Z@=(v znZnEX-0_Vyui(NHj6r)9JDu2Aw=`ZVRqaK*>?DtcMI4`&xVGVBdn!}3XK|{;_A;(; zN@L9vctP}dEw)c~Kc2>U()k19!39(Nf4qXDPxU;*Gx(j%;5B^VG9N3*c!N}U5!XJ;`owmeCT&&q_?e97HQerB_K0Wj1DV6Ccx>MI zc^-E@+ZaAlgEz@oUc#58e%{WpUou5|1^Y}jexAZjrZv_-jbqO>p4bnbDD`uTe@W_N z^E$6J{4Lq&=eLH9B-Z5caao|ffv;lCm+3r@ zC5e4TR+}EV@}-S&Ch&CWi1qlJEaBlYU%RE-rydLVg^cB)VErWa8JTT*L}m$;ra-0wQ9+B5iqoA>24bS2?O|Rj9Zg6INKU~7L8?BLRQ+WO@#?1>j zVpikY6h7AUGLD+89Ba+XxX~Tjzce=dajx<4aCd9CS>ia0 zIP9M0z3{Q7m+`_ zp2gRn*Z!^ZgIB&}uXz!-e!0}%aJhxX%pd?8OOcX@C+_$dKK?@zcGdqwk@&;u1(=tAKO!&$G(dj*Cugp(@VJ3C(U`` zs-HIcN#Jxz{ovfWpE&=K$}AVcoEt91te`t{>dD z-vIBoYwz&Z7JdFdT=M_eWGLGG2fcN1V?R(|{ zVZS|%nP+j~-p1_jBdXYSp8@snGZXmQzWP^F#Yy`O@R`)^g|A5cv5DjNcVF#UTp}f2 z!#^fiAMTA$!<1~J|2)n;sL_83Pnc*tD~%3$?0krO@dO?tvHu({m74Z&sCi3r<L%;T^}=i|BaAu>(ReI^J=dF-OOA z&b?L{U1x=7c;vyyn=jAdwGzLU74i9|SMb-ShZ6>br%tve@mk#A6nn6$KJg`)!Yg?A zWaqDoK5^wK?!^;$>uL6nmvG)RYqgqv#Ldq)<~8(#H%eTqB5pcep9$@_{Ke+N6L`E# z`GBhCf|zeb=)7GY5pzZZ!9G^@EEf-nWXA zZ?gWe9Y^0{ZP(Ke-YZLa8F!rJvCvIBelA&F!}DibA6~$Lx4BpM(IJHc?=^<#IPZSz z(_25-dtT$dNqk5a#&-O1zCG(>oR16$8$Id1JdGzlZ@ztv4R4qF-wxox3!L5L=sKV0 zIbOkIUp7ac!|Np0NAC8DvGp5W=R-Wj%Xq;5+?QwZ0*UpJqhB*N?UA=hjhArex6Gx# zb-+($2Cv~hZ#T|T7K=@fTxDUSJ%O2~=kT4TS26icqbBkJS)$J>p8T#e(_-%Uh19?A z!qj^WkG!twMXWYGygwiuA+bJ(rKXp$+aixceI{{xi8Yx>DQhodw-2m;tikQ2UK1&) zRyEk|L(eHZiQ7xPCQ^#pOSneW8uA1lC!Gh_7yPfZ^9oM-$oS$oaleo4#RpsZH^6`} z;S>L#nk?@4X`?-Z<34u}?HODm@qKS<_~{aT9=)}ng$@YceChvFQ^QZcYPRE}KMV+0 z4K#in9|roFjsEecG!0=3`f!>eV*znxWYIp%}SZ82Z%8NL1JvGCePyD&( zz>wvk*TC?0|AAo%uj1Du^f}xZaM}g~{q9shnA~V!NNr%<@SRNuYEzHZEe3{e8*;2} z?b_&A9i#t^IR3WXzz{~d*Y*R$ZhH+3MV`e|_Z=8IHgQhywIhsqQ}wvvsRP6G&5RST z$PWxNwlIFYL*jl#J}%w199`!pd?=5+;_QJT%_HxY@jNn|GtlcHjR7~8DLjqSrn(m| z;Qyu>H?QKXbB+I>&I6u!p84`Tek}24vo+l9{Dx=oEh($1;$G9OC(q*8i>&$9_8r?V z9T@UFjps=`KLz~PWdlP^dmfJ~G(3j~Uf%F5F1uo&x6CyDEA8o34KL!B*EBqhAI};X zda0@575BQ=w$=?tKVb|z7y~}^U+cfqXrBu?Fbt|%tKB`<;k7kuG+sT9SZ+`#@2?%7 z_{X4-ov0pn=|9M8y7YskmO+00VSVt*0fW3Q%eDCFz(Jw?SYyCU+n}(JN0tT;3R8|# zk8iI(D0ItND;zLvkgspZecn;lj!$F~gM;^M7|31;<5i27H`HT~1 z9(!**$a}h}!DFPrbNHBa@G^GY#F%*kCrIa$?GetE6ffbQGM zZ45k(JCAWK&)`uK?^VQarR`L6*=A7qNybOtc2MXku_l8zNkMxFAK%XT;bnYJ>hs!u zP&i$dYR_Xy;@9!Wo@4cYnz>*`VteExGG2QbYt8n^{dREPv}ds(u|Dz->Chhj&zebW zkDMt>v=_0`Y>(VxM`!GGbH|*-`pEZWtoAApS_%)GwlVY_iofjE|A!N1t*Mecox5DdJX@xPoutsZTlL(ep0yc{??kO zu_AHIbxvsZgWoj0hG!noXwT!u2R6rm9a7a#8J|7KWBDv+62~5FPk9FSJj7Ue78gpl zf7uKC^f3MK8csUgn)4i_=YF&#-;D{M#?{VM!xQ-a1=gKc zv2>}kG1b|?{FUa*>zv^X@eH0XRUY}We9a@nbu!KPah9yjBcG5qUdCr;dj97XoO6To z=WmWm__@SBBZuDTtg4C3${Reg%T3mcM-Gx@JcWPV9OvV{#X(_HiTy;LAvx`lC7H$} zcmKD!@W|ujE}p}aW(^9D@;pxakF`3_*BU(Fwn3rDvv|nu=6Jq(oGtNQkzYzydt{$G z^u;5~GMz`hFE{WiesY)l@)|CfJE*=66pY8Z!y`Ai$6oWuadI@z zV4r)&(Oa$i}%v$*+#9-lmo+dt%-@C@Gnu(iF=n&8a&jhZ6Pe#Ba7FX3vBTRWb> z6`$}JzldYzDK$Lx^q|n`8GCWDc6{wwHC}5}#jT!eK3?#~rWf(gribS}b|gObv-nuk z%h-ECqdkddHa(AvnqI}NUTF4@*Gs|}A}@Y%P-x|mGbPO#uUOU>x5{Jo_6zGHvYgm(vpkKQw{OPx>r-y-AZRebV8HN1kaeB`-4I=-@4 z{bd|q`BZ&${OW7wi0w+N(G# zw1v`@&Lpn6TwDEn`y^fyU3(Fyuh14cU*)lbzpvQlz5R?~rM7V7$_>xqyPX?e#d}t1 z3p3P|@TpbX!UA5wqq?+(_N&boH(ISNbi39#u~XN!FqS9qb(zAeIC}NQcrtij)63X@ zjYfM4ZDyL+tw;)AYo|EFJsqsdwsLLzzLG#S)425c?tiLe5~2b zer@jFyo%+2+S8(b@Dr)>$WdFnACKH!!oSTIFOqmB%eZ>l__ZhS^-*mh&8t}6*7$kk z>f5z>pK0UA#oKG=HLUFDUOe(EiG3z_(!Z2u*%vHJ{d*z&Q({dR=S)gfO%96^Ya+Ys zY&^4#2h$SUBRk@MYcJ!>taac;oOh5jaI1Fgaj^4t+vqyGPHYQ9dE|DI;Te4N5Od*W z9DBHP72ENpBiw^m@Z2M&b7`KFX3r38e_=gYS&qlyNvz)Ai0| zY{y{||8^$wNGWNLoFWT&L6oH3rlaq_6Y zH;Ft=hH8&|QqsJJXWZE4{SrME@G+Ue%Xs2V&O~g-HE;G@!IL;a+Dpznu2r-?Jc*;F z{x?B*q|DGBd7IqDBj?I9yo5LXyDhxI%eYA5I3riRrOjupdalM@Wf{+7N#YrctTsI| zF{{xY`K?TQ-usi_!?*hX?$tkTJI5K~8QlF2`^&TVx5Vd-aA#Y%SSs2JI9KXl3vmCr z*7H8~xa4mA@EZPD@?6Qoy=~ztDf1#Oz0bbH_WQL<+x^;c={)CzhX>li^-_rKxb#8S z#`cFiC(rlayoBFKdEV$c&ws?&c;xl+2`}QfN3Dx>%iyYywS}LwC-A|t=cNbC9S?iP zcz6zHKkISiZ(vKfNQNG_Wu5Cjr=JH$hsc5Q3{PQrzWF?W!oV=kX@;X_ojrKJDQ89k+CmjCQ7G8d>;T62_b&p@~V^hM)o5mT( zfVH=cv%~)47VkD5*I9gQk+Eqn}i<@4QnW#<`B{8c|Zk7Jfv6Q05QB#y0&{eNqC3a@B-5!e0Q z-al#I@fsP+i@5F|&U0+X&VM;GJb_EY;E;IA8ZI|DEa@~jV6T(3CiwAc`s6h{Wc9(J{aNk!z2tdV zV{jNC@iPb_kC5=(=sM5jYx6vINemA0ZwwRoo3v^V|1ie&28TJZ21~sMhvWk5iPe_D zVbTlM8J}q#96DY!7rc9bxxb_aFB_$mv`Pg)tvEBy`FS@w$8S!VX!;%h>r4 z*M6xTk3DLL*W()-4mfE@Si)2I=^4iGmHzQR=MD+ec?l1_R6jh21Fm(iuhrwHHyazT zVe70RVL@!ii|$hMjXC0159o*2aK|Tx_$(lMgm*4*uW$8_U0yS0p1`BtGajD9xgQMi zJf{YGd^RK$c@p>hR{u5Yj933MB;xcFq^pBs8SU)V}HSDvcYkzbtt~1uP(ed})UCYBB>xWF%wLh5)&OB~?pAVo< zJoaDwXXD2~m+@b$2_AM6|5ZB{=dK^pOV#84kFD=LdyEa=ecAu_oAKka_xbPcwP^kD z!`J)|{>}Q~&}Dp?e(=LCL%n~RdVH_vP=9mJamQXm{hQd>aGgFw!ybPdKRzNwUdDs^ z4h3bsFP2YG|0g{!s5U=8_x=3LLQ%! z_&c>qY}?Qnv`3~k9vV8Ys87tc>x)Nzu-VYiwvut;0b8i&S*&h3G<3vve0?i@t<3TD zf0|=-d}C|(j*g2)yKi)yyX{b)>uk(;=GdWODbM2yI~n&X)(02u%vV*9uk31GUB-k8 zKDNiuFo&1%lD&s|-Gw>ggng|E&*C!&3=QMEs>d4-GKSTy30`uDIj*4||8=-I@;vTx zq&X(WgbemQ#=LkE&pUo-82baL%rvcdYpKM_2oI7dZv0_z*%Rh=OujlU+UK}eq5Ya&uiG}9Q8bbEmPI=6popu zeqH_J#B~xWOp1_ui)$KdW z^8(JgPCYN-)7Pu-sefENQ$4R?ryJGt1h(9yo~Llk&FXvUA14;o^Bhk7w|ZW{S+}U? zC4738`ri7-#k1A(8g{x>Jx^fEZR&Xn$IMaRNB=nScJ(}mQ}0mE3pnde^}K{n-=)5< z{&DeK^}L3i?orPZ*iur@Q#j^c^-2BX#QW6q98SGoJul#_dFpuypMF4nKmFt42i5Z$ zcIr^i6WH>wdY-~D^VRp)KTdo^J6qc{78e@|Ri|brAEKKJ~ zTyduR@&x{T>#)$??z#82VPXD#!@SRmKJmiGhxr^jbH{yOH0I65ge(@`8Wv{o$jZmV zeD1V)VdA@CVeIDm#2x<{7K%KB7j+%(y=m3s@ZQ5i*wS9$Uqks;?mKLFcy-I+zCY3r z?!D7+ujOzrTzP-KwLbBoqlWu=o3Y{BrwtEfUd5Fz93FC`)Zix94G+oD=8Ks*!$XBf z<{laz@?-2Z7M>d(Qrj30Zu!>mP~~Y{_No7GTjTj`czE>Z;nv%|aQziWgc?ub4Qr1G z#qB+Z<5jIA{N9`6T_gDp&IUfZ%?Q8Kb}e4G$B0nk1w7#pzN5XvgHIY^e#V2PsUt#S zoNIBVD@TMfPvGIVjPUnWYVh`ZM}*`qYB2HSh*05?$5%%9y|g}Y+v|F4X7IkImvNI#Q(>W+G(IR{Ut_~Lo2UH#+gxzQRwd89Qt*m~mW#~2gOV>V};6V+q-#8jy9$mA(0uVYn@;Z*HBvUvNRx zW0$Lpl_&5-$?*b~CH_n)vexv-4X-hOHIc)wO@$5~xtqMqv-qdH&;P%@^MR9dy7&Jf zN~(H|BDVexQdzgk?4QJ{O)?RZm8y(NV@ojPkBvq$Y{VjE{Anyw8KG>;m1qCY{-632 z+tQkr#ulxSMC>J(QEr3=qliW5@BMk6Z+q{3UB7#KUpK%0s$H+w$NTL#&w0*sp7WfU z-JLzlCVy__9rS4d=YqBW#JMh@5AdfXiDzMf=v?CEtC%;c17B_8ek^3p!>_f_&LZYB zJfoF4fXCtKZOmsmEPjBt@CbZ#O~ln-$QZ(}JQ}ngfje)c{35OwZY^-kV*2@3#I5;E ziL1Jp`f%C4C9Y-(;{cZ&RpRO|p+9hWMTtw-Q4a5%RN~^7ab2)`S_ym6G0)+HrX-slJY90p5OliOb?1JguR`71z^G*h5ly27W~Parc7~zW>j) z;4yd?8F@W*;750sxC%V}e@+89W0Y zCpy-(mbh<|=#4xh&?A~x;^*49cFIFAN>na(5s&f=%v-rw-OjaB9*0MFl<;$H#tJSc z+TT@tpLmpuyL6Vgd+`vQO&-C;y}M`!7f&Wz@E9B<>O&r0&>eUJeq`=?O5A-!-;2n? zieBau$422k8UFiw%oEr^vbYB?xtqCh6LS@=BPm>5eh>2%7at}4cn&VQ*Uk$+GI#ft zxbG45Ed@_s9rPg%KYKs(irFB@%?dekd))%E2Ih+Pk4kr<1siybS>_e zCGLhbJlB+`;JyP~10IG2qWL4P|5b@QVgdIB4n9`G-@@a%;Ht-&d-w4DH#p)6u9xrI zhu~L86?Md=B!-JOkU4k?9`L|~`H=g9);05^gT+q)L>@m;4&p#EE zhu{-y>8JiCAe_IR_E$2`;ZKRauP)AbntoC)o=tAW!sX-yF4HCEedOi#xM!Po9G*L#PeUHKey68ob)@^ zqVIEG;OoT03-F#Tl;6gfz(ZbVKJnfo0^3N6@(gS!&`;ch9}+zm?yVAc29d|%1Lj$H z`tP}Sx6^<40jb8_+a>O;59yD5TZy}WL@E2?a9;T9ol0HN51FfQ_Gc*PS`u)?&Vh$u zvv~$i{(LF>=x{A?v=Zz}mHIOlZ)n6=i zX*>=eApY|X_uDt{FudG63Hyk?Z@Xt zmXx|{slOLIg{VI>;0>i5OZjs6G*SIQ*ilyMHd6iwJh;5ny^N2B3(0OxTsu5qY^f{9 zV{jX(#>Ioi1^o%bYNGW-Oqst7cQ`tzvlBdz=)5)XJu-)OLKUU%ERw{%V@lm`NS1YG z`LU($ZXy>4&Bc$+#nF{Pol1DFxma&5_L__9%|jDP-8iE5#aZU!)#hT_JOke)QGVA< zET71I#p7@Zsk`D>pLgPF(}Sz6JPS9Ni`$6m@Jn=V6w$F^IL;)Ld*g|26#3 zTs&+}aI84PT)fi!d+-5s@m2G8;h}TwyzpdmajCi3Zob#NQWqf_XYnNSYIwbQsHW5% zLsUmR+gz+S7kkacXUxTq%*Dgz+jYTH%%6rM&JW7PBhAHG=HhkcDR>V_rTE)(Fi&c3 zuJpMLS3kv~ZwH=PQ0ks1D&K!msXLCy#Ts+*CUfy#^KhcnO(L1@O1JBUj1|$b;!JaK zskzu>o`GwKo`v{DrEVF~vHi8B{Qc;_#a$K$E=J77ndWscLyGu)y^19~vqbHP*O`kM zb8&-t;S$=fqYuBVbj9!#qGQEN%tg;!Tw}f#erPTpd}(m3IL%zV*j#Kj7k^_eZZj9h zTo$ym?Q+(@rGbl8=Hfzg@mBKz_=dT-*LQ+r#jl!+ar5QyZgX+aT>RKv9DPO5&H}j7 zT#vL%QN|MrTZ$36CEoqGZ(wf#kJ<+ma$e4)fcZe7t`kAZ_M3wrS5Q|`r>qR z@nUoF4)YGU)?6Gi7Z0ot+7VAQ7cVgvo6N;un~Ou{q3cWC1fu?k^UcLu&Bcez#n;Wn zq8ox^#mVO4Li0D^J~sw+#PR0hJacimxp<$s_?)@8)AFDl@hEfgOmnf`TwHA~zGz;6 zqrMlkBUYM==bDT4<|+6i5`M4Jg>Rxh(O8MKB>H|Od;T!TtX%vl8KgW5H(I&4=L+V; z2ebq0Nd2}-w;bL_)Ta2n`D<{`R8a20HRe~WWU7KlzqYx0tB>YM3@(emm_G zzkT?exwun9P%i$X`BKKJ7TxFxYk@8GGEfddp4r_;xEm2 zYb|wSiOR(@%*AWX#ZGf^ow@kFxp+`p(2h9GJO&q-`^1w|xJJ0q%Ed@K*UsNc2zRii z5%ou0WM0|HI!sh9-e@k~Yc4)(zFRlfMf~f6XPArEnv0$08{ubqg8Jf@&BYn!;$`OZ z`%B#lqV~o6%*E%-#T|Ye)cF>?(p+pc7aunl-!kubu+%+C)V}zxxwzj?gK}|_`7uA^ zeIQYN@w?_?m$~?qdGaB?mLaMyK4C8Y-drro26e&@b6<$+iwn%fmF8lAa@NpWVp>xNHTx%i>Ec<^IEeQ~P!tjD=8L}Ms+nTzYq#ShG% zc!K**RA1ch*MW=2n~Ue0cR$JZvPk}!@%(*d-nSDSE6y+%FEbZC^N~+cpZN9R40G`^ zbI~&&xt99GuMcOKiV6Vw;0%*BP~ z;;rUc_^P?M`@6xhVuiVQmU$9(n2S%Ei$mt(fm?%iqHw;sxWZiQHy58bf8u@SHqpHn z_xm7l@pyCbeDkHS)m(hsTztn|-1ozvoiIGnTwG)>e&1Ytz+8OUT-P%N*kvxRHy1xJ7Z3e7Xj44dTwH1{wwsG<&Bc$* zm%B1|H_`ZugXZGL=Hlobf;!9L-R9z;x%jcUIC@8`5AQY?2hGKg&Bf6pg8DDQU3Usx zjF^iv&BdkWC7&sCrxW#GOqz>r=He6P7w%lP-wQEr4PWTIRakIJj51$L_h~?%d!389@X#&5`Qs$Ns zeNQX}+srd?jd>1kGB3cLcMIx=;9=%bIMdwiQRXHP?>$~0;T0r2G{J4zv&`+iSI{5v zSaWfXxp;$leD5-MJ<&Lbedgkzx%jd9mQl37kF^hvH5ccYi#M3(inuPKYcIf^zZkd& zSDO#QUG@#yTn?Lv>hHT>nLClFZ(^Of*lsSaGhe!YnOjM8?5+otxnqcq6>H4J+s(y? z&5I8#bEgs2e-N%EYG>L(W$sd4LsaE*EVV4e}8 z_QeMC!l7kukI`l9lQfafxt6&}B#+17g(P|OM3;n(gfCp#L%z)2N|L8cbRPVG6n}&A zuavn5Nd0LOT^4R2>RTReHFrlc&xy+SII7Hjm8d^r++18{E_Rz2;1?r7{h!0v%*9Yi zP%e%$7iXEj2zMWC3@ai+Pr)I46!TqWw8xQeLHIrzSni@T2v%A;^TQGM}BE6>0+ z=6SfoxH9(Mp2+@GWv+x|@da?DoMXj)bMbj|ai^n$I$?OCxwyz&Y%mueHqXKL&BcQ% zf_B6zbFtPu2^&en6%*Zqa4pfbf8iMJGm(oE%%{P)xwyo9IczfjEgUiz|KY1aJNv?j zxj4mq7QD#(Za82rK5zaSbjJqmh@;Gt@Mk2pjClw@COJG>$@4-q&f;=&@osZ*&^!;f znTrRE=Nhi(8G)5V?TBZR)D06|94@tT@g7qAJ^BDQTDiFA1g?kjFsvkgJFu42+{Cj6 z@3eAp9T~Y|BEOSDf2>?QU?Q&{l!sv@@!NrClKK?=flIAiyocm&ray3_m5X~u%h*F> zqI+Z#&lFKRV(7TQ#c}51Ec18ZzLSGGV$@umXD%)`AANk8n?}^Wm@pS_GZ!B;e+`CC zus*OE#_>lRGX=Uy^MD@jHbMaT^;+y7`)63jkqWa>E=Hk8P;i}JTi}l03j8wILDY^oXfEz@dQdKwnJ3|G#BT@gc!sqDJBZ&7 z95feqnPu(3GV>(7ji?<@W%3VsO+1siO;qmAV$C7)FpLuK=hG#`X- zn2S5j4eE>gns>veiGN=Bp}9DEo}Cv?GrtU`h<{$#W-dNxJ_z417k4_(&I|W7UjV;P zbYAfRbMa+!ao3ul&PniMbMX#y@eyMv^BP3dPjQO5ILo{a-efMen2SF#-~aqF zS4z~*MX=snyvw{3X3fP7=3C&7-wuvF4py6s3(YTsDRZ&S{6V^I7k;ib@T1@f=4ZlsqW(k{(>{@l zSDK4yb8(%y_$u++ho8IH+J`5Yp9$-U-~JNXCw}|zN^>!7F0L~dUnPF~@N<_~`|t$w zGhsbZo3T2+t|4-9mAN=zF1}$d?sI8SUmR~P&NCNpHWwc<7hf|Mi!KY=5ht6w%gfy1 zMEwz`n~Qbk;$7zAqvqo4=HjTOK|A6kb8(Tm_(OAXz+8OWJoBA0_s>NA5&vK=7GDvR zizl0lmzazHWG=2T7vC}$54tjFN1SFZ)|rdV=9#Nlmx%f!ZZj7TxjHBptIQMEl(}0- z(FIYr8SZgyQ0HJc&HMs*o4NR)x%jW z#kJWinDi{CXDGv-^CvkreRsDA=nX#T`a^q=Uw zUs^$*iTsG0%iK4JT&yz}?=lx3G2aMxTp83Ci_OK8&Bev$%i-PT;-I1Adtm0WFT4Qr?llc)IU%wEQ{{+5D)TUU}XzjqM=3=dR z7H%LqHV?O&S2l4^iOL^??-R8t7B>ejo@OpyW1fSXh>k75om&Dw37%{IEc|S1(2iJP zE}myD-eR7ITZ!6qZLG0Go`Gx3b8wS+vYoYssE!9$o5#|;UJ#Wh;ceyx_{EN(KjK7l zvBq4y$=r1^H;BeWoNg}GnTvOsN4r?Bi0X?g%*B3l@p-0{bJEkJa=NBpGBeUr$=%gx0WbMZ0r-5w}&V~OgE zXPArEnv0$0gAZ~~iOyU3GoC>r|1AtX6tpt{pC>Bc?dQDy68YUQPjs%0zbJE`c{p(K z%jV(?bMZ3s>PJ}TiQncgX_Ls$70tz)%zp?o=HeRjjqvy8rE7RUK-7+SmihTGX)fMo z-VJ|YzT>0JL!x8FBh9}GW9H&K^QCa5`Caf{^Zf_-`irQY32=t_gK(|+^Y9(>*so}l zsD1)2Gxy+XbN3i?kEl) z&Bf=<#hrc=)EEEJT#T8Emz#@i=HgT4;x=<}%#%Tz;y28f!j(kVz7}pa7e6-NHOG4` z;*Sp;XMPeq*Srb#n~T3Oe-;+Z#hsrD+SwnLnqLI#&BeRSJ7Lyb++ZGFTjq`@6-)X1 zVsJ6($CI!{<=^3Nc)|55$MbM2QUBdK?ltkR1&%Y1!kOj?xXe5S+sw0YgLxiqH4m-l z{t~qrfm6)maEW;X>@^o3F&CdT-vsx5I=DyTmxgi`SU1g7=w=kDH4x znvdMT*Y8B_i{<9xH1nD8yF~L=yu-@HADN4fnv4HpF1~HP`!i+kOGM`qk2M!hF^|LR ziOwbVnTvzw;)ubZj`&65w+W9mKO0_b{yo@F)Mosjxu--fcAJZ9&BY<};%9m7CTd@t zVJ@C;z63TAwK)Kvw{r0vb8*+_f_6s1So7h_qyaC$ywU_JU;Y8*MCI8JSr3WI^Kh%V z+r}D8R33&?i0X?A%*B=FV!wIlBYy5rR9`&XT&y=2d(Cry;A<_j30WqISf*x%k;oP%a*2 zE>@e1SD1_K=Hgm&(d`kmBYxRj{Fb?Rt$E28%H8Qi{SlMqVu!i-q`5d`E*`jNaI84h zT)fC!^vuP_&Bgc4#nF2O?K}lPFc-sn2j$|4=HeoAvB6yYnYs9ix%h=qK|5m9T>Q4V z_ycqC5%b6w%iSp?%bvzb*d}MJ#3#(f-BpX1j4kmc?|(!gG|>)}U4=M@heKBe-&NJ_aFPe+H z92C?SBj(~v^DS`ia8O4))?A!pF5Y0i4Swn1puYGub8)e`_(Sv9A?5B;qU#k`nTrGF z;@jr#&~kS;QGIc`xmaf|Hk)VQKbwnxFc*tQ2knTbn#bYw=3<|@IA|`8_)>6e2p(fD zo^3AHn~V3DXW^^n;_in9?T8iT;%xH-Ty8EtOQP%-Is^|K6C9f?=J_QW6Y)uNamZXe z^zfig1b)k0ywY4un~Uqr^YF9(7#u4eWiD2mi`ST^;E&D47tF z|H)i@*j(IVE`Fgrs4pICE}mm9-e4}?XZ{X6U~F)#IN4lWU@opS7auSeUo;nY9T&7C zjx`r&n~OJ@iw~NMubA(3bh#T(H2&gjb8)%3c(=LuoVmC|MR2V6kLKbx&BbfX#a?r9 zqq(@tF+n@|W6RyRN}f~p#u4jC3?DVV+)X6vr#RO<2|LWiC(XqnbMe3l!Ldo$VJ<#t zE)JQC2Trv5u+3b2!d!gUT-+}j)Q`gX=Hd!-@ji3$IrGX%Tno{4i8q>y_nM2(n&;t& z;}{e6R1ps(I#!%)E}m&FUT-cwW}brub8*CE-hZ%`KsE)YD@vJ+Pi)G|mJPJ=Gsv}-SZlzpoCTTnaA110JzD4@4Io9W%CvXq& zFf1dgBc4MxQZ8OY3V0T-BdR0rFopLJcO2{UQ2b>)0w)vI5ica~P%hp=M&8Ny=ixm> zb;K7*tm9apBc`%$;vsk_Q62FVvY2wQmek`(cneV-@#iG8`dFVY;iK^a98ne25lcup z<>INN3Xj8DqISeaQv5LY0zOPC@f>`KsE)YDiQF&B#WE7dqwrLsI^tENVQQt%X1p8E zz=w(Ih;NZtRi)28r*Z9g7?u&$5ziq5?B69`LpI_W_%QL?fp3w9SH}C?^J|<755qFz zw*${1kIi0X)Art8`#_&ggw9*@J@i0X*%kr}vnRIJ?9;1M{FsE+uk%3qt{^AGq^ z+?~Q2OH@a^oh+wZe3E#04(|MoppJMR$xtq?B9Gu6+(6Whc=V~v^WRPIxd^`#Prx>! zI^r%f@WUtioQUs*N8u8cQ%8J;jHX=N{hPeE!$WWiQ5~_JR8cOzKxW~2IBI54N4$g- zl}z;6haZ7w;3lGW#Hpw0y~RYISK=`|30D)<5%;O)d7)gKP8Q=axQwWd_zJm}a`B*V zF}LwBEF+p5;yI*v(L|ru;FWj^HWSqmpCTtwF1}6TxI3NsOjJjlL=u#Xv&pr10=5zL zN8IHM?$;8=8BQdR;8D1QsE+sysmn9YaQ9iv0Xzh!5Y-Xe$(@voFOUqLhojC6>WG(+ zEahS!S&wJnCZcx4sb?`JuQSf@O45xd;cB8f;y!2d9))soI?3TNxQwWd_zKBWE*=zT zt;WM}CQ%*neiHj&qR%(+Id}mcc1}=7ypAlUTzrVs<5{?ss2%aNbLlhX;tJA@r{Ef* zI^vkw^qF$;Y?8y{@HV14;(KJ^4-7RtpxsNC^$%(*XZilGPRrt%e2k#-8KjMp|J{0vi;ymsz9)gDw)e%o2-IR;9 zB#S5EEkt$1pOYNr;!EUZyZ{fY3Hl>mN0LWIeLjTWif7?EqISd`<}*G=MSUKMZ^R>T zGEp7zLb8Q&@fPADTo=5DsE+s|2~jSNIG^#sL-0_dI^rp$hH|l%EX9*>HPJYW`+S@0 zeKzWII=&u{!DU2s#8=46l#2%~;JqUrhBJxki1(9`&qaN{iSLgW;9(a8b;Rq)5tNG$ zktm*pTZ!5cPg}@*rd(V>=HMx~hNzA>W)bt5a`9|ZkH_I{M0LdXNbZHG&!ZCbACJI! zM0LbR$vc#be;_0C%)<+rheUP6+es1S;*;bEJO_8aD5xWzM=B{7SCJU*!3{+1h)375 zzELhNB8%|^Y$K{8?y{KmjdF1!X~3g!2~i#K8It{N)aULObHDHqoI+GbY$q>MF1|p9 z@H~8*Xl{rHFQNV(lYCCb_rhavHc=h%W-^*`@g7ovXW=@cI^qtO@Y+PVcqo~LN8mi7 z{)mr~;(aIi`~zNzyE?|1sE&9$If-)dNfO6%aOX>dI^uaGLAkh!T#I{f15rET(U)t_H+=KTJolAU?3{ftQxQ6$NvlwSMh3H&jJK3Ld@dXmW z^KjI)K^^fD59)>fC&L!SYYA6@qBunuE9I-5D zM=T-BDHl&wIUa|%5w#<}M>3R)M_tGG;1M{Ps6XO`WIg5LEo3w9!3{+1h)35mK9q}# z$ZlsdpJ5wO9dVcI86V2Ui6nwY;i*LD60agr%Ee|f1JA%sMD2)EZ(zNpT)dLh;Yqlf zsE)YLjeLDdxj3CXfydx7qB`O$WFR@o=RwPPjl;umCQ%*nezJvf@lBOq#W=&mz8BOH zuOlJK#fQjfJPWrHwIiN(6XSd}^BJxnkKifTOmywyQ)E5m;@f01?p83LiP{lwCqtBr zPm)@M?8hhp&S>@pu6qw$jE2UPoq7EWD9r1m)t0TUihBo#5Ar_N4vm{bvVPMCVBIKlX74w<87oC4m1_ z{@I-zKksuc?!M-}v%`NpO8-?kvF?He;U#k~s-3@R;rKBnM@Ghk=PsPRXwLkF=Zzop z%^6d^QZXi6yZD@ibIw_?XyM%PV=kRrJ7(g9&+l4!PHpYn3(j3|X_y8U){Y-@@kI;2 zT06UD?gi)6e&vGsvoBgyyJ+6xugqR_!B@|zz2L|tC1b)DoU?HLyt%cDXa4)M(Ns8G zx%i@sYZsrmaNZ(o?U4VbwX#F}<2bT*?(B;%n!or``)^7vntS2JoMrBu*hTY~%wI6~ zyt%c1`k(*)f1gmtp^Lffljbg&yCA$k{~kZ)oZ1r?E?M;LxfhKIUp#-(?Adc`xwd)d zEU2A3CVbSN+NnJ1|9+Orqy9smDv$cp#c_D$QGXma{^LL2j{jWZF+aJv(blTgSZj4_ zytSq^(OTD;3Wtx-Oke*QZnIhP0PXr!(pPbT&PZ z&ZP&_`Sj*=Aw86K9V0tJ9Yr1Cj^d6;M@2`pqpBm;QQZ;msOd;_)O92~>N`>$4IN%b zx+Bxk-;wPY=*V>pcH}!YcN98?I$Y<-&QNDjXSlPtGtybn8SSjXIu3Xn(SH5d=SD|aD%XN?J4s{oGhr5fr zBi$9<(eA45Sa)@Iyt}45(OuV_?5^)lbvJZ--RbU3cYk-bd!RelJ=mS^-rQa29_n^I zBYQ$UMLpr3;+{xPMNhP+swdV{-4pMr=}Gj|^(1@hds00OJzh_`C)3m4lkFMk$@L8O z-3G-um8DZ$q!wo9@l@ z_V;Fc2YPe8gT49Q&Ao-*k$s`Qa9?p>MPIa!DVgClhdG#Q8Enb7Y;GyExYm)aq1K|- zaBFdEq_v`Tcy?9|&(6Qt>>TQKeVU;~{v3_?v$U!&)>qvZ@2lxc^wsqx`|A5reGPqH zU%D^T*WZ`z8|cgR4ff^xHun|!hBT+Myhj=Vy^&tXEAql#u@~_wyr@^@#k^`S?$vk+ zug*()^kW80Z_vwoo4tZJb$jWX=zrGN1^=_J*@xe|4}1#0 zx6E7!jde@;nMuX)caQ%^-#y+QPooQubvq4zoj&|sy8rg)NU1;br$`mUKSTP9{tRh5 ztOAj-Zt-9B_vnYedmbMC`R@Pn=eyhQr?%VSiQ|I?V_jl9K6ArAgGvp5O5$(yQxe$dSdgW;c@M~6S%^(p#v*LGRA5@TIx zJHAf{|Ajt3^Vhd-jU4_Y-QU3HJY90Ei||@7_z9ov`maCNrB8MJ+pG)^f1>h#^?6_K z6F$#7^jG+4UYFwM4XmHTpU4{={>=E_#An90!@CM^?C@vvhCi7*{F$7;_s`^HhS!1N z&*Th$Cg<<|GdbC@u6+1=44?QJ0QU*MpPBrG-^r{R{;kVT&2L?9hj-9?K{@=|IsDo= z{Mz|<|Js=!>(cgf#lb)Ow^i%@SHCqn@CmwMzZI>WmXRR7KFo0Hkjd*yu6PC5VE-EX$b>w0M1@Xs=af0i-) zvy8v@pJjxH*MZ^p_rve+|L))4N5;AI@caAW_xJzp?=#lhzL-US+PkvqPdiuEeQNft z{Qt3Q<#u`B9v$a~{_K4K{)^wo_>}I>m)uVK!Zv(Lc6P1)JK53ozk4=ZY@9ouUqdST zgq<++f9777E_96BO>K1Zuha?71Ihn~`)3BbTPE3|GS?Dq4Y9XzirtGt>`xqLcj0V0 z(-CEl-zfX^M!JjHIXAo=wL)LhK5h>A^S8|!nK6CAsjyQmlC6W^((2zzU0TQaRN&Yx*d_(x~&n|%y*@_W9<6t^|D)UKB(_J{%MRi#hVi?Va6ug zrcrV1lN|I)_4B>SK353(l=Q;1Uua4;hZ)UeYlIy;l3YiK9hSY$l;5jdPl7AS(yJ+c zpR!)2G1e4iN6}nMt~EiQ@?1xhQI9agrQ@74 z$u7<@f5zo|b2?{iimL=s&KP6Y*Ccze#<>5PR-HBDkF#Sp>IlCp8KMVac6g4nBXdN@ z#;3RnkmblI^Crn$i`!iaG27ydU4(N-IaVWA=;lu8xI}QD;$EatGbhPRaP0V>;Uc9Ki4ILaY=fqrULiJ1H>a%VkeflCE#YgD3*QJ%q2 zYq&kisvo6xh*8Kv%Jt2Z%?v+ zx9bk`jQaOH^KbXbYl<#bYKU{CV$q;`3d3&XCot$xm^` zTtDv{zlpg?a|H<_rtlVZZ8c(Q=%o* zk?&0E{)DFTx1eaV#nV;sBxmVen0>yJ?Bg9}k8b{Fc&a~ct})J8Q_UIXdYt*Ddmd#c z^a9Uw#Gf%y_5jaoWny9n$Hcj=1kY!#*`v1+R;CnlJi(Efjug*ERP&spQrvwPo$AlA zF!v|IZpBINjn|Uk*~;3w5n()X^e^Q1F2{yG}s`6%#o$Nc%3;MoYX8taUO z_9Rb6#$Vk$dYbXi8Dq!sn4YirRR6gMdmbxLrZK{E9iqoM)}R<`P=u!|M4zLy5ci)B zjZlh}A>Zo~e>``Bl_ko3uV%mGn7{`V?7HqGaWljbKR*wj&XvS6K1Dm$A0_?_9qR- zxWFqwj1lv?l06}w7k{k0KVEB!eWQah&NHhu|8=doc8{aN{*#mA?qpcCqP^kZwIdT8 zo8fgJ&nV~UXM`hlof&_I$9XDZ%!fEG=;<}rKXysl06u; zjrp&2xpb~0*O_2<{RFQKN!FFD|HM`K^ESac6k}W>+zXG_;jn*PfhRe}%IGoMJ%2=F ztamB(ITRchVa8>cGg0n$oE0z6t6qrJIMos1^&`qrVV;s?PmHQb#)w-@$YZOAIF@Y!dR96dYt#NoXc^p3{Ovi^*F_~ z#)EUj{8=CJ?^lZ16z0_^)fP*KnMJwI7&9S3zmmKH$NO9&xSkZR zz6Dmx2v1pxr#$1oil_V)GvATqDa$Zo1xCzq93z&j@?UGStjn3E3}Y4J9Z!f=ACz$*PaT-*7NIntUsyNBzHeVfAXw7*=~>CP}8gO*UgN--XvM2l5Lt{d3v4Y zy^yZcWr8{$?}Bo)l%Y;E?YO7$t{7`rhW92e8=S8|9nG9L&v2F*=NRc2bD+Q~S?CV+ z@<&Y0U@iMp+qR-1P)~OVXO2%Mfc< ul-KpB>J@@^BXlyx+81W^DzL_fZ1wRNTiy30>vaXMsLYPxfBw!!;Qs)GI8|%_ literal 0 HcmV?d00001 diff --git a/extlibs/openfstwin-1.3.1/include/fst/accumulator.h b/extlibs/openfstwin-1.3.1/include/fst/accumulator.h new file mode 100755 index 00000000000..1f1f893d462 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/accumulator.h @@ -0,0 +1,745 @@ +// accumulator.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes to accumulate arc weights. Useful for weight lookahead. + +#ifndef FST_LIB_ACCUMULATOR_H__ +#define FST_LIB_ACCUMULATOR_H__ + +#include +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::vector; + +#include +#include +#include +#include +#include + +namespace fst { + +// This class accumulates arc weights using the semiring Plus(). +template +class DefaultAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + DefaultAccumulator() {} + + DefaultAccumulator(const DefaultAccumulator &acc) {} + + void Init(const Fst& fst, bool copy = false) {} + + void SetState(StateId) {} + + Weight Sum(Weight w, Weight v) { + return Plus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = Plus(sum, aiter->Value().weight); + return sum; + } + + bool Error() const { return false; } + + private: + void operator=(const DefaultAccumulator &); // Disallow +}; + + +// This class accumulates arc weights using the log semiring Plus() +// assuming an arc weight has a WeightConvert specialization to +// and from log64 weights. +template +class LogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + LogAccumulator() {} + + LogAccumulator(const LogAccumulator &acc) {} + + void Init(const Fst& fst, bool copy = false) {} + + void SetState(StateId) {} + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + return sum; + } + + bool Error() const { return false; } + + private: + double LogPosExp(double x) { return log(1.0F + exp(-x)); } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + void operator=(const LogAccumulator &); // Disallow +}; + + +// Stores shareable data for fast log accumulator copies. +class FastLogAccumulatorData { + public: + FastLogAccumulatorData() {} + + vector *Weights() { return &weights_; } + vector *WeightPositions() { return &weight_positions_; } + double *WeightEnd() { return &(weights_[weights_.size() - 1]); }; + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + // Cummulative weight per state for all states s.t. # of arcs > + // arc_limit_ with arcs in order. Special first element per state + // being Log64Weight::Zero(); + vector weights_; + // Maps from state to corresponding beginning weight position in + // weights_. Position -1 means no pre-computed weights for that + // state. + vector weight_positions_; + RefCounter ref_count_; // Reference count. + + DISALLOW_COPY_AND_ASSIGN(FastLogAccumulatorData); +}; + + +// This class accumulates arc weights using the log semiring Plus() +// assuming an arc weight has a WeightConvert specialization to and +// from log64 weights. The member function Init(fst) has to be called +// to setup pre-computed weight information. +template +class FastLogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit FastLogAccumulator(ssize_t arc_limit = 20, ssize_t arc_period = 10) + : arc_limit_(arc_limit), + arc_period_(arc_period), + data_(new FastLogAccumulatorData()), + error_(false) {} + + FastLogAccumulator(const FastLogAccumulator &acc) + : arc_limit_(acc.arc_limit_), + arc_period_(acc.arc_period_), + data_(acc.data_), + error_(acc.error_) { + data_->IncrRefCount(); + } + + ~FastLogAccumulator() { + if (!data_->DecrRefCount()) + delete data_; + } + + void SetState(StateId s) { + vector &weights = *data_->Weights(); + vector &weight_positions = *data_->WeightPositions(); + + if (weight_positions.size() <= s) { + FSTERROR() << "FastLogAccumulator::SetState: invalid state id."; + error_ = true; + return; + } + + ssize_t pos = weight_positions[s]; + if (pos >= 0) + state_weights_ = &(weights[pos]); + else + state_weights_ = 0; + } + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + if (error_) return Weight::NoWeight(); + Weight sum = w; + // Finds begin and end of pre-stored weights + ssize_t index_begin = -1, index_end = -1; + ssize_t stored_begin = end, stored_end = end; + if (state_weights_ != 0) { + index_begin = begin > 0 ? (begin - 1)/ arc_period_ + 1 : 0; + index_end = end / arc_period_; + stored_begin = index_begin * arc_period_; + stored_end = index_end * arc_period_; + } + // Computes sum before pre-stored weights + if (begin < stored_begin) { + ssize_t pos_end = min(stored_begin, end); + aiter->Seek(begin); + for (ssize_t pos = begin; pos < pos_end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + } + // Computes sum between pre-stored weights + if (stored_begin < stored_end) { + sum = LogPlus(sum, LogMinus(state_weights_[index_end], + state_weights_[index_begin])); + } + // Computes sum after pre-stored weights + if (stored_end < end) { + ssize_t pos_start = max(stored_begin, stored_end); + aiter->Seek(pos_start); + for (ssize_t pos = pos_start; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + } + return sum; + } + + template + void Init(const F &fst, bool copy = false) { + if (copy) + return; + vector &weights = *data_->Weights(); + vector &weight_positions = *data_->WeightPositions(); + if (!weights.empty() || arc_limit_ < arc_period_) { + FSTERROR() << "FastLogAccumulator: initialization error."; + error_ = true; + return; + } + weight_positions.reserve(CountStates(fst)); + + ssize_t weight_position = 0; + for(StateIterator siter(fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (fst.NumArcs(s) >= arc_limit_) { + double sum = FloatLimits::kPosInfinity; + weight_positions.push_back(weight_position); + weights.push_back(sum); + ++weight_position; + ssize_t narcs = 0; + for(ArcIterator aiter(fst, s); !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + sum = LogPlus(sum, arc.weight); + // Stores cumulative weight distribution per arc_period_. + if (++narcs % arc_period_ == 0) { + weights.push_back(sum); + ++weight_position; + } + } + } else { + weight_positions.push_back(-1); + } + } + } + + bool Error() const { return error_; } + + private: + double LogPosExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F + exp(-x)); + } + + double LogMinusExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F - exp(-x)); + } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + double LogPlus(double f1, Weight v) { + double f2 = to_log_weight_(v).Value(); + if (f1 == FloatLimits::kPosInfinity) + return f2; + else if (f1 > f2) + return f2 - LogPosExp(f1 - f2); + else + return f1 - LogPosExp(f2 - f1); + } + + Weight LogMinus(double f1, double f2) { + if (f1 >= f2) { + FSTERROR() << "FastLogAcumulator::LogMinus: f1 >= f2 with f1 = " << f1 + << " and f2 = " << f2; + error_ = true; + return Weight::NoWeight(); + } + if (f2 == FloatLimits::kPosInfinity) + return to_weight_(f1); + else + return to_weight_(f1 - LogMinusExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + ssize_t arc_limit_; // Minimum # of arcs to pre-compute state + ssize_t arc_period_; // Save cumulative weights per 'arc_period_'. + bool init_; // Cumulative weights initialized? + FastLogAccumulatorData *data_; + double *state_weights_; + bool error_; + + void operator=(const FastLogAccumulator &); // Disallow +}; + + +// Stores shareable data for cache log accumulator copies. +// All copies share the same cache. +template +class CacheLogAccumulatorData { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + CacheLogAccumulatorData(bool gc, size_t gc_limit) + : cache_gc_(gc), cache_limit_(gc_limit), cache_size_(0) {} + + ~CacheLogAccumulatorData() { + for(typename unordered_map::iterator it = cache_.begin(); + it != cache_.end(); + ++it) + delete it->second.weights; + } + + bool CacheDisabled() const { return cache_gc_ && cache_limit_ == 0; } + + vector *GetWeights(StateId s) { + typename unordered_map::iterator it = cache_.find(s); + if (it != cache_.end()) { + it->second.recent = true; + return it->second.weights; + } else { + return 0; + } + } + + void AddWeights(StateId s, vector *weights) { + if (cache_gc_ && cache_size_ >= cache_limit_) + GC(false); + cache_.insert(make_pair(s, CacheState(weights, true))); + if (cache_gc_) + cache_size_ += weights->capacity() * sizeof(double); + } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + // Cached information for a given state. + struct CacheState { + vector* weights; // Accumulated weights for this state. + bool recent; // Has this state been accessed since last GC? + + CacheState(vector *w, bool r) : weights(w), recent(r) {} + }; + + // Garbage collect: Delete from cache states that have not been + // accessed since the last GC ('free_recent = false') until + // 'cache_size_' is 2/3 of 'cache_limit_'. If it does not free enough + // memory, start deleting recently accessed states. + void GC(bool free_recent) { + size_t cache_target = (2 * cache_limit_)/3 + 1; + typename unordered_map::iterator it = cache_.begin(); + while (it != cache_.end() && cache_size_ > cache_target) { + CacheState &cs = it->second; + if (free_recent || !cs.recent) { + cache_size_ -= cs.weights->capacity() * sizeof(double); + delete cs.weights; + cache_.erase(it++); + } else { + cs.recent = false; + ++it; + } + } + if (!free_recent && cache_size_ > cache_target) + GC(true); + } + + unordered_map cache_; // Cache + bool cache_gc_; // Enable garbage collection + size_t cache_limit_; // # of bytes cached + size_t cache_size_; // # of bytes allowed before GC + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(CacheLogAccumulatorData); +}; + +// This class accumulates arc weights using the log semiring Plus() +// has a WeightConvert specialization to and from log64 weights. It +// is similar to the FastLogAccumator. However here, the accumulated +// weights are pre-computed and stored only for the states that are +// visited. The member function Init(fst) has to be called to setup +// this accumulator. +template +class CacheLogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit CacheLogAccumulator(ssize_t arc_limit = 10, bool gc = false, + size_t gc_limit = 10 * 1024 * 1024) + : arc_limit_(arc_limit), fst_(0), data_( + new CacheLogAccumulatorData(gc, gc_limit)), s_(kNoStateId), + error_(false) {} + + CacheLogAccumulator(const CacheLogAccumulator &acc) + : arc_limit_(acc.arc_limit_), fst_(acc.fst_ ? acc.fst_->Copy() : 0), + data_(acc.data_), s_(kNoStateId), error_(acc.error_) { + data_->IncrRefCount(); + } + + ~CacheLogAccumulator() { + if (fst_) + delete fst_; + if (!data_->DecrRefCount()) + delete data_; + } + + // Arg 'arc_limit' specifies minimum # of arcs to pre-compute state. + void Init(const Fst &fst, bool copy = false) { + if (copy) { + delete fst_; + } else if (fst_) { + FSTERROR() << "CacheLogAccumulator: initialization error."; + error_ = true; + return; + } + fst_ = fst.Copy(); + } + + void SetState(StateId s, int depth = 0) { + if (s == s_) + return; + s_ = s; + + if (data_->CacheDisabled() || error_) { + weights_ = 0; + return; + } + + if (!fst_) { + FSTERROR() << "CacheLogAccumulator::SetState: incorrectly initialized."; + error_ = true; + weights_ = 0; + return; + } + + weights_ = data_->GetWeights(s); + if ((weights_ == 0) && (fst_->NumArcs(s) >= arc_limit_)) { + weights_ = new vector; + weights_->reserve(fst_->NumArcs(s) + 1); + weights_->push_back(FloatLimits::kPosInfinity); + data_->AddWeights(s, weights_); + } + } + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, Iterator *aiter, ssize_t begin, + ssize_t end) { + if (weights_ == 0) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + return sum; + } else { + if (weights_->size() <= end) + for (aiter->Seek(weights_->size() - 1); + weights_->size() <= end; + aiter->Next()) + weights_->push_back(LogPlus(weights_->back(), + aiter->Value().weight)); + return LogPlus(w, LogMinus((*weights_)[end], (*weights_)[begin])); + } + } + + template + size_t LowerBound(double w, Iterator *aiter) { + if (weights_ != 0) { + return lower_bound(weights_->begin() + 1, + weights_->end(), + w, + std::greater()) + - weights_->begin() - 1; + } else { + size_t n = 0; + double x = FloatLimits::kPosInfinity; + for(aiter->Reset(); !aiter->Done(); aiter->Next(), ++n) { + x = LogPlus(x, aiter->Value().weight); + if (x < w) break; + } + return n; + } + } + + bool Error() const { return error_; } + + private: + double LogPosExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F + exp(-x)); + } + + double LogMinusExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F - exp(-x)); + } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + double LogPlus(double f1, Weight v) { + double f2 = to_log_weight_(v).Value(); + if (f1 == FloatLimits::kPosInfinity) + return f2; + else if (f1 > f2) + return f2 - LogPosExp(f1 - f2); + else + return f1 - LogPosExp(f2 - f1); + } + + Weight LogMinus(double f1, double f2) { + if (f1 >= f2) { + FSTERROR() << "CacheLogAcumulator::LogMinus: f1 >= f2 with f1 = " << f1 + << " and f2 = " << f2; + error_ = true; + return Weight::NoWeight(); + } + if (f2 == FloatLimits::kPosInfinity) + return to_weight_(f1); + else + return to_weight_(f1 - LogMinusExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + ssize_t arc_limit_; // Minimum # of arcs to cache a state + vector *weights_; // Accumulated weights for cur. state + const Fst* fst_; // Input fst + CacheLogAccumulatorData *data_; // Cache data + StateId s_; // Current state + bool error_; + + void operator=(const CacheLogAccumulator &); // Disallow +}; + + +// Stores shareable data for replace accumulator copies. +template +class ReplaceAccumulatorData { + public: + typedef typename Accumulator::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef T StateTable; + typedef typename T::StateTuple StateTuple; + + ReplaceAccumulatorData() : state_table_(0) {} + + ReplaceAccumulatorData(const vector &accumulators) + : state_table_(0), accumulators_(accumulators) {} + + ~ReplaceAccumulatorData() { + for (size_t i = 0; i < fst_array_.size(); ++i) + delete fst_array_[i]; + for (size_t i = 0; i < accumulators_.size(); ++i) + delete accumulators_[i]; + } + + void Init(const vector*> > &fst_tuples, + const StateTable *state_table) { + state_table_ = state_table; + accumulators_.resize(fst_tuples.size()); + for (size_t i = 0; i < accumulators_.size(); ++i) { + if (!accumulators_[i]) + accumulators_[i] = new Accumulator; + accumulators_[i]->Init(*(fst_tuples[i].second)); + fst_array_.push_back(fst_tuples[i].second->Copy()); + } + } + + const StateTuple &GetTuple(StateId s) const { + return state_table_->Tuple(s); + } + + Accumulator *GetAccumulator(size_t i) { return accumulators_[i]; } + + const Fst *GetFst(size_t i) const { return fst_array_[i]; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + const T * state_table_; + vector accumulators_; + vector*> fst_array_; + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(ReplaceAccumulatorData); +}; + +// This class accumulates weights in a ReplaceFst. The 'Init' method +// takes as input the argument used to build the ReplaceFst and the +// ReplaceFst state table. It uses accumulators of type 'Accumulator' +// in the underlying FSTs. +template > +class ReplaceAccumulator { + public: + typedef typename Accumulator::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef T StateTable; + typedef typename T::StateTuple StateTuple; + + ReplaceAccumulator() + : init_(false), data_(new ReplaceAccumulatorData()), + error_(false) {} + + ReplaceAccumulator(const vector &accumulators) + : init_(false), + data_(new ReplaceAccumulatorData(accumulators)), + error_(false) {} + + ReplaceAccumulator(const ReplaceAccumulator &acc) + : init_(acc.init_), data_(acc.data_), error_(acc.error_) { + if (!init_) + FSTERROR() << "ReplaceAccumulator: can't copy unintialized accumulator"; + data_->IncrRefCount(); + } + + ~ReplaceAccumulator() { + if (!data_->DecrRefCount()) + delete data_; + } + + // Does not take ownership of the state table, the state table + // is own by the ReplaceFst + void Init(const vector*> > &fst_tuples, + const StateTable *state_table) { + init_ = true; + data_->Init(fst_tuples, state_table); + } + + void SetState(StateId s) { + if (!init_) { + FSTERROR() << "ReplaceAccumulator::SetState: incorrectly initialized."; + error_ = true; + return; + } + StateTuple tuple = data_->GetTuple(s); + fst_id_ = tuple.fst_id - 1; // Replace FST ID is 1-based + data_->GetAccumulator(fst_id_)->SetState(tuple.fst_state); + if ((tuple.prefix_id != 0) && + (data_->GetFst(fst_id_)->Final(tuple.fst_state) != Weight::Zero())) { + offset_ = 1; + offset_weight_ = data_->GetFst(fst_id_)->Final(tuple.fst_state); + } else { + offset_ = 0; + offset_weight_ = Weight::Zero(); + } + } + + Weight Sum(Weight w, Weight v) { + if (error_) return Weight::NoWeight(); + return data_->GetAccumulator(fst_id_)->Sum(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + if (error_) return Weight::NoWeight(); + Weight sum = begin == end ? Weight::Zero() + : data_->GetAccumulator(fst_id_)->Sum( + w, aiter, begin ? begin - offset_ : 0, end - offset_); + if (begin == 0 && end != 0 && offset_ > 0) + sum = Sum(offset_weight_, sum); + return sum; + } + + bool Error() const { return error_; } + + private: + bool init_; + ReplaceAccumulatorData *data_; + Label fst_id_; + size_t offset_; + Weight offset_weight_; + bool error_; + + void operator=(const ReplaceAccumulator &); // Disallow +}; + +} // namespace fst + +#endif // FST_LIB_ACCUMULATOR_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/accumulator.h.bak b/extlibs/openfstwin-1.3.1/include/fst/accumulator.h.bak new file mode 100755 index 00000000000..a495bccaa85 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/accumulator.h.bak @@ -0,0 +1,745 @@ +// accumulator.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes to accumulate arc weights. Useful for weight lookahead. + +#ifndef FST_LIB_ACCUMULATOR_H__ +#define FST_LIB_ACCUMULATOR_H__ + +#include +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::vector; + +#include +#include +#include +#include +#include + +namespace fst { + +// This class accumulates arc weights using the semiring Plus(). +template +class DefaultAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + DefaultAccumulator() {} + + DefaultAccumulator(const DefaultAccumulator &acc) {} + + void Init(const Fst& fst, bool copy = false) {} + + void SetState(StateId) {} + + Weight Sum(Weight w, Weight v) { + return Plus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = Plus(sum, aiter->Value().weight); + return sum; + } + + bool Error() const { return false; } + + private: + void operator=(const DefaultAccumulator &); // Disallow +}; + + +// This class accumulates arc weights using the log semiring Plus() +// assuming an arc weight has a WeightConvert specialization to +// and from log64 weights. +template +class LogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + LogAccumulator() {} + + LogAccumulator(const LogAccumulator &acc) {} + + void Init(const Fst& fst, bool copy = false) {} + + void SetState(StateId) {} + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + return sum; + } + + bool Error() const { return false; } + + private: + double LogPosExp(double x) { return log(1.0F + exp(-x)); } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + void operator=(const LogAccumulator &); // Disallow +}; + + +// Stores shareable data for fast log accumulator copies. +class FastLogAccumulatorData { + public: + FastLogAccumulatorData() {} + + vector *Weights() { return &weights_; } + vector *WeightPositions() { return &weight_positions_; } + double *WeightEnd() { return &(weights_[weights_.size() - 1]); }; + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + // Cummulative weight per state for all states s.t. # of arcs > + // arc_limit_ with arcs in order. Special first element per state + // being Log64Weight::Zero(); + vector weights_; + // Maps from state to corresponding beginning weight position in + // weights_. Position -1 means no pre-computed weights for that + // state. + vector weight_positions_; + RefCounter ref_count_; // Reference count. + + DISALLOW_COPY_AND_ASSIGN(FastLogAccumulatorData); +}; + + +// This class accumulates arc weights using the log semiring Plus() +// assuming an arc weight has a WeightConvert specialization to and +// from log64 weights. The member function Init(fst) has to be called +// to setup pre-computed weight information. +template +class FastLogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit FastLogAccumulator(ssize_t arc_limit = 20, ssize_t arc_period = 10) + : arc_limit_(arc_limit), + arc_period_(arc_period), + data_(new FastLogAccumulatorData()), + error_(false) {} + + FastLogAccumulator(const FastLogAccumulator &acc) + : arc_limit_(acc.arc_limit_), + arc_period_(acc.arc_period_), + data_(acc.data_), + error_(acc.error_) { + data_->IncrRefCount(); + } + + ~FastLogAccumulator() { + if (!data_->DecrRefCount()) + delete data_; + } + + void SetState(StateId s) { + vector &weights = *data_->Weights(); + vector &weight_positions = *data_->WeightPositions(); + + if (weight_positions.size() <= s) { + FSTERROR() << "FastLogAccumulator::SetState: invalid state id."; + error_ = true; + return; + } + + ssize_t pos = weight_positions[s]; + if (pos >= 0) + state_weights_ = &(weights[pos]); + else + state_weights_ = 0; + } + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + if (error_) return Weight::NoWeight(); + Weight sum = w; + // Finds begin and end of pre-stored weights + ssize_t index_begin = -1, index_end = -1; + ssize_t stored_begin = end, stored_end = end; + if (state_weights_ != 0) { + index_begin = begin > 0 ? (begin - 1)/ arc_period_ + 1 : 0; + index_end = end / arc_period_; + stored_begin = index_begin * arc_period_; + stored_end = index_end * arc_period_; + } + // Computes sum before pre-stored weights + if (begin < stored_begin) { + ssize_t pos_end = min(stored_begin, end); + aiter->Seek(begin); + for (ssize_t pos = begin; pos < pos_end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + } + // Computes sum between pre-stored weights + if (stored_begin < stored_end) { + sum = LogPlus(sum, LogMinus(state_weights_[index_end], + state_weights_[index_begin])); + } + // Computes sum after pre-stored weights + if (stored_end < end) { + ssize_t pos_start = max(stored_begin, stored_end); + aiter->Seek(pos_start); + for (ssize_t pos = pos_start; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + } + return sum; + } + + template + void Init(const F &fst, bool copy = false) { + if (copy) + return; + vector &weights = *data_->Weights(); + vector &weight_positions = *data_->WeightPositions(); + if (!weights.empty() || arc_limit_ < arc_period_) { + FSTERROR() << "FastLogAccumulator: initialization error."; + error_ = true; + return; + } + weight_positions.reserve(CountStates(fst)); + + ssize_t weight_position = 0; + for(StateIterator siter(fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (fst.NumArcs(s) >= arc_limit_) { + double sum = FloatLimits::kPosInfinity; + weight_positions.push_back(weight_position); + weights.push_back(sum); + ++weight_position; + ssize_t narcs = 0; + for(ArcIterator aiter(fst, s); !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + sum = LogPlus(sum, arc.weight); + // Stores cumulative weight distribution per arc_period_. + if (++narcs % arc_period_ == 0) { + weights.push_back(sum); + ++weight_position; + } + } + } else { + weight_positions.push_back(-1); + } + } + } + + bool Error() const { return error_; } + + private: + double LogPosExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F + exp(-x)); + } + + double LogMinusExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F - exp(-x)); + } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + double LogPlus(double f1, Weight v) { + double f2 = to_log_weight_(v).Value(); + if (f1 == FloatLimits::kPosInfinity) + return f2; + else if (f1 > f2) + return f2 - LogPosExp(f1 - f2); + else + return f1 - LogPosExp(f2 - f1); + } + + Weight LogMinus(double f1, double f2) { + if (f1 >= f2) { + FSTERROR() << "FastLogAcumulator::LogMinus: f1 >= f2 with f1 = " << f1 + << " and f2 = " << f2; + error_ = true; + return Weight::NoWeight(); + } + if (f2 == FloatLimits::kPosInfinity) + return to_weight_(f1); + else + return to_weight_(f1 - LogMinusExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + ssize_t arc_limit_; // Minimum # of arcs to pre-compute state + ssize_t arc_period_; // Save cumulative weights per 'arc_period_'. + bool init_; // Cumulative weights initialized? + FastLogAccumulatorData *data_; + double *state_weights_; + bool error_; + + void operator=(const FastLogAccumulator &); // Disallow +}; + + +// Stores shareable data for cache log accumulator copies. +// All copies share the same cache. +template +class CacheLogAccumulatorData { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + CacheLogAccumulatorData(bool gc, size_t gc_limit) + : cache_gc_(gc), cache_limit_(gc_limit), cache_size_(0) {} + + ~CacheLogAccumulatorData() { + for(typename unordered_map::iterator it = cache_.begin(); + it != cache_.end(); + ++it) + delete it->second.weights; + } + + bool CacheDisabled() const { return cache_gc_ && cache_limit_ == 0; } + + vector *GetWeights(StateId s) { + typename unordered_map::iterator it = cache_.find(s); + if (it != cache_.end()) { + it->second.recent = true; + return it->second.weights; + } else { + return 0; + } + } + + void AddWeights(StateId s, vector *weights) { + if (cache_gc_ && cache_size_ >= cache_limit_) + GC(false); + cache_.insert(make_pair(s, CacheState(weights, true))); + if (cache_gc_) + cache_size_ += weights->capacity() * sizeof(double); + } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + // Cached information for a given state. + struct CacheState { + vector* weights; // Accumulated weights for this state. + bool recent; // Has this state been accessed since last GC? + + CacheState(vector *w, bool r) : weights(w), recent(r) {} + }; + + // Garbage collect: Delete from cache states that have not been + // accessed since the last GC ('free_recent = false') until + // 'cache_size_' is 2/3 of 'cache_limit_'. If it does not free enough + // memory, start deleting recently accessed states. + void GC(bool free_recent) { + size_t cache_target = (2 * cache_limit_)/3 + 1; + typename unordered_map::iterator it = cache_.begin(); + while (it != cache_.end() && cache_size_ > cache_target) { + CacheState &cs = it->second; + if (free_recent || !cs.recent) { + cache_size_ -= cs.weights->capacity() * sizeof(double); + delete cs.weights; + cache_.erase(it++); + } else { + cs.recent = false; + ++it; + } + } + if (!free_recent && cache_size_ > cache_target) + GC(true); + } + + unordered_map cache_; // Cache + bool cache_gc_; // Enable garbage collection + size_t cache_limit_; // # of bytes cached + size_t cache_size_; // # of bytes allowed before GC + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(CacheLogAccumulatorData); +}; + +// This class accumulates arc weights using the log semiring Plus() +// has a WeightConvert specialization to and from log64 weights. It +// is similar to the FastLogAccumator. However here, the accumulated +// weights are pre-computed and stored only for the states that are +// visited. The member function Init(fst) has to be called to setup +// this accumulator. +template +class CacheLogAccumulator { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit CacheLogAccumulator(ssize_t arc_limit = 10, bool gc = false, + size_t gc_limit = 10 * 1024 * 1024) + : arc_limit_(arc_limit), fst_(0), data_( + new CacheLogAccumulatorData(gc, gc_limit)), s_(kNoStateId), + error_(false) {} + + CacheLogAccumulator(const CacheLogAccumulator &acc) + : arc_limit_(acc.arc_limit_), fst_(acc.fst_ ? acc.fst_->Copy() : 0), + data_(acc.data_), s_(kNoStateId), error_(acc.error_) { + data_->IncrRefCount(); + } + + ~CacheLogAccumulator() { + if (fst_) + delete fst_; + if (!data_->DecrRefCount()) + delete data_; + } + + // Arg 'arc_limit' specifies minimum # of arcs to pre-compute state. + void Init(const Fst &fst, bool copy = false) { + if (copy) { + delete fst_; + } else if (fst_) { + FSTERROR() << "CacheLogAccumulator: initialization error."; + error_ = true; + return; + } + fst_ = fst.Copy(); + } + + void SetState(StateId s, int depth = 0) { + if (s == s_) + return; + s_ = s; + + if (data_->CacheDisabled() || error_) { + weights_ = 0; + return; + } + + if (!fst_) { + FSTERROR() << "CacheLogAccumulator::SetState: incorrectly initialized."; + error_ = true; + weights_ = 0; + return; + } + + weights_ = data_->GetWeights(s); + if ((weights_ == 0) && (fst_->NumArcs(s) >= arc_limit_)) { + weights_ = new vector; + weights_->reserve(fst_->NumArcs(s) + 1); + weights_->push_back(FloatLimits::kPosInfinity); + data_->AddWeights(s, weights_); + } + } + + Weight Sum(Weight w, Weight v) { + return LogPlus(w, v); + } + + template + Weight Sum(Weight w, Iterator *aiter, ssize_t begin, + ssize_t end) { + if (weights_ == 0) { + Weight sum = w; + aiter->Seek(begin); + for (ssize_t pos = begin; pos < end; aiter->Next(), ++pos) + sum = LogPlus(sum, aiter->Value().weight); + return sum; + } else { + if (weights_->size() <= end) + for (aiter->Seek(weights_->size() - 1); + weights_->size() <= end; + aiter->Next()) + weights_->push_back(LogPlus(weights_->back(), + aiter->Value().weight)); + return LogPlus(w, LogMinus((*weights_)[end], (*weights_)[begin])); + } + } + + template + size_t LowerBound(double w, Iterator *aiter) { + if (weights_ != 0) { + return lower_bound(weights_->begin() + 1, + weights_->end(), + w, + std::greater()) + - weights_->begin() - 1; + } else { + size_t n = 0; + double x = FloatLimits::kPosInfinity; + for(aiter->Reset(); !aiter->Done(); aiter->Next(), ++n) { + x = LogPlus(x, aiter->Value().weight); + if (x < w) break; + } + return n; + } + } + + bool Error() const { return error_; } + + private: + double LogPosExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F + exp(-x)); + } + + double LogMinusExp(double x) { + return x == FloatLimits::kPosInfinity ? + 0.0 : log(1.0F - exp(-x)); + } + + Weight LogPlus(Weight w, Weight v) { + double f1 = to_log_weight_(w).Value(); + double f2 = to_log_weight_(v).Value(); + if (f1 > f2) + return to_weight_(f2 - LogPosExp(f1 - f2)); + else + return to_weight_(f1 - LogPosExp(f2 - f1)); + } + + double LogPlus(double f1, Weight v) { + double f2 = to_log_weight_(v).Value(); + if (f1 == FloatLimits::kPosInfinity) + return f2; + else if (f1 > f2) + return f2 - LogPosExp(f1 - f2); + else + return f1 - LogPosExp(f2 - f1); + } + + Weight LogMinus(double f1, double f2) { + if (f1 >= f2) { + FSTERROR() << "CacheLogAcumulator::LogMinus: f1 >= f2 with f1 = " << f1 + << " and f2 = " << f2; + error_ = true; + return Weight::NoWeight(); + } + if (f2 == FloatLimits::kPosInfinity) + return to_weight_(f1); + else + return to_weight_(f1 - LogMinusExp(f2 - f1)); + } + + WeightConvert to_log_weight_; + WeightConvert to_weight_; + + ssize_t arc_limit_; // Minimum # of arcs to cache a state + vector *weights_; // Accumulated weights for cur. state + const Fst* fst_; // Input fst + CacheLogAccumulatorData *data_; // Cache data + StateId s_; // Current state + bool error_; + + void operator=(const CacheLogAccumulator &); // Disallow +}; + + +// Stores shareable data for replace accumulator copies. +template +class ReplaceAccumulatorData { + public: + typedef typename Accumulator::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef T StateTable; + typedef typename T::StateTuple StateTuple; + + ReplaceAccumulatorData() : state_table_(0) {} + + ReplaceAccumulatorData(const vector &accumulators) + : state_table_(0), accumulators_(accumulators) {} + + ~ReplaceAccumulatorData() { + for (size_t i = 0; i < fst_array_.size(); ++i) + delete fst_array_[i]; + for (size_t i = 0; i < accumulators_.size(); ++i) + delete accumulators_[i]; + } + + void Init(const vector*> > &fst_tuples, + const StateTable *state_table) { + state_table_ = state_table; + accumulators_.resize(fst_tuples.size()); + for (size_t i = 0; i < accumulators_.size(); ++i) { + if (!accumulators_[i]) + accumulators_[i] = new Accumulator; + accumulators_[i]->Init(*(fst_tuples[i].second)); + fst_array_.push_back(fst_tuples[i].second->Copy()); + } + } + + const StateTuple &GetTuple(StateId s) const { + return state_table_->Tuple(s); + } + + Accumulator *GetAccumulator(size_t i) { return accumulators_[i]; } + + const Fst *GetFst(size_t i) const { return fst_array_[i]; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + const T * state_table_; + vector accumulators_; + vector*> fst_array_; + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(ReplaceAccumulatorData); +}; + +// This class accumulates weights in a ReplaceFst. The 'Init' method +// takes as input the argument used to build the ReplaceFst and the +// ReplaceFst state table. It uses accumulators of type 'Accumulator' +// in the underlying FSTs. +template > +class ReplaceAccumulator { + public: + typedef typename Accumulator::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef T StateTable; + typedef typename T::StateTuple StateTuple; + + ReplaceAccumulator() + : init_(false), data_(new ReplaceAccumulatorData()), + error_(false) {} + + ReplaceAccumulator(const vector &accumulators) + : init_(false), + data_(new ReplaceAccumulatorData(accumulators)), + error_(false) {} + + ReplaceAccumulator(const ReplaceAccumulator &acc) + : init_(acc.init_), data_(acc.data_), error_(acc.error_) { + if (!init_) + FSTERROR() << "ReplaceAccumulator: can't copy unintialized accumulator"; + data_->IncrRefCount(); + } + + ~ReplaceAccumulator() { + if (!data_->DecrRefCount()) + delete data_; + } + + // Does not take ownership of the state table, the state table + // is own by the ReplaceFst + void Init(const vector*> > &fst_tuples, + const StateTable *state_table) { + init_ = true; + data_->Init(fst_tuples, state_table); + } + + void SetState(StateId s) { + if (!init_) { + FSTERROR() << "ReplaceAccumulator::SetState: incorrectly initialized."; + error_ = true; + return; + } + StateTuple tuple = data_->GetTuple(s); + fst_id_ = tuple.fst_id - 1; // Replace FST ID is 1-based + data_->GetAccumulator(fst_id_)->SetState(tuple.fst_state); + if ((tuple.prefix_id != 0) && + (data_->GetFst(fst_id_)->Final(tuple.fst_state) != Weight::Zero())) { + offset_ = 1; + offset_weight_ = data_->GetFst(fst_id_)->Final(tuple.fst_state); + } else { + offset_ = 0; + offset_weight_ = Weight::Zero(); + } + } + + Weight Sum(Weight w, Weight v) { + if (error_) return Weight::NoWeight(); + return data_->GetAccumulator(fst_id_)->Sum(w, v); + } + + template + Weight Sum(Weight w, ArcIterator *aiter, ssize_t begin, + ssize_t end) { + if (error_) return Weight::NoWeight(); + Weight sum = begin == end ? Weight::Zero() + : data_->GetAccumulator(fst_id_)->Sum( + w, aiter, begin ? begin - offset_ : 0, end - offset_); + if (begin == 0 && end != 0 && offset_ > 0) + sum = Sum(offset_weight_, sum); + return sum; + } + + bool Error() const { return error_; } + + private: + bool init_; + ReplaceAccumulatorData *data_; + Label fst_id_; + size_t offset_; + Weight offset_weight_; + bool error_; + + void operator=(const ReplaceAccumulator &); // Disallow +}; + +} // namespace fst + +#endif // FST_LIB_ACCUMULATOR_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/add-on.h b/extlibs/openfstwin-1.3.1/include/fst/add-on.h new file mode 100755 index 00000000000..ee21a93a10b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/add-on.h @@ -0,0 +1,306 @@ +// add-on.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Fst implementation class to attach an arbitrary object with a +// read/write method to an FST and its file rep. The FST is given a +// new type name. + +#ifndef FST_LIB_ADD_ON_FST_H__ +#define FST_LIB_ADD_ON_FST_H__ + +#include +#include + +#include + + +namespace fst { + +// Identifies stream data as an add-on fst. +static const int32 kAddOnMagicNumber = 446681434; + + +// +// Some useful add-on objects. +// + +// Nothing to save. +class NullAddOn { + public: + NullAddOn() {} + + static NullAddOn *Read(istream &istrm) { + return new NullAddOn(); + }; + + bool Write(ostream &ostrm) const { return true; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(NullAddOn); +}; + + +// Create a new add-on from a pair of add-ons. +template +class AddOnPair { + public: + // Argument reference count incremented. + AddOnPair(A1 *a1, A2 *a2) + : a1_(a1), a2_(a2) { + if (a1_) + a1_->IncrRefCount(); + if (a2_) + a2_->IncrRefCount(); + } + + ~AddOnPair() { + if (a1_ && !a1_->DecrRefCount()) + delete a1_; + if (a2_ && !a2_->DecrRefCount()) + delete a2_; + } + + A1 *First() const { return a1_; } + A2 *Second() const { return a2_; } + + static AddOnPair *Read(istream &istrm) { + A1 *a1 = 0; + bool have_addon1 = false; + ReadType(istrm, &have_addon1); + if (have_addon1) + a1 = A1::Read(istrm); + + A2 *a2 = 0; + bool have_addon2 = false; + ReadType(istrm, &have_addon2); + if (have_addon2) + a2 = A2::Read(istrm); + + AddOnPair *a = new AddOnPair(a1, a2); + if (a1) + a1->DecrRefCount(); + if (a2) + a2->DecrRefCount(); + return a; + }; + + bool Write(ostream &ostrm) const { + bool have_addon1 = a1_; + WriteType(ostrm, have_addon1); + if (have_addon1) + a1_->Write(ostrm); + bool have_addon2 = a2_; + WriteType(ostrm, have_addon2); + if (have_addon2) + a2_->Write(ostrm); + return true; + } + + int RefCount() const { return ref_count_.count(); } + + int IncrRefCount() { + return ref_count_.Incr(); + } + + int DecrRefCount() { + return ref_count_.Decr(); + } + + private: + A1 *a1_; + A2 *a2_; + RefCounter ref_count_; + + DISALLOW_COPY_AND_ASSIGN(AddOnPair); +}; + + +// Add to an Fst F a type T object. T must have a 'T* Read(istream &)', +// a 'bool Write(ostream &)' method, and 'int RecCount(), 'int IncrRefCount()' +// and 'int DecrRefCount()' methods (e.g. 'MatcherData' in matcher-fst.h). +// The result is a new Fst implemenation with type name 'type'. +template +class AddOnImpl : public FstImpl { + public: + typedef typename F::Arc Arc; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + + // If 't' is non-zero, its reference count is incremented. + AddOnImpl(const F &fst, const string &type, T *t = 0) + : fst_(fst), t_(t) { + SetType(type); + SetProperties(fst_.Properties(kFstProperties, false)); + if (t_) + t_->IncrRefCount(); + } + + // If 't' is non-zero, its reference count is incremented. + AddOnImpl(const Fst &fst, const string &type, T *t = 0) + : fst_(fst), t_(t) { + SetType(type); + SetProperties(fst_.Properties(kFstProperties, false)); + if (t_) + t_->IncrRefCount(); + } + + AddOnImpl(const AddOnImpl &impl) + : fst_(impl.fst_), t_(impl.t_) { + SetType(impl.Type()); + SetProperties(fst_.Properties(kCopyProperties, false)); + if (t_) + t_->IncrRefCount(); + } + + ~AddOnImpl() { + if (t_ && !t_->DecrRefCount()) + delete t_; + } + + StateId Start() const { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + size_t NumArcs(StateId s) const { return fst_.NumArcs(s); } + + size_t NumInputEpsilons(StateId s) const { + return fst_.NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) const { + return fst_.NumOutputEpsilons(s); + } + + size_t NumStates() const { return fst_.NumStates(); } + + static AddOnImpl *Read(istream &strm, const FstReadOptions &opts) { + FstReadOptions nopts(opts); + FstHeader hdr; + if (!nopts.header) { + hdr.Read(strm, nopts.source); + nopts.header = &hdr; + } + AddOnImpl *impl = new AddOnImpl(nopts.header->FstType()); + if (!impl->ReadHeader(strm, nopts, kMinFileVersion, &hdr)) + return 0; + delete impl; // Used here only for checking types. + + int32 magic_number = 0; + ReadType(strm, &magic_number); // Ensures this is an add-on Fst. + if (magic_number != kAddOnMagicNumber) { + LOG(ERROR) << "AddOnImpl::Read: Bad add-on header: " << nopts.source; + return 0; + } + + FstReadOptions fopts(opts); + fopts.header = 0; // Contained header was written out. + F *fst = F::Read(strm, fopts); + if (!fst) + return 0; + + T *t = 0; + bool have_addon = false; + ReadType(strm, &have_addon); + if (have_addon) { // Read add-on object if present. + t = T::Read(strm); + if (!t) + return 0; + } + impl = new AddOnImpl(*fst, nopts.header->FstType(), t); + delete fst; + if (t) + t->DecrRefCount(); + return impl; + } + + bool Write(ostream &strm, const FstWriteOptions &opts) const { + FstHeader hdr; + FstWriteOptions nopts(opts); + nopts.write_isymbols = false; // Let contained FST hold any symbols. + nopts.write_osymbols = false; + WriteHeader(strm, nopts, kFileVersion, &hdr); + WriteType(strm, kAddOnMagicNumber); // Ensures this is an add-on Fst. + FstWriteOptions fopts(opts); + fopts.write_header = true; // Force writing contained header. + if (!fst_.Write(strm, fopts)) + return false; + bool have_addon = t_; + WriteType(strm, have_addon); + if (have_addon) // Write add-on object if present. + t_->Write(strm); + return true; + } + + void InitStateIterator(StateIteratorData *data) const { + fst_.InitStateIterator(data); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) const { + fst_.InitArcIterator(s, data); + } + + F &GetFst() { return fst_; } + + const F &GetFst() const { return fst_; } + + T *GetAddOn() const { return t_; } + + // If 't' is non-zero, its reference count is incremented. + void SetAddOn(T *t) { + if (t == t_) + return; + if (t_ && !t_->DecrRefCount()) + delete t_; + t_ = t; + if (t_) + t_->IncrRefCount(); + } + + private: + explicit AddOnImpl(const string &type) : t_(0) { + SetType(type); + SetProperties(kExpanded); + } + + // Current file format version + static const int kFileVersion = 1; + // Minimum file format version supported + static const int kMinFileVersion = 1; + + F fst_; + T *t_; + + void operator=(const AddOnImpl &fst); // Disallow +}; + +template const int AddOnImpl::kFileVersion; +template const int AddOnImpl::kMinFileVersion; + + +} // namespace fst + +#endif // FST_LIB_ADD_ON_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/arc-map.h b/extlibs/openfstwin-1.3.1/include/fst/arc-map.h new file mode 100755 index 00000000000..025109a11e7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/arc-map.h @@ -0,0 +1,1146 @@ +// arc-map.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to map over/transform arcs e.g., change semirings or +// implement project/invert. Consider using when operation does +// not change the number of arcs (except possibly superfinal arcs). + +#ifndef FST_LIB_ARC_MAP_H__ +#define FST_LIB_ARC_MAP_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; + +#include +#include + + +namespace fst { + +// This determines how final weights are mapped. +enum MapFinalAction { + // A final weight is mapped into a final weight. An error + // is raised if this is not possible. + MAP_NO_SUPERFINAL, + + // A final weight is mapped to an arc to the superfinal state + // when the result cannot be represented as a final weight. + // The superfinal state will be added only if it is needed. + MAP_ALLOW_SUPERFINAL, + + // A final weight is mapped to an arc to the superfinal state + // unless the result can be represented as a final weight of weight + // Zero(). The superfinal state is always added (if the input is + // not the empty Fst). + MAP_REQUIRE_SUPERFINAL +}; + +// This determines how symbol tables are mapped. +enum MapSymbolsAction { + // Symbols should be cleared in the result by the map. + MAP_CLEAR_SYMBOLS, + + // Symbols should be copied from the input FST by the map. + MAP_COPY_SYMBOLS, + + // Symbols should not be modified in the result by the map itself. + // (They may set by the mapper). + MAP_NOOP_SYMBOLS +}; + +// ArcMapper Interface - class determinies how arcs and final weights +// are mapped. Useful for implementing operations that do not change +// the number of arcs (expect possibly superfinal arcs). +// +// class ArcMapper { +// public: +// typedef A FromArc; +// typedef B ToArc; +// +// // Maps an arc type A to arc type B. +// B operator()(const A &arc); +// // Specifies final action the mapper requires (see above). +// // The mapper will be passed final weights as arcs of the +// // form A(0, 0, weight, kNoStateId). +// MapFinalAction FinalAction() const; +// // Specifies input symbol table action the mapper requires (see above). +// MapSymbolsAction InputSymbolsAction() const; +// // Specifies output symbol table action the mapper requires (see above). +// MapSymbolsAction OutputSymbolsAction() const; +// // This specifies the known properties of an Fst mapped by this +// // mapper. It takes as argument the input Fst's known properties. +// uint64 Properties(uint64 props) const; +// }; +// +// The ArcMap functions and classes below will use the FinalAction() +// method of the mapper to determine how to treat final weights, +// e.g. whether to add a superfinal state. They will use the Properties() +// method to set the result Fst properties. +// +// We include a various map versions below. One dimension of +// variation is whether the mapping mutates its input, writes to a +// new result Fst, or is an on-the-fly Fst. Another dimension is how +// we pass the mapper. We allow passing the mapper by pointer +// for cases that we need to change the state of the user's mapper. +// This is the case with the encode mapper, which is reused during +// decoding. We also include map versions that pass the mapper +// by value or const reference when this suffices. + + +// Maps an arc type A using a mapper function object C, passed +// by pointer. This version modifies its Fst input. +template +void ArcMap(MutableFst *fst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetOutputSymbols(0); + + if (fst->Start() == kNoStateId) + return; + + uint64 props = fst->Properties(kFstProperties, false); + + MapFinalAction final_action = mapper->FinalAction(); + StateId superfinal = kNoStateId; + if (final_action == MAP_REQUIRE_SUPERFINAL) { + superfinal = fst->AddState(); + fst->SetFinal(superfinal, Weight::One()); + } + + for (StateId s = 0; s < fst->NumStates(); ++s) { + for (MutableArcIterator< MutableFst > aiter(fst, s); + !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + aiter.SetValue((*mapper)(arc)); + } + + switch (final_action) { + case MAP_NO_SUPERFINAL: + default: { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMap: non-zero arc labels for superfinal arc"; + fst->SetProperties(kError, kError); + } + + fst->SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + if (s != superfinal) { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + // Add a superfinal state if not already done. + if (superfinal == kNoStateId) { + superfinal = fst->AddState(); + fst->SetFinal(superfinal, Weight::One()); + } + final_arc.nextstate = superfinal; + fst->AddArc(s, final_arc); + fst->SetFinal(s, Weight::Zero()); + } else { + fst->SetFinal(s, final_arc.weight); + } + break; + } + } + case MAP_REQUIRE_SUPERFINAL: { + if (s != superfinal) { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != Weight::Zero()) + fst->AddArc(s, A(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal)); + fst->SetFinal(s, Weight::Zero()); + } + break; + } + } + } + fst->SetProperties(mapper->Properties(props), kFstProperties); +} + + +// Maps an arc type A using a mapper function object C, passed +// by value. This version modifies its Fst input. +template +void ArcMap(MutableFst *fst, C mapper) { + ArcMap(fst, &mapper); +} + + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by pointer. This version writes the mapped +// input Fst to an output MutableFst. +template +void ArcMap(const Fst &ifst, MutableFst *ofst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + ofst->DeleteStates(); + + if (mapper->InputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetInputSymbols(ifst.InputSymbols()); + else if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetOutputSymbols(ifst.OutputSymbols()); + else if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetOutputSymbols(0); + + uint64 iprops = ifst.Properties(kCopyProperties, false); + + if (ifst.Start() == kNoStateId) { + if (iprops & kError) ofst->SetProperties(kError, kError); + return; + } + + MapFinalAction final_action = mapper->FinalAction(); + if (ifst.Properties(kExpanded, false)) { + ofst->ReserveStates(CountStates(ifst) + + final_action == MAP_NO_SUPERFINAL ? 0 : 1); + } + + // Add all states. + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) + ofst->AddState(); + + StateId superfinal = kNoStateId; + if (final_action == MAP_REQUIRE_SUPERFINAL) { + superfinal = ofst->AddState(); + ofst->SetFinal(superfinal, B::Weight::One()); + } + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (s == ifst.Start()) + ofst->SetStart(s); + + ofst->ReserveArcs(s, ifst.NumArcs(s)); + for (ArcIterator< Fst > aiter(ifst, s); !aiter.Done(); aiter.Next()) + ofst->AddArc(s, (*mapper)(aiter.Value())); + + switch (final_action) { + case MAP_NO_SUPERFINAL: + default: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMap: non-zero arc labels for superfinal arc"; + ofst->SetProperties(kError, kError); + } + ofst->SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + // Add a superfinal state if not already done. + if (superfinal == kNoStateId) { + superfinal = ofst->AddState(); + ofst->SetFinal(superfinal, B::Weight::One()); + } + final_arc.nextstate = superfinal; + ofst->AddArc(s, final_arc); + ofst->SetFinal(s, B::Weight::Zero()); + } else { + ofst->SetFinal(s, final_arc.weight); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != B::Weight::Zero()) + ofst->AddArc(s, B(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal)); + ofst->SetFinal(s, B::Weight::Zero()); + break; + } + } + } + uint64 oprops = ofst->Properties(kFstProperties, false); + ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties); +} + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by value. This version writes the mapped input +// Fst to an output MutableFst. +template +void ArcMap(const Fst &ifst, MutableFst *ofst, C mapper) { + ArcMap(ifst, ofst, &mapper); +} + + +struct ArcMapFstOptions : public CacheOptions { + // ArcMapFst default caching behaviour is to do no caching. Most + // mappers are cheap and therefore we save memory by not doing + // caching. + ArcMapFstOptions() : CacheOptions(true, 0) {} + ArcMapFstOptions(const CacheOptions& opts) : CacheOptions(opts) {} +}; + + +template class ArcMapFst; + +// Implementation of delayed ArcMapFst. +template +class ArcMapFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using VectorFstBaseImpl::State>::NumStates; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + friend class StateIterator< ArcMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + + ArcMapFstImpl(const Fst &fst, const C &mapper, + const ArcMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(new C(mapper)), + own_mapper_(true), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ArcMapFstImpl(const Fst &fst, C *mapper, + const ArcMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(mapper), + own_mapper_(false), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ArcMapFstImpl(const ArcMapFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + mapper_(new C(*impl.mapper_)), + own_mapper_(true), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ~ArcMapFstImpl() { + delete fst_; + if (own_mapper_) delete mapper_; + } + + StateId Start() { + if (!HasStart()) + SetStart(FindOState(fst_->Start())); + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + switch (final_action_) { + case MAP_NO_SUPERFINAL: + default: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMapFst: non-zero arc labels for superfinal arc"; + SetProperties(kError, kError); + } + SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + if (s == superfinal_) { + SetFinal(s, Weight::One()); + } else { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel == 0 && final_arc.olabel == 0) + SetFinal(s, final_arc.weight); + else + SetFinal(s, Weight::Zero()); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + SetFinal(s, s == superfinal_ ? Weight::One() : Weight::Zero()); + break; + } + } + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (fst_->Properties(kError, false) || + (mapper_->Properties(0) & kError))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + // Add exiting arcs. + if (s == superfinal_) { SetArcs(s); return; } + + for (ArcIterator< Fst > aiter(*fst_, FindIState(s)); + !aiter.Done(); aiter.Next()) { + A aarc(aiter.Value()); + aarc.nextstate = FindOState(aarc.nextstate); + const B& barc = (*mapper_)(aarc); + PushArc(s, barc); + } + + // Check for superfinal arcs. + if (!HasFinal(s) || Final(s) == Weight::Zero()) + switch (final_action_) { + case MAP_NO_SUPERFINAL: + default: + break; + case MAP_ALLOW_SUPERFINAL: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + if (superfinal_ == kNoStateId) + superfinal_ = nstates_++; + final_arc.nextstate = superfinal_; + PushArc(s, final_arc); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != B::Weight::Zero()) + PushArc(s, B(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal_)); + break; + } + } + SetArcs(s); + } + + private: + void Init() { + SetType("map"); + + if (mapper_->InputSymbolsAction() == MAP_COPY_SYMBOLS) + SetInputSymbols(fst_->InputSymbols()); + else if (mapper_->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetInputSymbols(0); + + if (mapper_->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + SetOutputSymbols(fst_->OutputSymbols()); + else if (mapper_->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetOutputSymbols(0); + + if (fst_->Start() == kNoStateId) { + final_action_ = MAP_NO_SUPERFINAL; + SetProperties(kNullProperties); + } else { + final_action_ = mapper_->FinalAction(); + uint64 props = fst_->Properties(kCopyProperties, false); + SetProperties(mapper_->Properties(props)); + if (final_action_ == MAP_REQUIRE_SUPERFINAL) + superfinal_ = 0; + } + } + + // Maps from output state to input state. + StateId FindIState(StateId s) { + if (superfinal_ == kNoStateId || s < superfinal_) + return s; + else + return s - 1; + } + + // Maps from input state to output state. + StateId FindOState(StateId is) { + StateId os; + if (superfinal_ == kNoStateId || is < superfinal_) + os = is; + else + os = is + 1; + + if (os >= nstates_) + nstates_ = os + 1; + + return os; + } + + + const Fst *fst_; + C* mapper_; + bool own_mapper_; + MapFinalAction final_action_; + + StateId superfinal_; + StateId nstates_; + + void operator=(const ArcMapFstImpl &); // disallow +}; + + +// Maps an arc type A to an arc type B using Mapper function object +// C. This version is a delayed Fst. +template +class ArcMapFst : public ImplToFst< ArcMapFstImpl > { + public: + friend class ArcIterator< ArcMapFst >; + friend class StateIterator< ArcMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + typedef CacheState State; + typedef ArcMapFstImpl Impl; + + ArcMapFst(const Fst &fst, const C &mapper, const ArcMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + ArcMapFst(const Fst &fst, C* mapper, const ArcMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + ArcMapFst(const Fst &fst, const C &mapper) + : ImplToFst(new Impl(fst, mapper, ArcMapFstOptions())) {} + + ArcMapFst(const Fst &fst, C* mapper) + : ImplToFst(new Impl(fst, mapper, ArcMapFstOptions())) {} + + // See Fst<>::Copy() for doc. + ArcMapFst(const ArcMapFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ArcMapFst. See Fst<>::Copy() for further doc. + virtual ArcMapFst *Copy(bool safe = false) const { + return new ArcMapFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ArcMapFst &fst); // disallow +}; + + +// Specialization for ArcMapFst. +template +class StateIterator< ArcMapFst > : public StateIteratorBase { + public: + typedef typename B::StateId StateId; + + explicit StateIterator(const ArcMapFst &fst) + : impl_(fst.GetImpl()), siter_(*impl_->fst_), s_(0), + superfinal_(impl_->final_action_ == MAP_REQUIRE_SUPERFINAL) + { CheckSuperfinal(); } + + bool Done() const { return siter_.Done() && !superfinal_; } + + StateId Value() const { return s_; } + + void Next() { + ++s_; + if (!siter_.Done()) { + siter_.Next(); + CheckSuperfinal(); + } + else if (superfinal_) + superfinal_ = false; + } + + void Reset() { + s_ = 0; + siter_.Reset(); + superfinal_ = impl_->final_action_ == MAP_REQUIRE_SUPERFINAL; + CheckSuperfinal(); + } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + bool Done_() const { return Done(); } + StateId Value_() const { return Value(); } + void Next_() { Next(); } + void Reset_() { Reset(); } + + void CheckSuperfinal() { + if (impl_->final_action_ != MAP_ALLOW_SUPERFINAL || superfinal_) + return; + if (!siter_.Done()) { + B final_arc = (*impl_->mapper_)(A(0, 0, impl_->fst_->Final(s_), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) + superfinal_ = true; + } + } + + const ArcMapFstImpl *impl_; + StateIterator< Fst > siter_; + StateId s_; + bool superfinal_; // true if there is a superfinal state and not done + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ArcMapFst. +template +class ArcIterator< ArcMapFst > + : public CacheArcIterator< ArcMapFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ArcMapFst &fst, StateId s) + : CacheArcIterator< ArcMapFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void ArcMapFst::InitStateIterator(StateIteratorData *data) + const { + data->base = new StateIterator< ArcMapFst >(*this); +} + + +// +// Utility Mappers +// + +// Mapper that returns its input. +template +struct IdentityArcMapper { + typedef A FromArc; + typedef A ToArc; + + A operator()(const A &arc) const { return arc; } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } +}; + + +// Mapper that returns its input with final states redirected to +// a single super-final state. +template +struct SuperFinalMapper { + typedef A FromArc; + typedef A ToArc; + + A operator()(const A &arc) const { return arc; } + + MapFinalAction FinalAction() const { return MAP_REQUIRE_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kAddSuperFinalProperties; + } +}; + + +// Mapper that leaves labels and nextstate unchanged and constructs a new weight +// from the underlying value of the arc weight. Requires that there is a +// WeightConvert class specialization that converts the weights. +template +class WeightConvertMapper { + public: + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + ToArc operator()(const FromArc &arc) const { + return ToArc(arc.ilabel, arc.olabel, + convert_weight_(arc.weight), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } + + private: + WeightConvert convert_weight_; +}; + +// Non-precision-changing weight conversions. +// Consider using more efficient Cast (fst.h) instead. +typedef WeightConvertMapper StdToLogMapper; +typedef WeightConvertMapper LogToStdMapper; + +// Precision-changing weight conversions. +typedef WeightConvertMapper StdToLog64Mapper; +typedef WeightConvertMapper LogToLog64Mapper; +typedef WeightConvertMapper Log64ToStdMapper; +typedef WeightConvertMapper Log64ToLogMapper; + +// Mapper from A to GallicArc. +template +struct ToGallicMapper { + typedef A FromArc; + typedef GallicArc ToArc; + + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + ToArc operator()(const A &arc) const { + // 'Super-final' arc. + if (arc.nextstate == kNoStateId && arc.weight != AW::Zero()) + return ToArc(0, 0, GW(SW::One(), arc.weight), kNoStateId); + // 'Super-non-final' arc. + else if (arc.nextstate == kNoStateId) + return ToArc(0, 0, GW(SW::Zero(), arc.weight), kNoStateId); + // Epsilon label. + else if (arc.olabel == 0) + return ToArc(arc.ilabel, arc.ilabel, + GW(SW::One(), arc.weight), arc.nextstate); + // Regular label. + else + return ToArc(arc.ilabel, arc.ilabel, + GW(SW(arc.olabel), arc.weight), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return ProjectProperties(props, true) & kWeightInvariantProperties; + } +}; + + +// Mapper from GallicArc to A. +template +struct FromGallicMapper { + typedef GallicArc FromArc; + typedef A ToArc; + + typedef typename A::Label Label; + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + FromGallicMapper(Label superfinal_label = 0) + : superfinal_label_(superfinal_label), error_(false) {} + + A operator()(const FromArc &arc) const { + // 'Super-non-final' arc. + if (arc.nextstate == kNoStateId && arc.weight == GW::Zero()) + return A(arc.ilabel, 0, AW::Zero(), kNoStateId); + + SW w1 = arc.weight.Value1(); + AW w2 = arc.weight.Value2(); + StringWeightIterator iter1(w1); + + Label l = w1.Size() == 1 ? iter1.Value() : 0; + + if (l == kStringInfinity || l == kStringBad || + arc.ilabel != arc.olabel || w1.Size() > 1) { + FSTERROR() << "FromGallicMapper: unrepesentable weight"; + error_ = true; + } + + if (arc.ilabel == 0 && l != 0 && arc.nextstate == kNoStateId) + return A(superfinal_label_, l, w2, arc.nextstate); + else + return A(arc.ilabel, l, w2, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 inprops) const { + uint64 outprops = inprops & kOLabelInvariantProperties & + kWeightInvariantProperties & kAddSuperFinalProperties; + if (error_) + outprops |= kError; + return outprops; + } + + private: + Label superfinal_label_; + mutable bool error_; +}; + + +// Mapper from GallicArc to A. +template +struct GallicToNewSymbolsMapper { + typedef GallicArc FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + GallicToNewSymbolsMapper(MutableFst *fst) + : fst_(fst), lmax_(0), osymbols_(fst->OutputSymbols()), + isymbols_(0), error_(false) { + fst_->DeleteStates(); + state_ = fst_->AddState(); + fst_->SetStart(state_); + fst_->SetFinal(state_, AW::One()); + if (osymbols_) { + string name = osymbols_->Name() + "_from_gallic"; + fst_->SetInputSymbols(new SymbolTable(name)); + isymbols_ = fst_->MutableInputSymbols(); + isymbols_->AddSymbol(osymbols_->Find((int64) 0), 0); + } else { + fst_->SetInputSymbols(0); + } + } + + A operator()(const FromArc &arc) { + // 'Super-non-final' arc. + if (arc.nextstate == kNoStateId && arc.weight == GW::Zero()) + return A(arc.ilabel, 0, AW::Zero(), kNoStateId); + + SW w1 = arc.weight.Value1(); + AW w2 = arc.weight.Value2(); + Label l; + + if (w1.Size() == 0) { + l = 0; + } else { + typename Map::iterator miter = map_.find(w1); + if (miter != map_.end()) { + l = (*miter).second; + } else { + l = ++lmax_; + map_.insert(pair(w1, l)); + StringWeightIterator iter1(w1); + StateId n; + string s; + for(size_t i = 0, p = state_; + i < w1.Size(); + ++i, iter1.Next(), p = n) { + n = i == w1.Size() - 1 ? state_ : fst_->AddState(); + fst_->AddArc(p, ToArc(i ? 0 : l, iter1.Value(), AW::One(), n)); + if (isymbols_) { + if (i) s = s + "_"; + s = s + osymbols_->Find(iter1.Value()); + } + } + if (isymbols_) + isymbols_->AddSymbol(s, l); + } + } + + if (l == kStringInfinity || l == kStringBad || arc.ilabel != arc.olabel) { + FSTERROR() << "GallicToNewSymbolMapper: unrepesentable weight"; + error_ = true; + } + + return A(arc.ilabel, l, w2, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS; } + + uint64 Properties(uint64 inprops) const { + uint64 outprops = inprops & kOLabelInvariantProperties & + kWeightInvariantProperties & kAddSuperFinalProperties; + if (error_) + outprops |= kError; + return outprops; + } + + private: + class StringKey { + public: + size_t operator()(const SW &x) const { + return x.Hash(); + } + }; + + typedef unordered_map Map; + + MutableFst *fst_; + Map map_; + Label lmax_; + StateId state_; + const SymbolTable *osymbols_; + SymbolTable *isymbols_; + mutable bool error_; + + DISALLOW_COPY_AND_ASSIGN(GallicToNewSymbolsMapper); +}; + + +// Mapper to add a constant to all weights. +template +struct PlusMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + explicit PlusMapper(Weight w) : weight_(w) {} + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Plus(arc.weight, weight_); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + + + + Weight weight_; +}; + + +// Mapper to (right) multiply a constant to all weights. +template +struct TimesMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + explicit TimesMapper(Weight w) : weight_(w) {} + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Times(arc.weight, weight_); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + Weight weight_; +}; + + +// Mapper to reciprocate all non-Zero() weights. +template +struct InvertWeightMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Divide(Weight::One(), arc.weight); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } +}; + + +// Mapper to map all non-Zero() weights to One(). +template +struct RmWeightMapper { + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + B operator()(const A &arc) const { + ToWeight w = arc.weight != FromWeight::Zero() ? + ToWeight::One() : ToWeight::Zero(); + return B(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return (props & kWeightInvariantProperties) | kUnweighted; + } +}; + + +// Mapper to quantize all weights. +template +struct QuantizeMapper { + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + QuantizeMapper() : delta_(kDelta) {} + + explicit QuantizeMapper(float d) : delta_(d) {} + + B operator()(const A &arc) const { + ToWeight w = arc.weight.Quantize(delta_); + return B(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + float delta_; +}; + + +// Mapper from A to B under the assumption: +// B::Weight = A::Weight::ReverseWeight +// B::Label == A::Label +// B::StateId == A::StateId +// The weight is reversed, while the label and nextstate preserved +// in the mapping. +template +struct ReverseWeightMapper { + typedef A FromArc; + typedef B ToArc; + + B operator()(const A &arc) const { + return B(arc.ilabel, arc.olabel, arc.weight.Reverse(), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } +}; + +} // namespace fst + +#endif // FST_LIB_ARC_MAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/arc-map.h.bak b/extlibs/openfstwin-1.3.1/include/fst/arc-map.h.bak new file mode 100755 index 00000000000..914f81c2831 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/arc-map.h.bak @@ -0,0 +1,1146 @@ +// arc-map.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to map over/transform arcs e.g., change semirings or +// implement project/invert. Consider using when operation does +// not change the number of arcs (except possibly superfinal arcs). + +#ifndef FST_LIB_ARC_MAP_H__ +#define FST_LIB_ARC_MAP_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; + +#include +#include + + +namespace fst { + +// This determines how final weights are mapped. +enum MapFinalAction { + // A final weight is mapped into a final weight. An error + // is raised if this is not possible. + MAP_NO_SUPERFINAL, + + // A final weight is mapped to an arc to the superfinal state + // when the result cannot be represented as a final weight. + // The superfinal state will be added only if it is needed. + MAP_ALLOW_SUPERFINAL, + + // A final weight is mapped to an arc to the superfinal state + // unless the result can be represented as a final weight of weight + // Zero(). The superfinal state is always added (if the input is + // not the empty Fst). + MAP_REQUIRE_SUPERFINAL +}; + +// This determines how symbol tables are mapped. +enum MapSymbolsAction { + // Symbols should be cleared in the result by the map. + MAP_CLEAR_SYMBOLS, + + // Symbols should be copied from the input FST by the map. + MAP_COPY_SYMBOLS, + + // Symbols should not be modified in the result by the map itself. + // (They may set by the mapper). + MAP_NOOP_SYMBOLS +}; + +// ArcMapper Interface - class determinies how arcs and final weights +// are mapped. Useful for implementing operations that do not change +// the number of arcs (expect possibly superfinal arcs). +// +// class ArcMapper { +// public: +// typedef A FromArc; +// typedef B ToArc; +// +// // Maps an arc type A to arc type B. +// B operator()(const A &arc); +// // Specifies final action the mapper requires (see above). +// // The mapper will be passed final weights as arcs of the +// // form A(0, 0, weight, kNoStateId). +// MapFinalAction FinalAction() const; +// // Specifies input symbol table action the mapper requires (see above). +// MapSymbolsAction InputSymbolsAction() const; +// // Specifies output symbol table action the mapper requires (see above). +// MapSymbolsAction OutputSymbolsAction() const; +// // This specifies the known properties of an Fst mapped by this +// // mapper. It takes as argument the input Fst's known properties. +// uint64 Properties(uint64 props) const; +// }; +// +// The ArcMap functions and classes below will use the FinalAction() +// method of the mapper to determine how to treat final weights, +// e.g. whether to add a superfinal state. They will use the Properties() +// method to set the result Fst properties. +// +// We include a various map versions below. One dimension of +// variation is whether the mapping mutates its input, writes to a +// new result Fst, or is an on-the-fly Fst. Another dimension is how +// we pass the mapper. We allow passing the mapper by pointer +// for cases that we need to change the state of the user's mapper. +// This is the case with the encode mapper, which is reused during +// decoding. We also include map versions that pass the mapper +// by value or const reference when this suffices. + + +// Maps an arc type A using a mapper function object C, passed +// by pointer. This version modifies its Fst input. +template +void ArcMap(MutableFst *fst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetOutputSymbols(0); + + if (fst->Start() == kNoStateId) + return; + + uint64 props = fst->Properties(kFstProperties, false); + + MapFinalAction final_action = mapper->FinalAction(); + StateId superfinal = kNoStateId; + if (final_action == MAP_REQUIRE_SUPERFINAL) { + superfinal = fst->AddState(); + fst->SetFinal(superfinal, Weight::One()); + } + + for (StateId s = 0; s < fst->NumStates(); ++s) { + for (MutableArcIterator< MutableFst > aiter(fst, s); + !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + aiter.SetValue((*mapper)(arc)); + } + + switch (final_action) { + case MAP_NO_SUPERFINAL: + default: { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMap: non-zero arc labels for superfinal arc"; + fst->SetProperties(kError, kError); + } + + fst->SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + if (s != superfinal) { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + // Add a superfinal state if not already done. + if (superfinal == kNoStateId) { + superfinal = fst->AddState(); + fst->SetFinal(superfinal, Weight::One()); + } + final_arc.nextstate = superfinal; + fst->AddArc(s, final_arc); + fst->SetFinal(s, Weight::Zero()); + } else { + fst->SetFinal(s, final_arc.weight); + } + break; + } + } + case MAP_REQUIRE_SUPERFINAL: { + if (s != superfinal) { + A final_arc = (*mapper)(A(0, 0, fst->Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != Weight::Zero()) + fst->AddArc(s, A(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal)); + fst->SetFinal(s, Weight::Zero()); + } + break; + } + } + } + fst->SetProperties(mapper->Properties(props), kFstProperties); +} + + +// Maps an arc type A using a mapper function object C, passed +// by value. This version modifies its Fst input. +template +void ArcMap(MutableFst *fst, C mapper) { + ArcMap(fst, &mapper); +} + + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by pointer. This version writes the mapped +// input Fst to an output MutableFst. +template +void ArcMap(const Fst &ifst, MutableFst *ofst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + ofst->DeleteStates(); + + if (mapper->InputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetInputSymbols(ifst.InputSymbols()); + else if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetOutputSymbols(ifst.OutputSymbols()); + else if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetOutputSymbols(0); + + uint64 iprops = ifst.Properties(kCopyProperties, false); + + if (ifst.Start() == kNoStateId) { + if (iprops & kError) ofst->SetProperties(kError, kError); + return; + } + + MapFinalAction final_action = mapper->FinalAction(); + if (ifst.Properties(kExpanded, false)) { + ofst->ReserveStates(CountStates(ifst) + + final_action == MAP_NO_SUPERFINAL ? 0 : 1); + } + + // Add all states. + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) + ofst->AddState(); + + StateId superfinal = kNoStateId; + if (final_action == MAP_REQUIRE_SUPERFINAL) { + superfinal = ofst->AddState(); + ofst->SetFinal(superfinal, B::Weight::One()); + } + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (s == ifst.Start()) + ofst->SetStart(s); + + ofst->ReserveArcs(s, ifst.NumArcs(s)); + for (ArcIterator< Fst > aiter(ifst, s); !aiter.Done(); aiter.Next()) + ofst->AddArc(s, (*mapper)(aiter.Value())); + + switch (final_action) { + case MAP_NO_SUPERFINAL: + default: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMap: non-zero arc labels for superfinal arc"; + ofst->SetProperties(kError, kError); + } + ofst->SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + // Add a superfinal state if not already done. + if (superfinal == kNoStateId) { + superfinal = ofst->AddState(); + ofst->SetFinal(superfinal, B::Weight::One()); + } + final_arc.nextstate = superfinal; + ofst->AddArc(s, final_arc); + ofst->SetFinal(s, B::Weight::Zero()); + } else { + ofst->SetFinal(s, final_arc.weight); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + B final_arc = (*mapper)(A(0, 0, ifst.Final(s), kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != B::Weight::Zero()) + ofst->AddArc(s, B(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal)); + ofst->SetFinal(s, B::Weight::Zero()); + break; + } + } + } + uint64 oprops = ofst->Properties(kFstProperties, false); + ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties); +} + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by value. This version writes the mapped input +// Fst to an output MutableFst. +template +void ArcMap(const Fst &ifst, MutableFst *ofst, C mapper) { + ArcMap(ifst, ofst, &mapper); +} + + +struct ArcMapFstOptions : public CacheOptions { + // ArcMapFst default caching behaviour is to do no caching. Most + // mappers are cheap and therefore we save memory by not doing + // caching. + ArcMapFstOptions() : CacheOptions(true, 0) {} + ArcMapFstOptions(const CacheOptions& opts) : CacheOptions(opts) {} +}; + + +template class ArcMapFst; + +// Implementation of delayed ArcMapFst. +template +class ArcMapFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using VectorFstBaseImpl::State>::NumStates; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + friend class StateIterator< ArcMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + + ArcMapFstImpl(const Fst &fst, const C &mapper, + const ArcMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(new C(mapper)), + own_mapper_(true), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ArcMapFstImpl(const Fst &fst, C *mapper, + const ArcMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(mapper), + own_mapper_(false), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ArcMapFstImpl(const ArcMapFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + mapper_(new C(*impl.mapper_)), + own_mapper_(true), + superfinal_(kNoStateId), + nstates_(0) { + Init(); + } + + ~ArcMapFstImpl() { + delete fst_; + if (own_mapper_) delete mapper_; + } + + StateId Start() { + if (!HasStart()) + SetStart(FindOState(fst_->Start())); + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + switch (final_action_) { + case MAP_NO_SUPERFINAL: + default: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + FSTERROR() << "ArcMapFst: non-zero arc labels for superfinal arc"; + SetProperties(kError, kError); + } + SetFinal(s, final_arc.weight); + break; + } + case MAP_ALLOW_SUPERFINAL: { + if (s == superfinal_) { + SetFinal(s, Weight::One()); + } else { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel == 0 && final_arc.olabel == 0) + SetFinal(s, final_arc.weight); + else + SetFinal(s, Weight::Zero()); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + SetFinal(s, s == superfinal_ ? Weight::One() : Weight::Zero()); + break; + } + } + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (fst_->Properties(kError, false) || + (mapper_->Properties(0) & kError))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + // Add exiting arcs. + if (s == superfinal_) { SetArcs(s); return; } + + for (ArcIterator< Fst > aiter(*fst_, FindIState(s)); + !aiter.Done(); aiter.Next()) { + A aarc(aiter.Value()); + aarc.nextstate = FindOState(aarc.nextstate); + const B& barc = (*mapper_)(aarc); + PushArc(s, barc); + } + + // Check for superfinal arcs. + if (!HasFinal(s) || Final(s) == Weight::Zero()) + switch (final_action_) { + case MAP_NO_SUPERFINAL: + default: + break; + case MAP_ALLOW_SUPERFINAL: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) { + if (superfinal_ == kNoStateId) + superfinal_ = nstates_++; + final_arc.nextstate = superfinal_; + PushArc(s, final_arc); + } + break; + } + case MAP_REQUIRE_SUPERFINAL: { + B final_arc = (*mapper_)(A(0, 0, fst_->Final(FindIState(s)), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0 || + final_arc.weight != B::Weight::Zero()) + PushArc(s, B(final_arc.ilabel, final_arc.olabel, + final_arc.weight, superfinal_)); + break; + } + } + SetArcs(s); + } + + private: + void Init() { + SetType("map"); + + if (mapper_->InputSymbolsAction() == MAP_COPY_SYMBOLS) + SetInputSymbols(fst_->InputSymbols()); + else if (mapper_->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetInputSymbols(0); + + if (mapper_->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + SetOutputSymbols(fst_->OutputSymbols()); + else if (mapper_->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetOutputSymbols(0); + + if (fst_->Start() == kNoStateId) { + final_action_ = MAP_NO_SUPERFINAL; + SetProperties(kNullProperties); + } else { + final_action_ = mapper_->FinalAction(); + uint64 props = fst_->Properties(kCopyProperties, false); + SetProperties(mapper_->Properties(props)); + if (final_action_ == MAP_REQUIRE_SUPERFINAL) + superfinal_ = 0; + } + } + + // Maps from output state to input state. + StateId FindIState(StateId s) { + if (superfinal_ == kNoStateId || s < superfinal_) + return s; + else + return s - 1; + } + + // Maps from input state to output state. + StateId FindOState(StateId is) { + StateId os; + if (superfinal_ == kNoStateId || is < superfinal_) + os = is; + else + os = is + 1; + + if (os >= nstates_) + nstates_ = os + 1; + + return os; + } + + + const Fst *fst_; + C* mapper_; + bool own_mapper_; + MapFinalAction final_action_; + + StateId superfinal_; + StateId nstates_; + + void operator=(const ArcMapFstImpl &); // disallow +}; + + +// Maps an arc type A to an arc type B using Mapper function object +// C. This version is a delayed Fst. +template +class ArcMapFst : public ImplToFst< ArcMapFstImpl > { + public: + friend class ArcIterator< ArcMapFst >; + friend class StateIterator< ArcMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + typedef CacheState State; + typedef ArcMapFstImpl Impl; + + ArcMapFst(const Fst &fst, const C &mapper, const ArcMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + ArcMapFst(const Fst &fst, C* mapper, const ArcMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + ArcMapFst(const Fst &fst, const C &mapper) + : ImplToFst(new Impl(fst, mapper, ArcMapFstOptions())) {} + + ArcMapFst(const Fst &fst, C* mapper) + : ImplToFst(new Impl(fst, mapper, ArcMapFstOptions())) {} + + // See Fst<>::Copy() for doc. + ArcMapFst(const ArcMapFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ArcMapFst. See Fst<>::Copy() for further doc. + virtual ArcMapFst *Copy(bool safe = false) const { + return new ArcMapFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ArcMapFst &fst); // disallow +}; + + +// Specialization for ArcMapFst. +template +class StateIterator< ArcMapFst > : public StateIteratorBase { + public: + typedef typename B::StateId StateId; + + explicit StateIterator(const ArcMapFst &fst) + : impl_(fst.GetImpl()), siter_(*impl_->fst_), s_(0), + superfinal_(impl_->final_action_ == MAP_REQUIRE_SUPERFINAL) + { CheckSuperfinal(); } + + bool Done() const { return siter_.Done() && !superfinal_; } + + StateId Value() const { return s_; } + + void Next() { + ++s_; + if (!siter_.Done()) { + siter_.Next(); + CheckSuperfinal(); + } + else if (superfinal_) + superfinal_ = false; + } + + void Reset() { + s_ = 0; + siter_.Reset(); + superfinal_ = impl_->final_action_ == MAP_REQUIRE_SUPERFINAL; + CheckSuperfinal(); + } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + bool Done_() const { return Done(); } + StateId Value_() const { return Value(); } + void Next_() { Next(); } + void Reset_() { Reset(); } + + void CheckSuperfinal() { + if (impl_->final_action_ != MAP_ALLOW_SUPERFINAL || superfinal_) + return; + if (!siter_.Done()) { + B final_arc = (*impl_->mapper_)(A(0, 0, impl_->fst_->Final(s_), + kNoStateId)); + if (final_arc.ilabel != 0 || final_arc.olabel != 0) + superfinal_ = true; + } + } + + const ArcMapFstImpl *impl_; + StateIterator< Fst > siter_; + StateId s_; + bool superfinal_; // true if there is a superfinal state and not done + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ArcMapFst. +template +class ArcIterator< ArcMapFst > + : public CacheArcIterator< ArcMapFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ArcMapFst &fst, StateId s) + : CacheArcIterator< ArcMapFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void ArcMapFst::InitStateIterator(StateIteratorData *data) + const { + data->base = new StateIterator< ArcMapFst >(*this); +} + + +// +// Utility Mappers +// + +// Mapper that returns its input. +template +struct IdentityArcMapper { + typedef A FromArc; + typedef A ToArc; + + A operator()(const A &arc) const { return arc; } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } +}; + + +// Mapper that returns its input with final states redirected to +// a single super-final state. +template +struct SuperFinalMapper { + typedef A FromArc; + typedef A ToArc; + + A operator()(const A &arc) const { return arc; } + + MapFinalAction FinalAction() const { return MAP_REQUIRE_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kAddSuperFinalProperties; + } +}; + + +// Mapper that leaves labels and nextstate unchanged and constructs a new weight +// from the underlying value of the arc weight. Requires that there is a +// WeightConvert class specialization that converts the weights. +template +class WeightConvertMapper { + public: + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + ToArc operator()(const FromArc &arc) const { + return ToArc(arc.ilabel, arc.olabel, + convert_weight_(arc.weight), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } + + private: + WeightConvert convert_weight_; +}; + +// Non-precision-changing weight conversions. +// Consider using more efficient Cast (fst.h) instead. +typedef WeightConvertMapper StdToLogMapper; +typedef WeightConvertMapper LogToStdMapper; + +// Precision-changing weight conversions. +typedef WeightConvertMapper StdToLog64Mapper; +typedef WeightConvertMapper LogToLog64Mapper; +typedef WeightConvertMapper Log64ToStdMapper; +typedef WeightConvertMapper Log64ToLogMapper; + +// Mapper from A to GallicArc. +template +struct ToGallicMapper { + typedef A FromArc; + typedef GallicArc ToArc; + + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + ToArc operator()(const A &arc) const { + // 'Super-final' arc. + if (arc.nextstate == kNoStateId && arc.weight != AW::Zero()) + return ToArc(0, 0, GW(SW::One(), arc.weight), kNoStateId); + // 'Super-non-final' arc. + else if (arc.nextstate == kNoStateId) + return ToArc(0, 0, GW(SW::Zero(), arc.weight), kNoStateId); + // Epsilon label. + else if (arc.olabel == 0) + return ToArc(arc.ilabel, arc.ilabel, + GW(SW::One(), arc.weight), arc.nextstate); + // Regular label. + else + return ToArc(arc.ilabel, arc.ilabel, + GW(SW(arc.olabel), arc.weight), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return ProjectProperties(props, true) & kWeightInvariantProperties; + } +}; + + +// Mapper from GallicArc to A. +template +struct FromGallicMapper { + typedef GallicArc FromArc; + typedef A ToArc; + + typedef typename A::Label Label; + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + FromGallicMapper(Label superfinal_label = 0) + : superfinal_label_(superfinal_label), error_(false) {} + + A operator()(const FromArc &arc) const { + // 'Super-non-final' arc. + if (arc.nextstate == kNoStateId && arc.weight == GW::Zero()) + return A(arc.ilabel, 0, AW::Zero(), kNoStateId); + + SW w1 = arc.weight.Value1(); + AW w2 = arc.weight.Value2(); + StringWeightIterator iter1(w1); + + Label l = w1.Size() == 1 ? iter1.Value() : 0; + + if (l == kStringInfinity || l == kStringBad || + arc.ilabel != arc.olabel || w1.Size() > 1) { + FSTERROR() << "FromGallicMapper: unrepesentable weight"; + error_ = true; + } + + if (arc.ilabel == 0 && l != 0 && arc.nextstate == kNoStateId) + return A(superfinal_label_, l, w2, arc.nextstate); + else + return A(arc.ilabel, l, w2, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 inprops) const { + uint64 outprops = inprops & kOLabelInvariantProperties & + kWeightInvariantProperties & kAddSuperFinalProperties; + if (error_) + outprops |= kError; + return outprops; + } + + private: + Label superfinal_label_; + mutable bool error_; +}; + + +// Mapper from GallicArc to A. +template +struct GallicToNewSymbolsMapper { + typedef GallicArc FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef StringWeight SW; + typedef typename A::Weight AW; + typedef typename GallicArc::Weight GW; + + GallicToNewSymbolsMapper(MutableFst *fst) + : fst_(fst), lmax_(0), osymbols_(fst->OutputSymbols()), + isymbols_(0), error_(false) { + fst_->DeleteStates(); + state_ = fst_->AddState(); + fst_->SetStart(state_); + fst_->SetFinal(state_, AW::One()); + if (osymbols_) { + string name = osymbols_->Name() + "_from_gallic"; + fst_->SetInputSymbols(new SymbolTable(name)); + isymbols_ = fst_->MutableInputSymbols(); + isymbols_->AddSymbol(osymbols_->Find((int64) 0), 0); + } else { + fst_->SetInputSymbols(0); + } + } + + A operator()(const FromArc &arc) { + // 'Super-non-final' arc. + if (arc.nextstate == kNoStateId && arc.weight == GW::Zero()) + return A(arc.ilabel, 0, AW::Zero(), kNoStateId); + + SW w1 = arc.weight.Value1(); + AW w2 = arc.weight.Value2(); + Label l; + + if (w1.Size() == 0) { + l = 0; + } else { + typename Map::iterator miter = map_.find(w1); + if (miter != map_.end()) { + l = (*miter).second; + } else { + l = ++lmax_; + map_.insert(pair(w1, l)); + StringWeightIterator iter1(w1); + StateId n; + string s; + for(size_t i = 0, p = state_; + i < w1.Size(); + ++i, iter1.Next(), p = n) { + n = i == w1.Size() - 1 ? state_ : fst_->AddState(); + fst_->AddArc(p, ToArc(i ? 0 : l, iter1.Value(), AW::One(), n)); + if (isymbols_) { + if (i) s = s + "_"; + s = s + osymbols_->Find(iter1.Value()); + } + } + if (isymbols_) + isymbols_->AddSymbol(s, l); + } + } + + if (l == kStringInfinity || l == kStringBad || arc.ilabel != arc.olabel) { + FSTERROR() << "GallicToNewSymbolMapper: unrepesentable weight"; + error_ = true; + } + + return A(arc.ilabel, l, w2, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_ALLOW_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS; } + + uint64 Properties(uint64 inprops) const { + uint64 outprops = inprops & kOLabelInvariantProperties & + kWeightInvariantProperties & kAddSuperFinalProperties; + if (error_) + outprops |= kError; + return outprops; + } + + private: + class StringKey { + public: + size_t operator()(const SW &x) const { + return x.Hash(); + } + }; + + typedef unordered_map Map; + + MutableFst *fst_; + Map map_; + Label lmax_; + StateId state_; + const SymbolTable *osymbols_; + SymbolTable *isymbols_; + mutable bool error_; + + DISALLOW_COPY_AND_ASSIGN(GallicToNewSymbolsMapper); +}; + + +// Mapper to add a constant to all weights. +template +struct PlusMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + explicit PlusMapper(Weight w) : weight_(w) {} + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Plus(arc.weight, weight_); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + + + + Weight weight_; +}; + + +// Mapper to (right) multiply a constant to all weights. +template +struct TimesMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + explicit TimesMapper(Weight w) : weight_(w) {} + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Times(arc.weight, weight_); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + Weight weight_; +}; + + +// Mapper to reciprocate all non-Zero() weights. +template +struct InvertWeightMapper { + typedef A FromArc; + typedef A ToArc; + typedef typename A::Weight Weight; + + A operator()(const A &arc) const { + if (arc.weight == Weight::Zero()) + return arc; + Weight w = Divide(Weight::One(), arc.weight); + return A(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } +}; + + +// Mapper to map all non-Zero() weights to One(). +template +struct RmWeightMapper { + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + B operator()(const A &arc) const { + ToWeight w = arc.weight != FromWeight::Zero() ? + ToWeight::One() : ToWeight::Zero(); + return B(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return (props & kWeightInvariantProperties) | kUnweighted; + } +}; + + +// Mapper to quantize all weights. +template +struct QuantizeMapper { + typedef A FromArc; + typedef B ToArc; + typedef typename FromArc::Weight FromWeight; + typedef typename ToArc::Weight ToWeight; + + QuantizeMapper() : delta_(kDelta) {} + + explicit QuantizeMapper(float d) : delta_(d) {} + + B operator()(const A &arc) const { + ToWeight w = arc.weight.Quantize(delta_); + return B(arc.ilabel, arc.olabel, w, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { + return props & kWeightInvariantProperties; + } + + private: + float delta_; +}; + + +// Mapper from A to B under the assumption: +// B::Weight = A::Weight::ReverseWeight +// B::Label == A::Label +// B::StateId == A::StateId +// The weight is reversed, while the label and nextstate preserved +// in the mapping. +template +struct ReverseWeightMapper { + typedef A FromArc; + typedef B ToArc; + + B operator()(const A &arc) const { + return B(arc.ilabel, arc.olabel, arc.weight.Reverse(), arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } +}; + +} // namespace fst + +#endif // FST_LIB_ARC_MAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/arc.h b/extlibs/openfstwin-1.3.1/include/fst/arc.h new file mode 100755 index 00000000000..5f4014b7670 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/arc.h @@ -0,0 +1,307 @@ +// arc.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// +// Commonly used Fst arc types. + +#ifndef FST_LIB_ARC_H__ +#define FST_LIB_ARC_H__ + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace fst { + +template +class ArcTpl { + public: + typedef W Weight; + typedef int Label; + typedef int StateId; + + ArcTpl(Label i, Label o, const Weight& w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + ArcTpl() {} + + static const string &Type(void) { + static const string type = + (Weight::Type() == "tropical") ? "standard" : Weight::Type(); + return type; + } + + Label ilabel; + Label olabel; + Weight weight; + StateId nextstate; +}; + +typedef ArcTpl StdArc; +typedef ArcTpl LogArc; +typedef ArcTpl Log64Arc; +typedef ArcTpl SignedLogArc; +typedef ArcTpl SignedLog64Arc; +typedef ArcTpl MinMaxArc; + + +// Arc with integer labels and state Ids and string weights. +template +class StringArc { + public: + typedef int Label; + typedef StringWeight Weight; + typedef int StateId; + + StringArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + StringArc() {} + + static const string &Type() { // Arc type name + static const string type = + S == STRING_LEFT ? "standard_string" : + (S == STRING_RIGHT ? "right_standard_string" : + (S == STRING_LEFT_RESTRICT ? "restricted_string" : + "right_restricted_string")); + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with label and state Id type the same as template arg and with +// weights over the Gallic semiring w.r.t the output labels and weights of A. +template +struct GallicArc { + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef GallicWeight Weight; + + GallicArc() {} + + GallicArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + GallicArc(const A &arc) + : ilabel(arc.ilabel), olabel(arc.ilabel), + weight(arc.olabel, arc.weight), nextstate(arc.nextstate) {} + + static const string &Type() { // Arc type name + static const string type = + (S == STRING_LEFT ? "gallic_" : + (S == STRING_RIGHT ? "right_gallic_" : + (S == STRING_LEFT_RESTRICT ? "restricted_gallic_" : + "right_restricted_gallic_"))) + A::Type(); + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with the reverse of the weight found in its template arg. +template struct ReverseArc { + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight AWeight; + typedef typename AWeight::ReverseWeight Weight; + typedef typename A::StateId StateId; + + ReverseArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + ReverseArc() {} + + static const string &Type() { // Arc type name + static const string type = "reverse_" + Arc::Type(); + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with integer labels and state Ids and lexicographic weights. +template +struct LexicographicArc { + typedef int Label; + typedef LexicographicWeight Weight; + typedef int StateId; + + LexicographicArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + LexicographicArc() {} + + static const string &Type() { // Arc type name + static const string type = Weight::Type(); + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with integer labels and state Ids and product weights. +template +struct ProductArc { + typedef int Label; + typedef ProductWeight Weight; + typedef int StateId; + + ProductArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + ProductArc() {} + + static const string &Type() { // Arc type name + static const string type = Weight::Type(); + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with label and state Id type the same as first template arg and with +// weights over the n-th cartesian power of the weight type of the +// template arg. +template +struct PowerArc { + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef PowerWeight Weight; + + PowerArc() {} + + PowerArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + static const string &Type() { // Arc type name + static string type; + if (type.empty()) { + string power; + Int64ToStr(n, &power); + type = A::Type() + "_^" + power; + } + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with label and state Id type the same as first template arg and with +// weights over the arbitrary cartesian power of the weight type. +template +struct SparsePowerArc { + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef SparsePowerWeight Weight; + + SparsePowerArc() {} + + SparsePowerArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + static const string &Type() { // Arc type name + static string type; + if (type.empty()) { type = A::Type() + "_^n"; } + if(sizeof(K) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(K), &size); + type += "_" + size; + } + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + + +// Arc with label and state Id type the same as first template arg and with +// expectation weight over the first template arg weight type and the +// second template arg. +template +struct ExpectationArc { + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight X1; + typedef ExpectationWeight Weight; + + ExpectationArc() {} + + ExpectationArc(Label i, Label o, Weight w, StateId s) + : ilabel(i), olabel(o), weight(w), nextstate(s) {} + + static const string &Type() { // Arc type name + static string type; + if (type.empty()) { + type = "expectation_" + A::Type() + "_" + X2::Type(); + } + return type; + } + + Label ilabel; // Transition input label + Label olabel; // Transition output label + Weight weight; // Transition weight + StateId nextstate; // Transition destination state +}; + +} // namespace fst + +#endif // FST_LIB_ARC_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/arcfilter.h b/extlibs/openfstwin-1.3.1/include/fst/arcfilter.h new file mode 100755 index 00000000000..179dc2cea84 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/arcfilter.h @@ -0,0 +1,99 @@ +// arcfilter.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Function objects to restrict which arcs are traversed in an FST. + +#ifndef FST_LIB_ARCFILTER_H__ +#define FST_LIB_ARCFILTER_H__ + + +#include +#include + + +namespace fst { + +// True for all arcs. +template +class AnyArcFilter { +public: + bool operator()(const A &arc) const { return true; } +}; + + +// True for (input/output) epsilon arcs. +template +class EpsilonArcFilter { +public: + bool operator()(const A &arc) const { + return arc.ilabel == 0 && arc.olabel == 0; + } +}; + + +// True for input epsilon arcs. +template +class InputEpsilonArcFilter { +public: + bool operator()(const A &arc) const { + return arc.ilabel == 0; + } +}; + + +// True for output epsilon arcs. +template +class OutputEpsilonArcFilter { +public: + bool operator()(const A &arc) const { + return arc.olabel == 0; + } +}; + + +// True if specified labels match (don't match) when keep_match is +// true (false). +template +class MultiLabelArcFilter { +public: + typedef typename A::Label Label; + + MultiLabelArcFilter(bool match_input = true, bool keep_match = true) + : match_input_(match_input), + keep_match_(keep_match) {} + + + bool operator()(const A &arc) const { + Label label = match_input_ ? arc.ilabel : arc.olabel; + bool match = labels_.Find(label) != labels_.End(); + return keep_match_ ? match : !match; + } + + void AddLabel(Label label) { + labels_.Insert(label); + } + +private: + CompactSet labels_; + bool match_input_; + bool keep_match_; +}; + +} // namespace fst + +#endif // FST_LIB_ARCFILTER_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/arcsort.h b/extlibs/openfstwin-1.3.1/include/fst/arcsort.h new file mode 100755 index 00000000000..38f4f95eb1b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/arcsort.h @@ -0,0 +1,203 @@ +// arcsort.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to sort arcs in an FST. + +#ifndef FST_LIB_ARCSORT_H__ +#define FST_LIB_ARCSORT_H__ + +#include +#include +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +template +class ArcSortMapper { + public: + typedef Arc FromArc; + typedef Arc ToArc; + + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + ArcSortMapper(const Fst &fst, const Compare &comp) + : fst_(fst), comp_(comp), i_(0) {} + + // Allows updating Fst argument; pass only if changed. + ArcSortMapper(const ArcSortMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), comp_(mapper.comp_), i_(0) {} + + StateId Start() { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + i_ = 0; + arcs_.clear(); + arcs_.reserve(fst_.NumArcs(s)); + for (ArcIterator< Fst > aiter(fst_, s); !aiter.Done(); aiter.Next()) + arcs_.push_back(aiter.Value()); + sort(arcs_.begin(), arcs_.end(), comp_); + } + + bool Done() const { return i_ >= arcs_.size(); } + const Arc &Value() const { return arcs_[i_]; } + void Next() { ++i_; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + uint64 Properties(uint64 props) const { return comp_.Properties(props); } + + private: + const Fst &fst_; + const Compare &comp_; + vector arcs_; + ssize_t i_; // current arc position + + void operator=(const ArcSortMapper &); // disallow +}; + + +// Sorts the arcs in an FST according to function object 'comp' of +// type Compare. This version modifies its input. Comparison function +// objects ILabelCompare and OLabelCompare are provived by the +// library. In general, Compare must meet the requirements for an STL +// sort comparision function object. It must also have a member +// Properties(uint64) that specifies the known properties of the +// sorted FST; it takes as argument the input FST's known properties +// before the sort. +// +// Complexity: +// - Time: O(V D log D) +// - Space: O(D) +// where V = # of states and D = maximum out-degree. +template +void ArcSort(MutableFst *fst, Compare comp) { + ArcSortMapper mapper(*fst, comp); + StateMap(fst, mapper); +} + +typedef CacheOptions ArcSortFstOptions; + +// Sorts the arcs in an FST according to function object 'comp' of +// type Compare. This version is a delayed Fst. Comparsion function +// objects ILabelCompare and OLabelCompare are provided by the +// library. In general, Compare must meet the requirements for an STL +// comparision function object (e.g. as used for STL sort). It must +// also have a member Properties(uint64) that specifies the known +// properties of the sorted FST; it takes as argument the input FST's +// known properties. +// +// Complexity: +// - Time: O(v d log d) +// - Space: O(d) +// where v = # of states visited, d = maximum out-degree of states +// visited. Constant time and space to visit an input state is assumed +// and exclusive of caching. +template +class ArcSortFst : public StateMapFst > { + public: + typedef A Arc; + typedef ArcSortMapper M; + + ArcSortFst(const Fst &fst, const C &comp) + : StateMapFst(fst, ArcSortMapper(fst, comp)) {} + + ArcSortFst(const Fst &fst, const C &comp, const ArcSortFstOptions &opts) + : StateMapFst(fst, ArcSortMapper(fst, comp), opts) {} + + // See Fst<>::Copy() for doc. + ArcSortFst(const ArcSortFst &fst, bool safe = false) + : StateMapFst(fst, safe) {} + + // Get a copy of this ArcSortFst. See Fst<>::Copy() for further doc. + virtual ArcSortFst *Copy(bool safe = false) const { + return new ArcSortFst(*this, safe); + } +}; + + +// Specialization for ArcSortFst. +template +class StateIterator< ArcSortFst > + : public StateIterator< StateMapFst > > { + public: + explicit StateIterator(const ArcSortFst &fst) + : StateIterator< StateMapFst > >(fst) {} +}; + + +// Specialization for ArcSortFst. +template +class ArcIterator< ArcSortFst > + : public ArcIterator< StateMapFst > > { + public: + ArcIterator(const ArcSortFst &fst, typename A::StateId s) + : ArcIterator< StateMapFst > >(fst, s) {} +}; + + +// Compare class for comparing input labels of arcs. +template class ILabelCompare { + public: + bool operator() (A arc1, A arc2) const { + return arc1.ilabel < arc2.ilabel; + } + + uint64 Properties(uint64 props) const { + return (props & kArcSortProperties) | kILabelSorted | + (props & kAcceptor ? kOLabelSorted : 0); + } +}; + + +// Compare class for comparing output labels of arcs. +template class OLabelCompare { + public: + bool operator() (const A &arc1, const A &arc2) const { + return arc1.olabel < arc2.olabel; + } + + uint64 Properties(uint64 props) const { + return (props & kArcSortProperties) | kOLabelSorted | + (props & kAcceptor ? kILabelSorted : 0); + } +}; + + +// Useful aliases when using StdArc. +template class StdArcSortFst : public ArcSortFst { + public: + typedef StdArc Arc; + typedef C Compare; +}; + +typedef ILabelCompare StdILabelCompare; + +typedef OLabelCompare StdOLabelCompare; + +} // namespace fst + +#endif // FST_LIB_ARCSORT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/bi-table.h b/extlibs/openfstwin-1.3.1/include/fst/bi-table.h new file mode 100755 index 00000000000..dbb436c99df --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/bi-table.h @@ -0,0 +1,396 @@ +// bi-table.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes for representing a bijective mapping between an arbitrary entry +// of type T and a signed integral ID. + +#ifndef FST_LIB_BI_TABLE_H__ +#define FST_LIB_BI_TABLE_H__ + +#include +#include +using std::vector; + +namespace fst { + +// BI TABLES - these determine a bijective mapping between an +// arbitrary entry of type T and an signed integral ID of type I. The IDs are +// allocated starting from 0 in order. +// +// template +// class BiTable { +// public: +// +// // Required constructors. +// BiTable(); +// +// // Lookup integer ID from entry. If it doesn't exist, then add it. +// I FindId(const T &entry); +// // Lookup entry from integer ID. +// const T &FindEntry(I) const; +// // # of stored entries. +// I Size() const; +// }; + +// An implementation using a hash map for the entry to ID mapping. +// The entry T must have == defined and the default constructor +// must produce an entry that will never be seen. H is the hash function. +template +class HashBiTable { + public: + + HashBiTable() { + T empty_entry; + } + + I FindId(const T &entry) { + I &id_ref = entry2id_[entry]; + if (id_ref == 0) { // T not found; store and assign it a new ID. + id2entry_.push_back(entry); + id_ref = id2entry_.size(); + } + return id_ref - 1; // NB: id_ref = ID + 1 + } + + const T &FindEntry(I s) const { + return id2entry_[s]; + } + + I Size() const { return id2entry_.size(); } + + private: + unordered_map entry2id_; + vector id2entry_; + + DISALLOW_COPY_AND_ASSIGN(HashBiTable); +}; + + +// An implementation using a hash set for the entry to ID +// mapping. The hash set holds 'keys' which are either the ID +// or kCurrentKey. These keys can be mapped to entrys either by +// looking up in the entry vector or, if kCurrentKey, in current_entry_ +// member. The hash and key equality functions map to entries first. +// The entry T must have == defined and the default constructor +// must produce a entry that will never be seen. H is the hash +// function. +template +class CompactHashBiTable { + public: + friend class HashFunc; + friend class HashEqual; + + CompactHashBiTable() + : hash_func_(*this), + hash_equal_(*this), + keys_(0, hash_func_, hash_equal_) { + } + + // Reserves space for table_size elements. + explicit CompactHashBiTable(size_t table_size) + : hash_func_(*this), + hash_equal_(*this), + keys_(table_size, hash_func_, hash_equal_) { + id2entry_.reserve(table_size); + } + + I FindId(const T &entry) { + current_entry_ = &entry; + typename KeyHashSet::const_iterator it = keys_.find(kCurrentKey); + if (it == keys_.end()) { + I key = id2entry_.size(); + id2entry_.push_back(entry); + keys_.insert(key); + return key; + } else { + return *it; + } + } + + const T &FindEntry(I s) const { return id2entry_[s]; } + I Size() const { return id2entry_.size(); } + + private: + static const I kEmptyKey; // -1 + static const I kCurrentKey; // -2 + + class HashFunc { + public: + HashFunc(const CompactHashBiTable &ht) : ht_(&ht) {} + + size_t operator()(I k) const { return hf(ht_->Key2T(k)); } + private: + const CompactHashBiTable *ht_; + H hf; + }; + + class HashEqual { + public: + HashEqual(const CompactHashBiTable &ht) : ht_(&ht) {} + + bool operator()(I k1, I k2) const { + return ht_->Key2T(k1) == ht_->Key2T(k2); + } + private: + const CompactHashBiTable *ht_; + }; + + typedef unordered_set KeyHashSet; + + const T &Key2T(I k) const { + if (k == kEmptyKey) + return empty_entry_; + else if (k == kCurrentKey) + return *current_entry_; + else + return id2entry_[k]; + } + + HashFunc hash_func_; + HashEqual hash_equal_; + KeyHashSet keys_; + vector id2entry_; + const T empty_entry_; + const T *current_entry_; + + DISALLOW_COPY_AND_ASSIGN(CompactHashBiTable); +}; + +template +const I CompactHashBiTable::kEmptyKey = -1; + +template +const I CompactHashBiTable::kCurrentKey = -2; + + +// An implementation using a vector for the entry to ID mapping. +// It is passed a function object FP that should fingerprint entries +// uniquely to an integer that can used as a vector index. Normally, +// VectorBiTable constructs the FP object. The user can instead +// pass in this object; in that case, VectorBiTable takes its +// ownership. +template +class VectorBiTable { + public: + explicit VectorBiTable(FP *fp = 0) : fp_(fp ? fp : new FP()) {} + + ~VectorBiTable() { delete fp_; } + + I FindId(const T &entry) { + ssize_t fp = (*fp_)(entry); + if (fp >= fp2id_.size()) + fp2id_.resize(fp + 1); + I &id_ref = fp2id_[fp]; + if (id_ref == 0) { // T not found; store and assign it a new ID. + id2entry_.push_back(entry); + id_ref = id2entry_.size(); + } + return id_ref - 1; // NB: id_ref = ID + 1 + } + + const T &FindEntry(I s) const { return id2entry_[s]; } + + I Size() const { return id2entry_.size(); } + + const FP &Fingerprint() const { return *fp_; } + + private: + FP *fp_; + vector fp2id_; + vector id2entry_; + + DISALLOW_COPY_AND_ASSIGN(VectorBiTable); +}; + + +// An implementation using a vector and a compact hash table. The +// selecting functor S returns true for entries to be hashed in the +// vector. The fingerprinting functor FP returns a unique fingerprint +// for each entry to be hashed in the vector (these need to be +// suitable for indexing in a vector). The hash functor H is used when +// hashing entry into the compact hash table. +template +class VectorHashBiTable { + public: + friend class HashFunc; + friend class HashEqual; + + VectorHashBiTable(S *s, FP *fp, H *h, + size_t vector_size = 0, + size_t entry_size = 0) + : selector_(s), + fp_(fp), + h_(h), + hash_func_(*this), + hash_equal_(*this), + keys_(0, hash_func_, hash_equal_) { + if (vector_size) + fp2id_.reserve(vector_size); + if (entry_size) + id2entry_.reserve(entry_size); + } + + ~VectorHashBiTable() { + delete selector_; + delete fp_; + delete h_; + } + + I FindId(const T &entry) { + if ((*selector_)(entry)) { // Use the vector if 'selector_(entry) == true' + uint64 fp = (*fp_)(entry); + if (fp2id_.size() <= fp) + fp2id_.resize(fp + 1, 0); + if (fp2id_[fp] == 0) { + id2entry_.push_back(entry); + fp2id_[fp] = id2entry_.size(); + } + return fp2id_[fp] - 1; // NB: assoc_value = ID + 1 + } else { // Use the hash table otherwise. + current_entry_ = &entry; + typename KeyHashSet::const_iterator it = keys_.find(kCurrentKey); + if (it == keys_.end()) { + I key = id2entry_.size(); + id2entry_.push_back(entry); + keys_.insert(key); + return key; + } else { + return *it; + } + } + } + + const T &FindEntry(I s) const { + return id2entry_[s]; + } + + I Size() const { return id2entry_.size(); } + + const S &Selector() const { return *selector_; } + + const FP &Fingerprint() const { return *fp_; } + + const H &Hash() const { return *h_; } + + private: + static const I kEmptyKey; + static const I kCurrentKey; + + class HashFunc { + public: + HashFunc(const VectorHashBiTable &ht) : ht_(&ht) {} + + size_t operator()(I k) const { return (*(ht_->h_))(ht_->Key2Entry(k)); } + private: + const VectorHashBiTable *ht_; + }; + + class HashEqual { + public: + HashEqual(const VectorHashBiTable &ht) : ht_(&ht) {} + + bool operator()(I k1, I k2) const { + return ht_->Key2Entry(k1) == ht_->Key2Entry(k2); + } + private: + const VectorHashBiTable *ht_; + }; + + typedef unordered_set KeyHashSet; + + const T &Key2Entry(I k) const { + if (k == kEmptyKey) + return empty_entry_; + else if (k == kCurrentKey) + return *current_entry_; + else + return id2entry_[k]; + } + + + S *selector_; // Returns true if entry hashed into vector + FP *fp_; // Fingerprint used when hashing entry into vector + H *h_; // Hash function used when hashing entry into hash_set + + vector id2entry_; // Maps state IDs to entry + vector fp2id_; // Maps entry fingerprints to IDs + + // Compact implementation of the hash table mapping entrys to + // state IDs using the hash function 'h_' + HashFunc hash_func_; + HashEqual hash_equal_; + KeyHashSet keys_; + const T empty_entry_; + const T *current_entry_; + + DISALLOW_COPY_AND_ASSIGN(VectorHashBiTable); +}; + +template +const I VectorHashBiTable::kEmptyKey = -1; + +template +const I VectorHashBiTable::kCurrentKey = -2; + + +// An implementation using a hash map for the entry to ID +// mapping. This version permits erasing of s. The entry T +// must have == defined and its default constructor must produce a +// entry that will never be seen. F is the hash function. +template +class ErasableBiTable { + public: + ErasableBiTable() : first_(0) {} + + I FindId(const T &entry) { + I &id_ref = entry2id_[entry]; + if (id_ref == 0) { // T not found; store and assign it a new ID. + id2entry_.push_back(entry); + id_ref = id2entry_.size() + first_; + } + return id_ref - 1; // NB: id_ref = ID + 1 + } + + const T &FindEntry(I s) const { return id2entry_[s - first_]; } + + I Size() const { return id2entry_.size(); } + + void Erase(I s) { + T &entry = id2entry_[s - first_]; + typename unordered_map::iterator it = + entry2id_.find(entry); + entry2id_.erase(it); + id2entry_[s - first_] = empty_entry_; + while (!id2entry_.empty() && id2entry_.front() == empty_entry_) { + id2entry_.pop_front(); + ++first_; + } + } + + private: + unordered_map entry2id_; + deque id2entry_; + const T empty_entry_; + I first_; // I of first element in the deque; + + DISALLOW_COPY_AND_ASSIGN(ErasableBiTable); +}; + +} // namespace fst + +#endif // FST_LIB_BI_TABLE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/cache.h b/extlibs/openfstwin-1.3.1/include/fst/cache.h new file mode 100755 index 00000000000..a6a92d4e273 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/cache.h @@ -0,0 +1,738 @@ +// cache.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// An Fst implementation that caches FST elements of a delayed +// computation. + +#ifndef FST_LIB_CACHE_H__ +#define FST_LIB_CACHE_H__ + +#include +using std::vector; +#include + +#include + + +DECLARE_bool(fst_default_cache_gc); +DECLARE_int64(fst_default_cache_gc_limit); + +namespace fst { + +struct CacheOptions { + bool gc; // enable GC + size_t gc_limit; // # of bytes allowed before GC + + CacheOptions(bool g, size_t l) : gc(g), gc_limit(l) {} + CacheOptions() + : gc(FLAGS_fst_default_cache_gc), + gc_limit(FLAGS_fst_default_cache_gc_limit) {} +}; + +// A CacheStateAllocator allocates and frees CacheStates +// template +// struct CacheStateAllocator { +// S *Allocate(StateId s); +// void Free(S *state, StateId s); +// }; +// + +// A simple allocator class, can be overridden as needed, +// maintains a single entry cache. +template +struct DefaultCacheStateAllocator { + typedef typename S::Arc::StateId StateId; + + DefaultCacheStateAllocator() : mru_(NULL) { } + + ~DefaultCacheStateAllocator() { + delete mru_; + } + + S *Allocate(StateId s) { + if (mru_) { + S *state = mru_; + mru_ = NULL; + state->Reset(); + return state; + } + return new S(); + } + + void Free(S *state, StateId s) { + if (mru_) { + delete mru_; + } + mru_ = state; + } + + private: + S *mru_; +}; + +// VectorState but additionally has a flags data member (see +// CacheState below). This class is used to cache FST elements with +// the flags used to indicate what has been cached. Use HasStart() +// HasFinal(), and HasArcs() to determine if cached and SetStart(), +// SetFinal(), AddArc(), (or PushArc() and SetArcs()) to cache. Note you +// must set the final weight even if the state is non-final to mark it as +// cached. If the 'gc' option is 'false', cached items have the extent +// of the FST - minimizing computation. If the 'gc' option is 'true', +// garbage collection of states (not in use in an arc iterator) is +// performed, in a rough approximation of LRU order, when 'gc_limit' +// bytes is reached - controlling memory use. When 'gc_limit' is 0, +// special optimizations apply - minimizing memory use. + +template > +class CacheBaseImpl : public VectorFstBaseImpl { + public: + typedef S State; + typedef C Allocator; + typedef typename State::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + using FstImpl::Type; + using FstImpl::Properties; + using FstImpl::SetProperties; + using VectorFstBaseImpl::NumStates; + using VectorFstBaseImpl::AddState; + using VectorFstBaseImpl::SetState; + + explicit CacheBaseImpl(C *allocator = 0) + : cache_start_(false), nknown_states_(0), min_unexpanded_state_id_(0), + cache_first_state_id_(kNoStateId), cache_first_state_(0), + cache_gc_(FLAGS_fst_default_cache_gc), cache_size_(0), + cache_limit_(FLAGS_fst_default_cache_gc_limit > kMinCacheLimit || + FLAGS_fst_default_cache_gc_limit == 0 ? + FLAGS_fst_default_cache_gc_limit : kMinCacheLimit) { + allocator_ = allocator ? allocator : new C(); + } + + explicit CacheBaseImpl(const CacheOptions &opts, C *allocator = 0) + : cache_start_(false), nknown_states_(0), + min_unexpanded_state_id_(0), cache_first_state_id_(kNoStateId), + cache_first_state_(0), cache_gc_(opts.gc), cache_size_(0), + cache_limit_(opts.gc_limit > kMinCacheLimit || opts.gc_limit == 0 ? + opts.gc_limit : kMinCacheLimit) { + allocator_ = allocator ? allocator : new C(); + } + + // Preserve gc parameters, but initially cache nothing. + CacheBaseImpl(const CacheBaseImpl &impl) + : cache_start_(false), nknown_states_(0), + min_unexpanded_state_id_(0), cache_first_state_id_(kNoStateId), + cache_first_state_(0), cache_gc_(impl.cache_gc_), cache_size_(0), + cache_limit_(impl.cache_limit_) { + allocator_ = new C(); + } + + ~CacheBaseImpl() { + allocator_->Free(cache_first_state_, cache_first_state_id_); + delete allocator_; + } + + // Gets a state from its ID; state must exist. + const S *GetState(StateId s) const { + if (s == cache_first_state_id_) + return cache_first_state_; + else + return VectorFstBaseImpl::GetState(s); + } + + // Gets a state from its ID; state must exist. + S *GetState(StateId s) { + if (s == cache_first_state_id_) + return cache_first_state_; + else + return VectorFstBaseImpl::GetState(s); + } + + // Gets a state from its ID; return 0 if it doesn't exist. + const S *CheckState(StateId s) const { + if (s == cache_first_state_id_) + return cache_first_state_; + else if (s < NumStates()) + return VectorFstBaseImpl::GetState(s); + else + return 0; + } + + // Gets a state from its ID; add it if necessary. + S *ExtendState(StateId s) { + if (s == cache_first_state_id_) { + return cache_first_state_; // Return 1st cached state + } else if (cache_limit_ == 0 && cache_first_state_id_ == kNoStateId) { + cache_first_state_id_ = s; // Remember 1st cached state + cache_first_state_ = allocator_->Allocate(s); + return cache_first_state_; + } else if (cache_first_state_id_ != kNoStateId && + cache_first_state_->ref_count == 0) { + // With Default allocator, the Free and Allocate will reuse the same S*. + allocator_->Free(cache_first_state_, cache_first_state_id_); + cache_first_state_id_ = s; + cache_first_state_ = allocator_->Allocate(s); + return cache_first_state_; // Return 1st cached state + } else { + while (NumStates() <= s) // Add state to main cache + AddState(0); + if (!VectorFstBaseImpl::GetState(s)) { + SetState(s, allocator_->Allocate(s)); + if (cache_first_state_id_ != kNoStateId) { // Forget 1st cached state + while (NumStates() <= cache_first_state_id_) + AddState(0); + SetState(cache_first_state_id_, cache_first_state_); + if (cache_gc_) { + cache_states_.push_back(cache_first_state_id_); + cache_size_ += sizeof(S) + + cache_first_state_->arcs.capacity() * sizeof(Arc); + } + cache_limit_ = kMinCacheLimit; + cache_first_state_id_ = kNoStateId; + cache_first_state_ = 0; + } + if (cache_gc_) { + cache_states_.push_back(s); + cache_size_ += sizeof(S); + if (cache_size_ > cache_limit_) + GC(s, false); + } + } + S *state = VectorFstBaseImpl::GetState(s); + return state; + } + } + + void SetStart(StateId s) { + VectorFstBaseImpl::SetStart(s); + cache_start_ = true; + if (s >= nknown_states_) + nknown_states_ = s + 1; + } + + void SetFinal(StateId s, Weight w) { + S *state = ExtendState(s); + state->final = w; + state->flags |= kCacheFinal | kCacheRecent | kCacheModified; + } + + // AddArc adds a single arc to state s and does incremental cache + // book-keeping. For efficiency, prefer PushArc and SetArcs below + // when possible. + void AddArc(StateId s, const Arc &arc) { + S *state = ExtendState(s); + state->arcs.push_back(arc); + if (arc.ilabel == 0) { + ++state->niepsilons; + } + if (arc.olabel == 0) { + ++state->noepsilons; + } + const Arc *parc = state->arcs.empty() ? 0 : &(state->arcs.back()); + SetProperties(AddArcProperties(Properties(), s, arc, parc)); + state->flags |= kCacheModified; + if (cache_gc_ && s != cache_first_state_id_) { + cache_size_ += sizeof(Arc); + if (cache_size_ > cache_limit_) + GC(s, false); + } + } + + // Adds a single arc to state s but delays cache book-keeping. + // SetArcs must be called when all PushArc calls at a state are + // complete. Do not mix with calls to AddArc. + void PushArc(StateId s, const Arc &arc) { + S *state = ExtendState(s); + state->arcs.push_back(arc); + } + + // Marks arcs of state s as cached and does cache book-keeping after all + // calls to PushArc have been completed. Do not mix with calls to AddArc. + void SetArcs(StateId s) { + S *state = ExtendState(s); + vector &arcs = state->arcs; + state->niepsilons = state->noepsilons = 0; + for (size_t a = 0; a < arcs.size(); ++a) { + const Arc &arc = arcs[a]; + if (arc.nextstate >= nknown_states_) + nknown_states_ = arc.nextstate + 1; + if (arc.ilabel == 0) + ++state->niepsilons; + if (arc.olabel == 0) + ++state->noepsilons; + } + ExpandedState(s); + state->flags |= kCacheArcs | kCacheRecent | kCacheModified; + if (cache_gc_ && s != cache_first_state_id_) { + cache_size_ += arcs.capacity() * sizeof(Arc); + if (cache_size_ > cache_limit_) + GC(s, false); + } + }; + + void ReserveArcs(StateId s, size_t n) { + S *state = ExtendState(s); + state->arcs.reserve(n); + } + + void DeleteArcs(StateId s, size_t n) { + S *state = ExtendState(s); + const vector &arcs = GetState(s)->arcs; + for (size_t i = 0; i < n; ++i) { + size_t j = arcs.size() - i - 1; + if (arcs[j].ilabel == 0) + --GetState(s)->niepsilons; + if (arcs[j].olabel == 0) + --GetState(s)->noepsilons; + } + state->arcs.resize(arcs.size() - n); + SetProperties(DeleteArcsProperties(Properties())); + state->flags |= kCacheModified; + } + + void DeleteArcs(StateId s) { + S *state = ExtendState(s); + state->niepsilons = 0; + state->noepsilons = 0; + state->arcs.clear(); + SetProperties(DeleteArcsProperties(Properties())); + state->flags |= kCacheModified; + } + + // Is the start state cached? + bool HasStart() const { + if (!cache_start_ && Properties(kError)) + cache_start_ = true; + return cache_start_; + } + + // Is the final weight of state s cached? + bool HasFinal(StateId s) const { + const S *state = CheckState(s); + if (state && state->flags & kCacheFinal) { + state->flags |= kCacheRecent; + return true; + } else { + return false; + } + } + + // Are arcs of state s cached? + bool HasArcs(StateId s) const { + const S *state = CheckState(s); + if (state && state->flags & kCacheArcs) { + state->flags |= kCacheRecent; + return true; + } else { + return false; + } + } + + Weight Final(StateId s) const { + const S *state = GetState(s); + return state->final; + } + + size_t NumArcs(StateId s) const { + const S *state = GetState(s); + return state->arcs.size(); + } + + size_t NumInputEpsilons(StateId s) const { + const S *state = GetState(s); + return state->niepsilons; + } + + size_t NumOutputEpsilons(StateId s) const { + const S *state = GetState(s); + return state->noepsilons; + } + + // Provides information needed for generic arc iterator. + void InitArcIterator(StateId s, ArcIteratorData *data) const { + const S *state = GetState(s); + data->base = 0; + data->narcs = state->arcs.size(); + data->arcs = data->narcs > 0 ? &(state->arcs[0]) : 0; + data->ref_count = &(state->ref_count); + ++(*data->ref_count); + } + + // Number of known states. + StateId NumKnownStates() const { return nknown_states_; } + + // Update number of known states taking in account the existence of state s. + void UpdateNumKnownStates(StateId s) { + if (s >= nknown_states_) + nknown_states_ = s + 1; + } + + // Find the mininum never-expanded state Id + StateId MinUnexpandedState() const { + while (min_unexpanded_state_id_ < expanded_states_.size() && + expanded_states_[min_unexpanded_state_id_]) + ++min_unexpanded_state_id_; + return min_unexpanded_state_id_; + } + + // Removes from cache_states_ and uncaches (not referenced-counted) + // states that have not been accessed since the last GC until + // cache_limit_/3 bytes are uncached. If that fails to free enough, + // recurs uncaching recently visited states as well. If still + // unable to free enough memory, then widens cache_limit_. + void GC(StateId current, bool free_recent) { + if (!cache_gc_) + return; + VLOG(2) << "CacheImpl: Enter GC: object = " << Type() << "(" << this + << "), free recently cached = " << free_recent + << ", cache size = " << cache_size_ + << ", cache limit = " << cache_limit_ << "\n"; + typename list::iterator siter = cache_states_.begin(); + + size_t cache_target = (2 * cache_limit_)/3 + 1; + while (siter != cache_states_.end()) { + StateId s = *siter; + S* state = VectorFstBaseImpl::GetState(s); + if (cache_size_ > cache_target && state->ref_count == 0 && + (free_recent || !(state->flags & kCacheRecent)) && s != current) { + cache_size_ -= sizeof(S) + state->arcs.capacity() * sizeof(Arc); + allocator_->Free(state, s); + SetState(s, 0); + cache_states_.erase(siter++); + } else { + state->flags &= ~kCacheRecent; + ++siter; + } + } + if (!free_recent && cache_size_ > cache_target) { + GC(current, true); + } else { + while (cache_size_ > cache_target) { + cache_limit_ *= 2; + cache_target *= 2; + } + } + VLOG(2) << "CacheImpl: Exit GC: object = " << Type() << "(" << this + << "), free recently cached = " << free_recent + << ", cache size = " << cache_size_ + << ", cache limit = " << cache_limit_ << "\n"; + } + + void ExpandedState(StateId s) { + if (s < min_unexpanded_state_id_) + return; + while (expanded_states_.size() <= s) + expanded_states_.push_back(false); + expanded_states_[s] = true; + } + + // Caching on/off switch, limit and size accessors. + bool GetCacheGc() const { return cache_gc_; } + size_t GetCacheLimit() const { return cache_limit_; } + size_t GetCacheSize() const { return cache_size_; } + + private: + static const size_t kMinCacheLimit = 8096; // Minimum (non-zero) cache limit + static const uint32 kCacheFinal = 0x0001; // Final weight has been cached + static const uint32 kCacheArcs = 0x0002; // Arcs have been cached + static const uint32 kCacheRecent = 0x0004; // Mark as visited since GC + + public: + static const uint32 kCacheModified = 0x0008; // Mark state as modified + static const uint32 kCacheFlags = kCacheFinal | kCacheArcs | kCacheRecent + | kCacheModified; + + protected: + C *allocator_; // used to allocate new states + + private: + mutable bool cache_start_; // Is the start state cached? + StateId nknown_states_; // # of known states + vector expanded_states_; // states that have been expanded + mutable StateId min_unexpanded_state_id_; // minimum never-expanded state Id + StateId cache_first_state_id_; // First cached state id + S *cache_first_state_; // First cached state + list cache_states_; // list of currently cached states + bool cache_gc_; // enable GC + size_t cache_size_; // # of bytes cached + size_t cache_limit_; // # of bytes allowed before GC + + void operator=(const CacheBaseImpl &impl); // disallow +}; + +template const uint32 CacheBaseImpl::kCacheFinal; +template const uint32 CacheBaseImpl::kCacheArcs; +template const uint32 CacheBaseImpl::kCacheRecent; +template const uint32 CacheBaseImpl::kCacheModified; +template const size_t CacheBaseImpl::kMinCacheLimit; + +// Arcs implemented by an STL vector per state. Similar to VectorState +// but adds flags and ref count to keep track of what has been cached. +template +struct CacheState { + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + CacheState() : final(Weight::Zero()), flags(0), ref_count(0) {} + + void Reset() { + flags = 0; + ref_count = 0; + arcs.resize(0); + } + + Weight final; // Final weight + vector arcs; // Arcs represenation + size_t niepsilons; // # of input epsilons + size_t noepsilons; // # of output epsilons + mutable uint32 flags; + mutable int ref_count; + + private: + DISALLOW_COPY_AND_ASSIGN(CacheState); +}; + +// A CacheBaseImpl with a commonly used CacheState. +template +class CacheImpl : public CacheBaseImpl< CacheState > { + public: + typedef CacheState State; + + CacheImpl() {} + + explicit CacheImpl(const CacheOptions &opts) + : CacheBaseImpl< CacheState >(opts) {} + + CacheImpl(const CacheImpl &impl) : CacheBaseImpl(impl) {} + + private: + void operator=(const CacheImpl &impl); // disallow +}; + + +// Use this to make a state iterator for a CacheBaseImpl-derived Fst, +// which must have type 'State' defined. Note this iterator only +// returns those states reachable from the initial state, so consider +// implementing a class-specific one. +template +class CacheStateIterator : public StateIteratorBase { + public: + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename F::State State; + typedef CacheBaseImpl Impl; + + CacheStateIterator(const F &fst, Impl *impl) + : fst_(fst), impl_(impl), s_(0) {} + + bool Done() const { + if (s_ < impl_->NumKnownStates()) + return false; + fst_.Start(); // force start state + if (s_ < impl_->NumKnownStates()) + return false; + for (StateId u = impl_->MinUnexpandedState(); + u < impl_->NumKnownStates(); + u = impl_->MinUnexpandedState()) { + // force state expansion + ArcIterator aiter(fst_, u); + aiter.SetFlags(kArcValueFlags, kArcValueFlags | kArcNoCache); + for (; !aiter.Done(); aiter.Next()) + impl_->UpdateNumKnownStates(aiter.Value().nextstate); + impl_->ExpandedState(u); + if (s_ < impl_->NumKnownStates()) + return false; + } + return true; + } + + StateId Value() const { return s_; } + + void Next() { ++s_; } + + void Reset() { s_ = 0; } + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const { return Done(); } + virtual StateId Value_() const { return Value(); } + virtual void Next_() { Next(); } + virtual void Reset_() { Reset(); } + + const F &fst_; + Impl *impl_; + StateId s_; +}; + + +// Use this to make an arc iterator for a CacheBaseImpl-derived Fst, +// which must have types 'Arc' and 'State' defined. +template > > +class CacheArcIterator { + public: + typedef typename F::Arc Arc; + typedef typename F::State State; + typedef typename Arc::StateId StateId; + typedef CacheBaseImpl Impl; + + CacheArcIterator(Impl *impl, StateId s) : i_(0) { + state_ = impl->ExtendState(s); + ++state_->ref_count; + } + + ~CacheArcIterator() { --state_->ref_count; } + + bool Done() const { return i_ >= state_->arcs.size(); } + + const Arc& Value() const { return state_->arcs[i_]; } + + void Next() { ++i_; } + + size_t Position() const { return i_; } + + void Reset() { i_ = 0; } + + void Seek(size_t a) { i_ = a; } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 flags, uint32 mask) {} + + private: + const State *state_; + size_t i_; + + DISALLOW_COPY_AND_ASSIGN(CacheArcIterator); +}; + +// Use this to make a mutable arc iterator for a CacheBaseImpl-derived Fst, +// which must have types 'Arc' and 'State' defined. +template > > +class CacheMutableArcIterator + : public MutableArcIteratorBase { + public: + typedef typename F::State State; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef CacheBaseImpl Impl; + + // You will need to call MutateCheck() in the constructor. + CacheMutableArcIterator(Impl *impl, StateId s) : i_(0), s_(s), impl_(impl) { + state_ = impl_->ExtendState(s_); + ++state_->ref_count; + }; + + ~CacheMutableArcIterator() { + --state_->ref_count; + } + + bool Done() const { return i_ >= state_->arcs.size(); } + + const Arc& Value() const { return state_->arcs[i_]; } + + void Next() { ++i_; } + + size_t Position() const { return i_; } + + void Reset() { i_ = 0; } + + void Seek(size_t a) { i_ = a; } + + void SetValue(const Arc& arc) { + state_->flags |= CacheBaseImpl::kCacheModified; + uint64 properties = impl_->Properties(); + Arc& oarc = state_->arcs[i_]; + if (oarc.ilabel != oarc.olabel) + properties &= ~kNotAcceptor; + if (oarc.ilabel == 0) { + --state_->niepsilons; + properties &= ~kIEpsilons; + if (oarc.olabel == 0) + properties &= ~kEpsilons; + } + if (oarc.olabel == 0) { + --state_->noepsilons; + properties &= ~kOEpsilons; + } + if (oarc.weight != Weight::Zero() && oarc.weight != Weight::One()) + properties &= ~kWeighted; + oarc = arc; + if (arc.ilabel != arc.olabel) { + properties |= kNotAcceptor; + properties &= ~kAcceptor; + } + if (arc.ilabel == 0) { + ++state_->niepsilons; + properties |= kIEpsilons; + properties &= ~kNoIEpsilons; + if (arc.olabel == 0) { + properties |= kEpsilons; + properties &= ~kNoEpsilons; + } + } + if (arc.olabel == 0) { + ++state_->noepsilons; + properties |= kOEpsilons; + properties &= ~kNoOEpsilons; + } + if (arc.weight != Weight::Zero() && arc.weight != Weight::One()) { + properties |= kWeighted; + properties &= ~kUnweighted; + } + properties &= kSetArcProperties | kAcceptor | kNotAcceptor | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | + kOEpsilons | kNoOEpsilons | kWeighted | kUnweighted; + impl_->SetProperties(properties); + } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 f, uint32 m) {} + + private: + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + virtual size_t Position_() const { return Position(); } + virtual void Reset_() { Reset(); } + virtual void Seek_(size_t a) { Seek(a); } + virtual void SetValue_(const Arc &a) { SetValue(a); } + uint32 Flags_() const { return Flags(); } + void SetFlags_(uint32 f, uint32 m) { SetFlags(f, m); } + + size_t i_; + StateId s_; + Impl *impl_; + State *state_; + + DISALLOW_COPY_AND_ASSIGN(CacheMutableArcIterator); +}; + +} // namespace fst + +#endif // FST_LIB_CACHE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/closure.h b/extlibs/openfstwin-1.3.1/include/fst/closure.h new file mode 100755 index 00000000000..541562be56b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/closure.h @@ -0,0 +1,155 @@ +// closure.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to compute the concatenative closure of an Fst. + +#ifndef FST_LIB_CLOSURE_H__ +#define FST_LIB_CLOSURE_H__ + +#include +using std::vector; +#include + +#include +#include + + +namespace fst { + +// Computes the concatenative closure. This version modifies its +// MutableFst input. If FST transduces string x to y with weight a, +// then the closure transduces x to y with weight a, xx to yy with +// weight Times(a, a), xxx to yyy with with Times(Times(a, a), a), +// etc. If closure_type == CLOSURE_STAR, then the empty string is +// transduced to itself with weight Weight::One() as well. +// +// Complexity: +// - Time: O(V) +// - Space: O(V) +// where V = # of states. +template +void Closure(MutableFst *fst, ClosureType closure_type) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + uint64 props = fst->Properties(kFstProperties, false); + StateId start = fst->Start(); + for (StateIterator< MutableFst > siter(*fst); + !siter.Done(); + siter.Next()) { + StateId s = siter.Value(); + Weight final = fst->Final(s); + if (final != Weight::Zero()) + fst->AddArc(s, Arc(0, 0, final, start)); + } + if (closure_type == CLOSURE_STAR) { + fst->ReserveStates(fst->NumStates() + 1); + StateId nstart = fst->AddState(); + fst->SetStart(nstart); + fst->SetFinal(nstart, Weight::One()); + if (start != kNoLabel) + fst->AddArc(nstart, Arc(0, 0, Weight::One(), start)); + } + fst->SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR), + kFstProperties); +} + +// Computes the concatenative closure. This version modifies its +// RationalFst input. +template +void Closure(RationalFst *fst, ClosureType closure_type) { + fst->GetImpl()->AddClosure(closure_type); +} + + +struct ClosureFstOptions : RationalFstOptions { + ClosureType type; + + ClosureFstOptions(const RationalFstOptions &opts, ClosureType t) + : RationalFstOptions(opts), type(t) {} + explicit ClosureFstOptions(ClosureType t) : type(t) {} + ClosureFstOptions() : type(CLOSURE_STAR) {} +}; + + +// Computes the concatenative closure. This version is a delayed +// Fst. If FST transduces string x to y with weight a, then the +// closure transduces x to y with weight a, xx to yy with weight +// Times(a, a), xxx to yyy with weight Times(Times(a, a), a), etc. If +// closure_type == CLOSURE_STAR, then The empty string is transduced +// to itself with weight Weight::One() as well. +// +// Complexity: +// - Time: O(v) +// - Space: O(v) +// where v = # of states visited. Constant time and space to visit an +// input state or arc is assumed and exclusive of caching. +template +class ClosureFst : public RationalFst { + public: + using ImplToFst< RationalFstImpl >::GetImpl; + + typedef A Arc; + + ClosureFst(const Fst &fst, ClosureType closure_type) { + GetImpl()->InitClosure(fst, closure_type); + } + + ClosureFst(const Fst &fst, const ClosureFstOptions &opts) + : RationalFst(opts) { + GetImpl()->InitClosure(fst, opts.type); + } + + // See Fst<>::Copy() for doc. + ClosureFst(const ClosureFst &fst, bool safe = false) + : RationalFst(fst, safe) {} + + // Get a copy of this ClosureFst. See Fst<>::Copy() for further doc. + virtual ClosureFst *Copy(bool safe = false) const { + return new ClosureFst(*this, safe); + } +}; + + +// Specialization for ClosureFst. +template +class StateIterator< ClosureFst > : public StateIterator< RationalFst > { + public: + explicit StateIterator(const ClosureFst &fst) + : StateIterator< RationalFst >(fst) {} +}; + + +// Specialization for ClosureFst. +template +class ArcIterator< ClosureFst > : public ArcIterator< RationalFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ClosureFst &fst, StateId s) + : ArcIterator< RationalFst >(fst, s) {} +}; + + +// Useful alias when using StdArc. +typedef ClosureFst StdClosureFst; + +} // namespace fst + +#endif // FST_LIB_CLOSURE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/compact-fst.h b/extlibs/openfstwin-1.3.1/include/fst/compact-fst.h new file mode 100755 index 00000000000..efa567a5405 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/compact-fst.h @@ -0,0 +1,1307 @@ +// compact-fst.h + + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// FST Class for memory-efficient representation of common types of +// FSTs: linear automata, acceptors, unweighted FSTs, ... + +#ifndef FST_LIB_COMPACT_FST_H__ +#define FST_LIB_COMPACT_FST_H__ + +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include // For optional argument declarations +#include +#include +#include + + +namespace fst { + +struct CompactFstOptions : public CacheOptions { + // CompactFst default caching behaviour is to do no caching. Most + // compactors are cheap and therefore we save memory by not doing + // caching. + CompactFstOptions() : CacheOptions(true, 0) {} + CompactFstOptions(const CacheOptions &opts) : CacheOptions(opts) {} +}; + +// Compactor Interface - class determinies how arcs and final weights +// are compacted and expanded. +// +// Final weights are treated as transitions to the superfinal state, +// i.e. ilabel = olabel = kNoLabel and nextstate = kNoStateId. +// +// There are two types of compactors: +// +// * Fixed out-degree compactors: 'compactor.Size()' returns a +// positive integer 's'. An FST can be compacted by this compactor +// only if each state has exactly 's' outgoing transitions (counting a +// non-Zero() final weight as a transition). A typical example is a +// compactor for string FSTs, i.e. 's == 1'. +// +// * Variable out-degree compactors: 'compactor.Size() == -1'. There +// are no out-degree restrictions for these compactors. +// +// +// class Compactor { +// public: +// // Element is the type of the compacted transitions. +// typedef ... Element; +// // Return the compacted representation of a transition 'arc' +// // at a state 's'. +// Element Compact(StateId s, const Arc &arc); +// // Return the transition at state 's' represented by the compacted +// // transition 'e'. +// Arc Expand(StateId s, const Element &e); +// // Return -1 for variable out-degree compactors, and the mandatory +// // out-degree otherwise. +// ssize_t Size(); +// // Test whether 'fst' can be compacted by this compactor. +// bool Compatible(const Fst &fst); +// // Return the properties that are always true for an fst +// // compacted using this compactor +// uint64 Properties(); +// // Return a string identifying the type of compactor. +// static const string &Type(); +// // Write a compactor to a file. +// bool Write(ostream &strm); +// // Read a compactor from a file. +// static Compactor *Read(istream &strm); +// // Default constructor (optional, see comment below). +// Compactor(); +// }; +// +// The default constructor is only required for FST_REGISTER to work +// (i.e. enabling Convert() and the command-line utilities to work +// with this new compactor). However, a default constructor always +// needs to be specify for this code to compile, but one can have it +// simply raised an error when called: +// +// Compactor::Compactor() { +// FSTERROR() << "Compactor: no default constructor"; +// } + + +// Implementation data for Compact Fst, which can shared between otherwise +// independent copies. +// +// The implementation contains two arrays: 'states_' and 'compacts_'. +// +// For fixed out-degree compactors, the 'states_' array is unallocated. +// The 'compacts_' contains the compacted transitions. Its size is +// 'ncompacts_'. The outgoing transitions at a given state are stored +// consecutively. For a given state 's', its 'compactor.Size()' outgoing +// transitions (including superfinal transition when 's' is final), are +// stored in position ['s*compactor.Size()', '(s+1)*compactor_.Size()'). +// +// For variable out-degree compactors, the states_ array has size +// 'nstates_ + 1' and contains pointers to positions into 'compacts_'. +// For a given state 's', the compacted transitions of 's' are +// stored in positions [ 'states_[s]', 'states_[s + 1]' ) in 'compacts_'. +// By convention, 'states_[nstates_] == ncompacts_'. +// +// In both cases, the superfinal transitons (when 's' is final, i.e. +// 'Final(s) != Weight::Zero()') is stored first. +// +// The unsigned type U is used to represent indices into the compacts_ +// array. +template +class CompactFstData { + public: + typedef E CompactElement; + typedef U Unsigned; + + CompactFstData() + : states_(0), + compacts_(0), + nstates_(0), + ncompacts_(0), + narcs_(0), + start_(kNoStateId), + error_(false) {} + + template + CompactFstData(const Fst &fst, const Compactor &compactor); + + template + CompactFstData(const Iterator &begin, const Iterator &end, + const Compactor &compactor); + + ~CompactFstData() { + delete[] states_; + delete[] compacts_; + } + + template + static CompactFstData *Read(istream &strm, + const FstReadOptions &opts, + const FstHeader &hdr, + const Compactor &compactor); + + bool Write(ostream &strm, const FstWriteOptions &opts) const; + + Unsigned States(ssize_t i) const { return states_[i]; } + const CompactElement &Compacts(size_t i) const { return compacts_[i]; } + size_t NumStates() const { return nstates_; } + size_t NumCompacts() const { return ncompacts_; } + size_t NumArcs() const { return narcs_; } + ssize_t Start() const { return start_; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + bool Error() const { return error_; } + + private: + // Byte alignment for states and arcs in file format (version 1 only) + static const int kFileAlign = 16; + + Unsigned *states_; + CompactElement *compacts_; + size_t nstates_; + size_t ncompacts_; + size_t narcs_; + ssize_t start_; + RefCounter ref_count_; + bool error_; +}; + +template +const int CompactFstData::kFileAlign; + + +template +template +CompactFstData::CompactFstData(const Fst &fst, const C &compactor) + : states_(0), + compacts_(0), + nstates_(0), + ncompacts_(0), + narcs_(0), + start_(kNoStateId), + error_(false) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + start_ = fst.Start(); + // Count # of states and arcs. + StateId nfinals = 0; + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) { + ++nstates_; + StateId s = siter.Value(); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) + ++narcs_; + if (fst.Final(s) != Weight::Zero()) ++nfinals; + } + if (compactor.Size() == -1) { + states_ = new Unsigned[nstates_ + 1]; + ncompacts_ = narcs_ + nfinals; + compacts_ = new CompactElement[ncompacts_]; + states_[nstates_] = ncompacts_; + } else { + states_ = 0; + ncompacts_ = nstates_ * compactor.Size(); + if ((narcs_ + nfinals) != ncompacts_) { + FSTERROR() << "CompactFstData: compactor incompatible with fst"; + error_ = true; + return; + } + compacts_ = new CompactElement[ncompacts_]; + } + size_t pos = 0, fpos = 0; + for (StateId s = 0; s < nstates_; ++s) { + fpos = pos; + if (compactor.Size() == -1) + states_[s] = pos; + if (fst.Final(s) != Weight::Zero()) + compacts_[pos++] = compactor.Compact(s, A(kNoLabel, kNoLabel, + fst.Final(s), kNoStateId)); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + compacts_[pos++] = compactor.Compact(s, aiter.Value()); + } + if ((compactor.Size() != -1) && ((pos - fpos) != compactor.Size())) { + FSTERROR() << "CompactFstData: compactor incompatible with fst"; + error_ = true; + return; + } + } + if (pos != ncompacts_) { + FSTERROR() << "CompactFstData: compactor incompatible with fst"; + error_ = true; + return; + } +} + +template +template +CompactFstData::CompactFstData(const Iterator &begin, + const Iterator &end, + const C &compactor) + : states_(0), + compacts_(0), + nstates_(0), + ncompacts_(0), + narcs_(0), + start_(kNoStateId), + error_(false) { + typedef typename C::Arc Arc; + typedef typename Arc::Weight Weight; + if (compactor.Size() != -1) { + ncompacts_ = distance(begin, end); + if (compactor.Size() == 1) { + // For strings, allow implicit final weight. + // Empty input is the empty string. + if (ncompacts_ == 0) { + ++ncompacts_; + } else { + Arc arc = compactor.Expand(ncompacts_ - 1, + *(begin + (ncompacts_ - 1))); + if (arc.ilabel != kNoLabel) + ++ncompacts_; + } + } + if (ncompacts_ % compactor.Size()) { + FSTERROR() << "CompactFstData: size of input container incompatible" + << " with compactor"; + error_ = true; + return; + } + if (ncompacts_ == 0) + return; + start_ = 0; + nstates_ = ncompacts_ / compactor.Size(); + compacts_ = new CompactElement[ncompacts_]; + size_t i = 0; + Iterator it = begin; + for(; it != end; ++it, ++i){ + compacts_[i] = *it; + if (compactor.Expand(i, *it).ilabel != kNoLabel) + ++narcs_; + } + if (i < ncompacts_) + compacts_[i] = compactor.Compact(i, Arc(kNoLabel, kNoLabel, + Weight::One(), kNoStateId)); + } else { + if (distance(begin, end) == 0) + return; + // Count # of states, arcs and compacts. + Iterator it = begin; + for(size_t i = 0; it != end; ++it, ++i) { + Arc arc = compactor.Expand(i, *it); + if (arc.ilabel != kNoLabel) { + ++narcs_; + ++ncompacts_; + } else { + ++nstates_; + if (arc.weight != Weight::Zero()) + ++ncompacts_; + } + } + start_ = 0; + compacts_ = new CompactElement[ncompacts_]; + states_ = new Unsigned[nstates_ + 1]; + states_[nstates_] = ncompacts_; + size_t i = 0, s = 0; + for(it = begin; it != end; ++it) { + Arc arc = compactor.Expand(i, *it); + if (arc.ilabel != kNoLabel) { + compacts_[i++] = *it; + } else { + states_[s++] = i; + if (arc.weight != Weight::Zero()) + compacts_[i++] = *it; + } + } + if ((s != nstates_) || (i != ncompacts_)) { + FSTERROR() << "CompactFstData: ill-formed input container"; + error_ = true; + return; + } + } +} + +template +template +CompactFstData *CompactFstData::Read( + istream &strm, + const FstReadOptions &opts, + const FstHeader &hdr, + const C &compactor) { + CompactFstData *data = new CompactFstData(); + data->start_ = hdr.Start(); + data->nstates_ = hdr.NumStates(); + data->narcs_ = hdr.NumArcs(); + + if (compactor.Size() == -1) { + data->states_ = new Unsigned[data->nstates_ + 1]; + if ((hdr.GetFlags() & FstHeader::IS_ALIGNED) && + !AlignInput(strm, kFileAlign)) { + LOG(ERROR) << "CompactFst::Read: Alignment failed: " << opts.source; + delete data; + return 0; + } + // TODO: memory map this + size_t b = (data->nstates_ + 1) * sizeof(Unsigned); + strm.read(reinterpret_cast(data->states_), b); + if (!strm) { + LOG(ERROR) << "CompactFst::Read: Read failed: " << opts.source; + delete data; + return 0; + } + } else { + data->states_ = 0; + } + data->ncompacts_ = compactor.Size() == -1 + ? data->states_[data->nstates_] + : data->nstates_ * compactor.Size(); + data->compacts_ = new CompactElement[data->ncompacts_]; + // TODO: memory map this + size_t b = data->ncompacts_ * sizeof(CompactElement); + if ((hdr.GetFlags() & FstHeader::IS_ALIGNED) && + !AlignInput(strm, kFileAlign)) { + LOG(ERROR) << "CompactFst::Read: Alignment failed: " << opts.source; + delete data; + return 0; + } + strm.read(reinterpret_cast(data->compacts_), b); + if (!strm) { + LOG(ERROR) << "CompactFst::Read: Read failed: " << opts.source; + delete data; + return 0; + } + return data; +} + +template +bool CompactFstData::Write(ostream &strm, + const FstWriteOptions &opts) const { + if (states_) { + if (opts.align && !AlignOutput(strm, kFileAlign)) { + LOG(ERROR) << "CompactFst::Write: Alignment failed: " << opts.source; + return false; + } + strm.write(reinterpret_cast(states_), + (nstates_ + 1) * sizeof(Unsigned)); + } + if (opts.align && !AlignOutput(strm, kFileAlign)) { + LOG(ERROR) << "CompactFst::Write: Alignment failed: " << opts.source; + return false; + } + strm.write(reinterpret_cast(compacts_), + ncompacts_ * sizeof(CompactElement)); + + strm.flush(); + if (!strm) { + LOG(ERROR) << "CompactFst::Write: Write failed: " << opts.source; + return false; + } + return true; +} + +template class CompactFst; +template void Cast(const F &, G *); + +// Implementation class for CompactFst, which contains CompactFstData +// and Fst cache. +template +class CompactFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::WriteHeader; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef C Compactor; + typedef typename C::Element CompactElement; + typedef U Unsigned; + + CompactFstImpl() + : CacheImpl(CompactFstOptions()), + compactor_(0), + own_compactor_(false), + data_(0) { + string type = "compact"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(U), &size); + type += size; + } + type += "_"; + type += C::Type(); + SetType(type); + SetProperties(kNullProperties | kStaticProperties); + } + + CompactFstImpl(const Fst &fst, const C &compactor, + const CompactFstOptions &opts) + : CacheImpl(opts), + compactor_(new C(compactor)), + own_compactor_(true), + data_(0) { + Init(fst); + } + + CompactFstImpl(const Fst &fst, C *compactor, + const CompactFstOptions &opts) + : CacheImpl(opts), + compactor_(compactor), + own_compactor_(false), + data_(0) { + Init(fst); + } + + template + CompactFstImpl(const Iterator &b, const Iterator &e, const C &compactor, + const CompactFstOptions &opts) + : CacheImpl(opts), + compactor_(new C(compactor)), + own_compactor_(true), + data_(0) { + Init(b, e); + } + + template + CompactFstImpl(const Iterator &b, const Iterator &e, C *compactor, + const CompactFstOptions &opts) + : CacheImpl(opts), + compactor_(compactor), + own_compactor_(false), + data_(0) { + Init(b, e); + } + + CompactFstImpl(const CompactFstImpl &impl) + : CacheImpl(impl), + compactor_(new C(*impl.compactor_)), + own_compactor_(true), + data_(impl.data_) { + if (data_) + data_->IncrRefCount(); + SetType(impl.Type()); + SetProperties(impl.Properties()); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~CompactFstImpl(){ + if (own_compactor_) + delete compactor_; + if (data_ && !data_->DecrRefCount()) + delete data_; + } + + StateId Start() { + if (!HasStart()) { + SetStart(data_->Start()); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Arc arc(kNoLabel, kNoLabel, Weight::Zero(), kNoStateId); + if ((compactor_->Size() != -1) || + (data_->States(s) != data_->States(s + 1))) + arc = ComputeArc(s, + compactor_->Size() == -1 + ? data_->States(s) + : s * compactor_->Size()); + SetFinal(s, arc.ilabel == kNoLabel ? arc.weight : Weight::Zero()); + } + return CacheImpl::Final(s); + } + + StateId NumStates() const { + if (Properties(kError)) return 0; + return data_->NumStates(); + } + + size_t NumArcs(StateId s) { + if (HasArcs(s)) + return CacheImpl::NumArcs(s); + Unsigned i, num_arcs; + if (compactor_->Size() == -1) { + i = data_->States(s); + num_arcs = data_->States(s + 1) - i; + } else { + i = s * compactor_->Size(); + num_arcs = compactor_->Size(); + } + if (num_arcs > 0) { + const A &arc = ComputeArc(s, i, kArcILabelValue); + if (arc.ilabel == kNoStateId) { + --num_arcs; + } + } + return num_arcs; + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s) && !Properties(kILabelSorted)) + Expand(s); + if (HasArcs(s)) + return CacheImpl::NumInputEpsilons(s); + return CountEpsilons(s, false); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s) && !Properties(kOLabelSorted)) + Expand(s); + if (HasArcs(s)) + return CacheImpl::NumOutputEpsilons(s); + return CountEpsilons(s, true); + } + + size_t CountEpsilons(StateId s, bool output_epsilons) { + size_t begin = compactor_->Size() == -1 ? + data_->States(s) : s * compactor_->Size(); + size_t end = compactor_->Size() == -1 ? + data_->States(s + 1) : (s + 1) * compactor_->Size(); + size_t num_eps = 0; + for (size_t i = begin; i < end; ++i) { + const A &arc = ComputeArc( + s, i, output_epsilons ? kArcOLabelValue : kArcILabelValue); + const typename A::Label &label = + (output_epsilons ? arc.olabel : arc.ilabel); + if (label == kNoLabel) + continue; + else if (label > 0) + break; + ++num_eps; + } + return num_eps; + } + + static CompactFstImpl *Read(istream &strm, + const FstReadOptions &opts) { + CompactFstImpl *impl = new CompactFstImpl(); + FstHeader hdr; + if (!impl->ReadHeader(strm, opts, kMinFileVersion, &hdr)) { + delete impl; + return 0; + } + + // Ensures compatibility + if (hdr.Version() == kAlignedFileVersion) + hdr.SetFlags(hdr.GetFlags() | FstHeader::IS_ALIGNED); + + impl->compactor_ = C::Read(strm); + if (!impl->compactor_) { + delete impl; + return 0; + } + impl->own_compactor_ = true; + impl->data_ = CompactFstData::Read(strm, opts, hdr, + *impl->compactor_); + if (!impl->data_) { + delete impl; + return 0; + } + return impl; + } + + bool Write(ostream &strm, const FstWriteOptions &opts) const { + FstHeader hdr; + hdr.SetStart(data_->Start()); + hdr.SetNumStates(data_->NumStates()); + hdr.SetNumArcs(data_->NumArcs()); + + // Ensures compatibility + int file_version = opts.align ? kAlignedFileVersion : kFileVersion; + WriteHeader(strm, opts, file_version, &hdr); + + compactor_->Write(strm); + return data_->Write(strm, opts); + } + + // Provide information needed for generic state iterator + void InitStateIterator(StateIteratorData *data) const { + data->base = 0; + data->nstates = data_->NumStates(); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + Arc ComputeArc(StateId s, Unsigned i, uint32 f = kArcValueFlags) const { + return compactor_->Expand(s, data_->Compacts(i), f); + } + + void Expand(StateId s) { + size_t begin = compactor_->Size() == -1 ? + data_->States(s) : s * compactor_->Size(); + size_t end = compactor_->Size() == -1 ? + data_->States(s + 1) : (s + 1) * compactor_->Size(); + for (size_t i = begin; i < end; ++i) { + const Arc &arc = ComputeArc(s, i); + if (arc.ilabel == kNoLabel) continue; + PushArc(s, arc); + } + SetArcs(s); + } + + template + void SetCompactElements(const Iterator &b, const Iterator &e) { + if (data_ && !data_->DecrRefCount()) + delete data_; + data_ = new CompactFstData(b, e, *compactor_); + } + + C *GetCompactor() const { return compactor_; } + CompactFstData *Data() const { return data_; } + + protected: + template + explicit CompactFstImpl(const CompactFstImpl &impl) + : CacheImpl(CacheOptions(impl.GetCacheGc(), impl.GetCacheLimit())), + compactor_(new C(*impl.GetCompactor())), + own_compactor_(true), + data_(impl.Data()) { + if (data_) + data_->IncrRefCount(); + SetType(impl.Type()); + SetProperties(impl.Properties()); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + private: + void Init(const Fst &fst) { + string type = "compact"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(U), &size); + type += size; + } + type += "_"; + type += compactor_->Type(); + SetType(type); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + data_ = new CompactFstData(fst, *compactor_); + if (data_->Error()) + SetProperties(kError, kError); + uint64 copy_properties = fst.Properties(kCopyProperties, true); + if ((copy_properties & kError) || !compactor_->Compatible(fst)) { + FSTERROR() << "CompactFstImpl: input fst incompatible with compactor"; + SetProperties(kError, kError); + return; + } + SetProperties(copy_properties | kStaticProperties); + } + + template + void Init(const Iterator &b, const Iterator &e) { + string type = "compact"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(U), &size); + type += size; + } + type += "_"; + type += compactor_->Type(); + SetType(type); + SetProperties(kStaticProperties | compactor_->Properties()); + data_ = new CompactFstData(b, e, *compactor_); + if (data_->Error()) + SetProperties(kError, kError); + } + + // Properties always true of this Fst class + static const uint64 kStaticProperties = kExpanded; + // Current unaligned file format version + static const int kFileVersion = 2; + // Current aligned file format version + static const int kAlignedFileVersion = 1; + // Minimum file format version supported + static const int kMinFileVersion = 1; + + C *compactor_; + bool own_compactor_; + CompactFstData *data_; +}; + +template +const uint64 CompactFstImpl::kStaticProperties; +template +const int CompactFstImpl::kFileVersion; +template +const int CompactFstImpl::kAlignedFileVersion; +template +const int CompactFstImpl::kMinFileVersion; + + +// CompactFst. This class attaches interface to implementation and +// handles reference counting, delegating most methods to +// ImplToExpandedFst. The unsigned type U is used to represent indices +// into the compact arc array (uint32 by default, declared in +// fst-decl.h). +template +class CompactFst : public ImplToExpandedFst< CompactFstImpl > { + public: + friend class StateIterator< CompactFst >; + friend class ArcIterator< CompactFst >; + template void friend Cast(const F &, G *); + + typedef A Arc; + typedef typename A::StateId StateId; + typedef CompactFstImpl Impl; + typedef CacheState State; + typedef U Unsigned; + + CompactFst() : ImplToExpandedFst(new Impl()) {} + + explicit CompactFst(const Fst &fst, const C &compactor = C(), + const CompactFstOptions &opts = CompactFstOptions()) + : ImplToExpandedFst(new Impl(fst, compactor, opts)) {} + + CompactFst(const Fst &fst, C *compactor, + const CompactFstOptions &opts = CompactFstOptions()) + : ImplToExpandedFst(new Impl(fst, compactor, opts)) {} + + // The following 2 constructors take as input two iterators delimiting + // a set of (already) compacted transitions, starting with the + // transitions out of the initial state. The format of the input + // differs for fixed out-degree and variable out-degree compactors. + // + // - For fixed out-degree compactors, the final weight (encoded as a + // compacted transition) needs to be given only for final + // states. All strings (compactor of size 1) will be assume to be + // terminated by a final state even when the final state is not + // implicitely given. + // + // - For variable out-degree compactors, the final weight (encoded + // as a compacted transition) needs to be given for all states and + // must appeared first in the list (for state s, final weight of s, + // followed by outgoing transitons in s). + // + // These 2 constructors allows the direct construction of a CompactFst + // without first creating a more memory hungry 'regular' FST. This + // is useful when memory usage is severely constrained. + template + explicit CompactFst(const Iterator &begin, const Iterator &end, + const C &compactor = C(), + const CompactFstOptions &opts = CompactFstOptions()) + : ImplToExpandedFst(new Impl(begin, end, compactor, opts)) {} + + template + CompactFst(const Iterator &begin, const Iterator &end, + C *compactor, const CompactFstOptions &opts = CompactFstOptions()) + : ImplToExpandedFst(new Impl(begin, end, compactor, opts)) {} + + // See Fst<>::Copy() for doc. + CompactFst(const CompactFst &fst, bool safe = false) + : ImplToExpandedFst(fst, safe) {} + + // Get a copy of this CompactFst. See Fst<>::Copy() for further doc. + virtual CompactFst *Copy(bool safe = false) const { + return new CompactFst(*this, safe); + } + + // Read a CompactFst from an input stream; return NULL on error + static CompactFst *Read(istream &strm, const FstReadOptions &opts) { + Impl* impl = Impl::Read(strm, opts); + return impl ? new CompactFst(impl) : 0; + } + + // Read a CompactFst from a file; return NULL on error + // Empty filename reads from standard input + static CompactFst *Read(const string &filename) { + Impl* impl = ImplToExpandedFst::Read(filename); + return impl ? new CompactFst(impl) : 0; + } + + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + return GetImpl()->Write(strm, opts); + } + + virtual bool Write(const string &filename) const { + return Fst::WriteFile(filename); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + virtual MatcherBase *InitMatcher(MatchType match_type) const { + return new SortedMatcher >(*this, match_type); + } + + template + void SetCompactElements(const Iterator &b, const Iterator &e) { + GetImpl()->SetCompactElements(b, e); + } + + private: + CompactFst(Impl *impl) : ImplToExpandedFst(impl) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst >::GetImpl(); } + + void SetImpl(Impl *impl, bool own_impl = false) { + ImplToFst< Impl, ExpandedFst >::SetImpl(impl, own_impl); + } + + void operator=(const CompactFst &fst); // disallow +}; + + +// Specialization for CompactFst; see generic version in fst.h +// for sample usage (but use the CompactFst type!). This version +// should inline. +template +class StateIterator< CompactFst > { + public: + typedef typename A::StateId StateId; + + explicit StateIterator(const CompactFst &fst) + : nstates_(fst.GetImpl()->NumStates()), s_(0) {} + + bool Done() const { return s_ >= nstates_; } + + StateId Value() const { return s_; } + + void Next() { ++s_; } + + void Reset() { s_ = 0; } + + private: + StateId nstates_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + +// Specialization for CompactFst. +// Never caches, always iterates over the underlying compact elements. +template +class ArcIterator< CompactFst > { + public: + typedef typename A::StateId StateId; + typedef typename C::Element CompactElement; + + ArcIterator(const CompactFst &fst, StateId s) + : compactor_(fst.GetImpl()->GetCompactor()), state_(s), compacts_(0), + pos_(0), flags_(kArcValueFlags) { + + const CompactFstData *data = fst.GetImpl()->Data(); + size_t offset; + if (compactor_->Size() == -1) { // Variable out-degree compactor + offset = data->States(s); + num_arcs_ = data->States(s + 1) - offset; + } else { // Fixed out-degree compactor + offset = s * compactor_->Size(); + num_arcs_ = compactor_->Size(); + } + if (num_arcs_ > 0) { + compacts_ = &(data->Compacts(offset)); + arc_ = compactor_->Expand(s, *compacts_, kArcILabelValue); + if (arc_.ilabel == kNoStateId) { + ++compacts_; + --num_arcs_; + } + } + } + + ~ArcIterator() {} + + bool Done() const { return pos_ >= num_arcs_; } + + const A& Value() const { + arc_ = compactor_->Expand(state_, compacts_[pos_], flags_); + return arc_; + } + + void Next() { ++pos_; } + + size_t Position() const { return pos_; } + + void Reset() { pos_ = 0; } + + void Seek(size_t pos) { pos_ = pos; } + + uint32 Flags() const { return flags_; } + + void SetFlags(uint32 f, uint32 m) { + flags_ &= ~m; + flags_ |= (f & kArcValueFlags); + } + + private: + C *compactor_; + StateId state_; + const CompactElement *compacts_; + size_t pos_; + size_t num_arcs_; + mutable A arc_; + uint32 flags_; + + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// // Specialization for CompactFst. +// // This is an optionally caching arc iterator. +// // TODO(allauzen): implements the kArcValueFlags, the current +// // implementation only implements the kArcNoCache flag. +// template +// class ArcIterator< CompactFst > { +// public: +// typedef typename A::StateId StateId; + +// ArcIterator(const CompactFst &fst, StateId s) +// : fst_(fst), state_(s), pos_(0), num_arcs_(0), offset_(0), +// flags_(kArcValueFlags) { +// cache_data_.ref_count = 0; + +// if (fst_.GetImpl()->HasArcs(state_)) { +// fst_.GetImpl()->InitArcIterator(s, &cache_data_); +// num_arcs_ = cache_data_.narcs; +// return; +// } + +// const C *compactor = fst_.GetImpl()->GetCompactor(); +// const CompactFstData *data = fst_.GetImpl()->Data(); +// if (compactor->Size() == -1) { // Variable out-degree compactor +// offset_ = data->States(s); +// num_arcs_ = data->States(s + 1) - offset_; +// } else { // Fixed out-degree compactor +// offset_ = s * compactor->Size(); +// num_arcs_ = compactor->Size(); +// } +// if (num_arcs_ > 0) { +// const A &arc = fst_.GetImpl()->ComputeArc(s, offset_); +// if (arc.ilabel == kNoStateId) { +// ++offset_; +// --num_arcs_; +// } +// } +// } + + +// ~ArcIterator() { +// if (cache_data_.ref_count) +// --(*cache_data_.ref_count); +// } + +// bool Done() const { return pos_ >= num_arcs_; } + +// const A& Value() const { +// if (cache_data_.ref_count == 0) { +// if (flags_ & kArcNoCache) { +// arc_ = fst_.GetImpl()->ComputeArc(state_, pos_ + offset_); +// return arc_; +// } else { +// fst_.GetImpl()->InitArcIterator(state_, &cache_data_); +// } +// } +// return cache_data_.arcs[pos_]; +// } + +// void Next() { ++pos_; } + +// size_t Position() const { return pos_; } + +// void Reset() { pos_ = 0; } + +// void Seek(size_t pos) { pos_ = pos; } + +// uint32 Flags() const { return flags_; } + +// void SetFlags(uint32 f, uint32 m) { +// flags_ &= ~m; +// flags_ |= f; + +// if (!(flags_ & kArcNoCache) && cache_data_.ref_count == 0) +// fst_.GetImpl()->InitArcIterator(state_, &cache_data_); +// } + +// private: +// mutable const CompactFst &fst_; +// StateId state_; +// size_t pos_; +// size_t num_arcs_; +// size_t offset_; +// uint32 flags_; +// mutable A arc_; +// mutable ArcIteratorData cache_data_; + +// DISALLOW_COPY_AND_ASSIGN(ArcIterator); +// }; + + +// +// Utility Compactors +// + +// Compactor for unweighted string FSTs +template +class StringCompactor { + public: + typedef A Arc; + typedef typename A::Label Element; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + Element Compact(StateId s, const A &arc) const { return arc.ilabel; } + + Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { + return Arc(p, p, Weight::One(), p != kNoLabel ? s + 1 : kNoStateId); + } + + ssize_t Size() const { return 1; } + + uint64 Properties() const { + return kString | kAcceptor | kUnweighted; + } + + bool Compatible(const Fst &fst) const { + uint64 props = Properties(); + return fst.Properties(props, true) == props; + } + + static const string &Type() { + static const string type = "string"; + return type; + } + + bool Write(ostream &strm) const { return true; } + + static StringCompactor *Read(istream &strm) { + return new StringCompactor; + } +}; + + +// Compactor for weighted string FSTs +template +class WeightedStringCompactor { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef pair Element; + + Element Compact(StateId s, const A &arc) const { + return make_pair(arc.ilabel, arc.weight); + } + + Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { + return Arc(p.first, p.first, p.second, + p.first != kNoLabel ? s + 1 : kNoStateId); + } + + ssize_t Size() const { return 1;} + + uint64 Properties() const { + return kString | kAcceptor; + } + + bool Compatible(const Fst &fst) const { + uint64 props = Properties(); + return fst.Properties(props, true) == props; + } + + static const string &Type() { + static const string type = "weighted_string"; + return type; + } + + bool Write(ostream &strm) const { return true; } + + static WeightedStringCompactor *Read(istream &strm) { + return new WeightedStringCompactor; + } +}; + + +// Compactor for unweighted acceptor FSTs +template +class UnweightedAcceptorCompactor { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef pair Element; + + Element Compact(StateId s, const A &arc) const { + return make_pair(arc.ilabel, arc.nextstate); + } + + Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { + return Arc(p.first, p.first, Weight::One(), p.second); + } + + ssize_t Size() const { return -1;} + + uint64 Properties() const { + return kAcceptor | kUnweighted; + } + + bool Compatible(const Fst &fst) const { + uint64 props = Properties(); + return fst.Properties(props, true) == props; + } + + static const string &Type() { + static const string type = "unweighted_acceptor"; + return type; + } + + bool Write(ostream &strm) const { return true; } + + static UnweightedAcceptorCompactor *Read(istream &istrm) { + return new UnweightedAcceptorCompactor; + } +}; + + +// Compactor for weighted acceptor FSTs +template +class AcceptorCompactor { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef pair< pair, StateId > Element; + + Element Compact(StateId s, const A &arc) const { + return make_pair(make_pair(arc.ilabel, arc.weight), arc.nextstate); + } + + Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { + return Arc(p.first.first, p.first.first, p.first.second, p.second); + } + + ssize_t Size() const { return -1;} + + uint64 Properties() const { + return kAcceptor; + } + + bool Compatible(const Fst &fst) const { + uint64 props = Properties(); + return fst.Properties(props, true) == props; + } + + static const string &Type() { + static const string type = "acceptor"; + return type; + } + + bool Write(ostream &strm) const { return true; } + + static AcceptorCompactor *Read(istream &strm) { + return new AcceptorCompactor; + } +}; + + +// Compactor for unweighted FSTs +template +class UnweightedCompactor { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef pair< pair, StateId > Element; + + Element Compact(StateId s, const A &arc) const { + return make_pair(make_pair(arc.ilabel, arc.olabel), arc.nextstate); + } + + Arc Expand(StateId s, const Element &p, uint32 f = kArcValueFlags) const { + return Arc(p.first.first, p.first.second, Weight::One(), p.second); + } + + ssize_t Size() const { return -1; } + + uint64 Properties() const { + return kUnweighted; + } + + bool Compatible(const Fst &fst) const { + uint64 props = Properties(); + return fst.Properties(props, true) == props; + } + + static const string &Type() { + static const string type = "unweighted"; + return type; + } + + bool Write(ostream &strm) const { return true; } + + static UnweightedCompactor *Read(istream &strm) { + return new UnweightedCompactor; + } +}; + + +// Uselful aliases when using StdArc +typedef CompactFst< StdArc, StringCompactor > +StdCompactStringFst; +typedef CompactFst< StdArc, WeightedStringCompactor > +StdCompactWeightedStringFst; +typedef CompactFst > +StdCompactAcceptorFst; +typedef CompactFst > +StdCompactUnweightedFst; +typedef CompactFst > +StdCompactUnweightedAcceptorFst; + +} // namespace fst + +#endif // FST_LIB_COMPACT_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/compat.h b/extlibs/openfstwin-1.3.1/include/fst/compat.h new file mode 100755 index 00000000000..917ee8a7aeb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/compat.h @@ -0,0 +1,153 @@ +// compat.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Google compatibility declarations and inline definitions. + +#ifndef FST_LIB_COMPAT_H__ +#define FST_LIB_COMPAT_H__ + +#ifdef _MSC_VER //AddedPD +#include +typedef SSIZE_T ssize_t; +#define snprintf _snprintf +#define strtoll _strtoi64 +#ifndef OPENFSTEXPORT + #ifdef _DEBUG + #ifdef _M_X64 + #pragma comment (lib, "openfst64-gd.lib") + #else + #pragma comment (lib, "openfst-gd.lib") + #endif + #else + #ifdef _M_X64 + #pragma comment (lib, "openfst64.lib") + #else + #pragma comment (lib, "openfst.lib") + #endif + #endif +#endif +#else + #include +#endif + +#include +#include +#include +#include +#include +#include + +// Makes copy constructor and operator= private +#define DISALLOW_COPY_AND_ASSIGN(type) \ + type(const type&); \ + void operator=(const type&) + +#include +#include +#include +#include +#include +#include + +using std::cin; +using std::cout; +using std::cerr; +using std::endl; +using std::string; + +void OPENFSTDLL FailedNewHandler(); //ChangedPD + +namespace fst { + +using namespace std; + +void OPENFSTDLL SplitToVector(char *line, const char *delim, //ChangedPD + std::vector *vec, bool omit_empty_strings); + +// Downcasting +template +inline To down_cast(From* f) { + return static_cast(f); +} + +// Bitcasting +template +inline Dest bit_cast(const Source& source) { + // Compile time assertion: sizeof(Dest) == sizeof(Source) + // A compile error here means your Dest and Source have different sizes. + typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : + -1]; + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +} + +// Check sums +class CheckSummer { + public: + CheckSummer() : count_(0) { + check_sum_.resize(kCheckSumLength, '\0'); + } + + void Reset() { + count_ = 0; + for (int i = 0; i < kCheckSumLength; ++i) + check_sum_[0] = '\0'; + } + + void Update(void const *data, int size) { + const char *p = reinterpret_cast(data); + for (int i = 0; i < size; ++i) + check_sum_[(count_++) % kCheckSumLength] ^= p[i]; + } + + void Update(string const &data) { + for (int i = 0; i < data.size(); ++i) + check_sum_[(count_++) % kCheckSumLength] ^= data[i]; + } + + string Digest() { + return check_sum_; + } + + private: + static const int kCheckSumLength = 32; + int count_; + string check_sum_; + + DISALLOW_COPY_AND_ASSIGN(CheckSummer); +}; + +} // namespace fst + + +// Define missing hash functions if needed +#ifndef HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ +namespace std { +namespace tr1 { + +template class hash; + +template<> struct hash { + size_t operator()(uint64 x) const { return x; } +}; + +} +} +#endif // HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ + +#endif // FST_LIB_COMPAT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/compat.h.bak b/extlibs/openfstwin-1.3.1/include/fst/compat.h.bak new file mode 100755 index 00000000000..8812a4ee689 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/compat.h.bak @@ -0,0 +1,153 @@ +// compat.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Google compatibility declarations and inline definitions. + +#ifndef FST_LIB_COMPAT_H__ +#define FST_LIB_COMPAT_H__ + +#ifdef _MSC_VER //AddedPD +#include +typedef SSIZE_T ssize_t; +#define snprintf _snprintf +#define strtoll _strtoi64 +#ifndef OPENFSTEXPORT + #ifdef _DEBUG + #ifdef _M_X64 + #pragma comment (lib, "openfst64-gd.lib") + #else + #pragma comment (lib, "openfst-gd.lib") + #endif + #else + #ifdef _M_X64 + #pragma comment (lib, "openfst64.lib") + #else + #pragma comment (lib, "openfst.lib") + #endif + #endif +#endif +#else + #include +#endif + +#include +#include +#include +#include +#include +#include + +// Makes copy constructor and operator= private +#define DISALLOW_COPY_AND_ASSIGN(type) \ + type(const type&); \ + void operator=(const type&) + +#include +#include +#include +#include +#include +#include + +using std::cin; +using std::cout; +using std::cerr; +using std::endl; +using std::string; + +void FailedNewHandler(); + +namespace fst { + +using namespace std; + +void SplitToVector(char *line, const char *delim, + std::vector *vec, bool omit_empty_strings); + +// Downcasting +template +inline To down_cast(From* f) { + return static_cast(f); +} + +// Bitcasting +template +inline Dest bit_cast(const Source& source) { + // Compile time assertion: sizeof(Dest) == sizeof(Source) + // A compile error here means your Dest and Source have different sizes. + typedef char VerifySizesAreEqual [sizeof(Dest) == sizeof(Source) ? 1 : + -1]; + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +} + +// Check sums +class CheckSummer { + public: + CheckSummer() : count_(0) { + check_sum_.resize(kCheckSumLength, '\0'); + } + + void Reset() { + count_ = 0; + for (int i = 0; i < kCheckSumLength; ++i) + check_sum_[0] = '\0'; + } + + void Update(void const *data, int size) { + const char *p = reinterpret_cast(data); + for (int i = 0; i < size; ++i) + check_sum_[(count_++) % kCheckSumLength] ^= p[i]; + } + + void Update(string const &data) { + for (int i = 0; i < data.size(); ++i) + check_sum_[(count_++) % kCheckSumLength] ^= data[i]; + } + + string Digest() { + return check_sum_; + } + + private: + static const int kCheckSumLength = 32; + int count_; + string check_sum_; + + DISALLOW_COPY_AND_ASSIGN(CheckSummer); +}; + +} // namespace fst + + +// Define missing hash functions if needed +#ifndef HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ +namespace std { +namespace tr1 { + +template class hash; + +template<> struct hash { + size_t operator()(uint64 x) const { return x; } +}; + +} +} +#endif // HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ + +#endif // FST_LIB_COMPAT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/complement.h b/extlibs/openfstwin-1.3.1/include/fst/complement.h new file mode 100755 index 00000000000..dacf396adc4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/complement.h @@ -0,0 +1,338 @@ +// complement.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to complement an Fst. + +#ifndef FST_LIB_COMPLEMENT_H__ +#define FST_LIB_COMPLEMENT_H__ + +#include +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +template class ComplementFst; + +// Implementation of delayed ComplementFst. The algorithm used +// completes the (deterministic) FSA and then exchanges final and +// non-final states. Completion, i.e. ensuring that all labels can be +// read from every state, is accomplished by using RHO labels, which +// match all labels that are otherwise not found leaving a state. The +// first state in the output is reserved to be a new state that is the +// destination of all RHO labels. Each remaining output state s +// corresponds to input state s - 1. The first arc in the output at +// these states is the rho label, the remaining arcs correspond to the +// input arcs. +template +class ComplementFstImpl : public FstImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + friend class StateIterator< ComplementFst >; + friend class ArcIterator< ComplementFst >; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + explicit ComplementFstImpl(const Fst &fst) : fst_(fst.Copy()) { + SetType("complement"); + uint64 props = fst.Properties(kILabelSorted, false); + SetProperties(ComplementProperties(props), kCopyProperties); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + ComplementFstImpl(const ComplementFstImpl &impl) + : fst_(impl.fst_->Copy()) { + SetType("complement"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~ComplementFstImpl() { delete fst_; } + + StateId Start() const { + if (Properties(kError)) + return kNoStateId; + + StateId start = fst_->Start(); + if (start != kNoStateId) + return start + 1; + else + return 0; + } + + // Exchange final and non-final states; make rho destination state final. + Weight Final(StateId s) const { + if (s == 0 || fst_->Final(s - 1) == Weight::Zero()) + return Weight::One(); + else + return Weight::Zero(); + } + + size_t NumArcs(StateId s) const { + if (s == 0) + return 1; + else + return fst_->NumArcs(s - 1) + 1; + } + + size_t NumInputEpsilons(StateId s) const { + return s == 0 ? 0 : fst_->NumInputEpsilons(s - 1); + } + + size_t NumOutputEpsilons(StateId s) const { + return s == 0 ? 0 : fst_->NumOutputEpsilons(s - 1); + } + + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + + private: + const Fst *fst_; + + void operator=(const ComplementFstImpl &fst); // Disallow +}; + + +// Complements an automaton. This is a library-internal operation that +// introduces a (negative) 'rho' label; use Difference/DifferenceFst in +// user code, which will not see this label. This version is a delayed Fst. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class ComplementFst : public ImplToFst< ComplementFstImpl > { + public: + friend class StateIterator< ComplementFst >; + friend class ArcIterator< ComplementFst >; + + using ImplToFst< ComplementFstImpl >::GetImpl; + + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef ComplementFstImpl Impl; + + explicit ComplementFst(const Fst &fst) + : ImplToFst(new Impl(fst)) { + uint64 props = kUnweighted | kNoEpsilons | kIDeterministic | kAcceptor; + if (fst.Properties(props, true) != props) { + FSTERROR() << "ComplementFst: argument not an unweighted " + << "epsilon-free deterministic acceptor"; + GetImpl()->SetProperties(kError, kError); + } + } + + // See Fst<>::Copy() for doc. + ComplementFst(const ComplementFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ComplementFst. See Fst<>::Copy() for further doc. + virtual ComplementFst *Copy(bool safe = false) const { + return new ComplementFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual inline void InitArcIterator(StateId s, + ArcIteratorData *data) const; + + // Label that represents the rho transition. + // We use a negative value, which is thus private to the library and + // which will preserve FST label sort order. + static const Label kRhoLabel = -2; + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ComplementFst &fst); // disallow +}; + +template const typename A::Label ComplementFst::kRhoLabel; + + +// Specialization for ComplementFst. +template +class StateIterator< ComplementFst > : public StateIteratorBase { + public: + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + explicit StateIterator(const ComplementFst &fst) + : siter_(*fst.GetImpl()->fst_), s_(0) { + } + + bool Done() const { return s_ > 0 && siter_.Done(); } + + StateId Value() const { return s_; } + + void Next() { + if (s_ != 0) + siter_.Next(); + ++s_; + } + + void Reset() { + siter_.Reset(); + s_ = 0; + } + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const { return Done(); } + virtual StateId Value_() const { return Value(); } + virtual void Next_() { Next(); } + virtual void Reset_() { Reset(); } + + StateIterator< Fst > siter_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ComplementFst. +template +class ArcIterator< ComplementFst > : public ArcIteratorBase { + public: + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + ArcIterator(const ComplementFst &fst, StateId s) + : aiter_(0), s_(s), pos_(0) { + if (s_ != 0) + aiter_ = new ArcIterator< Fst >(*fst.GetImpl()->fst_, s - 1); + } + + virtual ~ArcIterator() { delete aiter_; } + + bool Done() const { + if (s_ != 0) + return pos_ > 0 && aiter_->Done(); + else + return pos_ > 0; + } + + // Adds the rho label to the rho destination state. + const A& Value() const { + if (pos_ == 0) { + arc_.ilabel = arc_.olabel = ComplementFst::kRhoLabel; + arc_.weight = Weight::One(); + arc_.nextstate = 0; + } else { + arc_ = aiter_->Value(); + ++arc_.nextstate; + } + return arc_; + } + + void Next() { + if (s_ != 0 && pos_ > 0) + aiter_->Next(); + ++pos_; + } + + size_t Position() const { + return pos_; + } + + void Reset() { + if (s_ != 0) + aiter_->Reset(); + pos_ = 0; + } + + void Seek(size_t a) { + if (s_ != 0) { + if (a == 0) { + aiter_->Reset(); + } else { + aiter_->Seek(a - 1); + } + } + pos_ = a; + } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 f, uint32 m) {} + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const { return Done(); } + virtual const A& Value_() const { return Value(); } + virtual void Next_() { Next(); } + virtual size_t Position_() const { return Position(); } + virtual void Reset_() { Reset(); } + virtual void Seek_(size_t a) { Seek(a); } + uint32 Flags_() const { return Flags(); } + void SetFlags_(uint32 f, uint32 m) { SetFlags(f, m); } + + ArcIterator< Fst > *aiter_; + StateId s_; + size_t pos_; + mutable A arc_; + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline void +ComplementFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< ComplementFst >(*this); +} + +template inline void +ComplementFst::InitArcIterator(StateId s, ArcIteratorData *data) const { + data->base = new ArcIterator< ComplementFst >(*this, s); +} + + +// Useful alias when using StdArc. +typedef ComplementFst StdComplementFst; + +} // namespace fst + +#endif // FST_LIB_COMPLEMENT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/compose-filter.h b/extlibs/openfstwin-1.3.1/include/fst/compose-filter.h new file mode 100755 index 00000000000..6bf77369bfb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/compose-filter.h @@ -0,0 +1,542 @@ +// compose-filter.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes for filtering the composition matches, e.g. for correct epsilon +// handling. + +#ifndef FST_LIB_COMPOSE_FILTER_H__ +#define FST_LIB_COMPOSE_FILTER_H__ + +#include +#include // For optional argument declarations +#include + + +namespace fst { + + +// COMPOSITION FILTER STATE - this represents the state of +// the composition filter. It has the form: +// +// class FilterState { +// public: +// // Required constructors +// FilterState(); +// FilterState(const FilterState &f); +// // An invalid filter state. +// static const FilterState NoState(); +// // Maps state to integer for hashing. +// size_t Hash() const; +// // Equality of filter states. +// bool operator==(const FilterState &f) const; +// // Inequality of filter states. +// bool operator!=(const FilterState &f) const; +// // Assignment to filter states. +// FilterState& operator=(const FilterState& f); +// }; + + +// Filter state that is a signed integral type. +template +class IntegerFilterState { + public: + IntegerFilterState() : state_(kNoStateId) {} + explicit IntegerFilterState(T s) : state_(s) {} + + static const IntegerFilterState NoState() { return IntegerFilterState(); } + + size_t Hash() const { return static_cast(state_); } + + bool operator==(const IntegerFilterState &f) const { + return state_ == f.state_; + } + + bool operator!=(const IntegerFilterState &f) const { + return state_ != f.state_; + } + + T GetState() const { return state_; } + + void SetState(T state) { state_ = state; } + +private: + T state_; +}; + +typedef IntegerFilterState CharFilterState; +typedef IntegerFilterState ShortFilterState; +typedef IntegerFilterState IntFilterState; + + +// Filter state that is a weight (class). +template +class WeightFilterState { + public: + WeightFilterState() : weight_(W::Zero()) {} + explicit WeightFilterState(W w) : weight_(w) {} + + static const WeightFilterState NoState() { return WeightFilterState(); } + + size_t Hash() const { return weight_.Hash(); } + + bool operator==(const WeightFilterState &f) const { + return weight_ == f.weight_; + } + + bool operator!=(const WeightFilterState &f) const { + return weight_ != f.weight_; + } + + W GetWeight() const { return weight_; } + + void SetWeight(W w) { weight_ = w; } + +private: + W weight_; +}; + + +// Filter state that is the combination of two filter states. +template +class PairFilterState { + public: + PairFilterState() : f1_(F1::NoState()), f2_(F2::NoState()) {} + + PairFilterState(const F1 &f1, const F2 &f2) : f1_(f1), f2_(f2) {} + + static const PairFilterState NoState() { return PairFilterState(); } + + size_t Hash() const { + size_t h1 = f1_.Hash(); + size_t h2 = f2_.Hash(); + const int lshift = 5; + const int rshift = CHAR_BIT * sizeof(size_t) - 5; + return h1 << lshift ^ h1 >> rshift ^ h2; + } + + bool operator==(const PairFilterState &f) const { + return f1_ == f.f1_ && f2_ == f.f2_; + } + + bool operator!=(const PairFilterState &f) const { + return f1_ != f.f1_ || f2_ != f.f2_; + } + + const F1 &GetState1() const { return f1_; } + const F2 &GetState2() const { return f2_; } + + void SetState(const F1 &f1, const F2 &f2) { + f1_ = f1; + f2_ = f2; + } + +private: + F1 f1_; + F2 f2_; +}; + + +// COMPOSITION FILTERS - these determine which matches are allowed to +// proceed. The filter's state is represented by the type +// ComposeFilter::FilterState. The basic filters handle correct +// epsilon matching. Their interface is: +// +// template +// class ComposeFilter { +// public: +// typedef typename M1::FST1 FST1; +// typedef typename M1::FST2 FST2; +// typedef typename FST1::Arc Arc; +// typedef ... FilterState; +// typedef ... Matcher1; +// typedef ... Matcher2; +// +// // Required constructors. +// ComposeFilter(const FST1 &fst1, const FST2 &fst2, +// // M1 *matcher1 = 0, M2 *matcher2 = 0); +// // If safe=true, the copy is thread-safe. See Fst<>::Copy() +// // for further doc. +// ComposeFilter(const ComposeFilter &filter, +// // bool safe = false); +// // Return start state of filter. +// FilterState Start() const; +// // Specifies current composition state. +// void SetState(StateId s1, StateId s2, const FilterState &f); +// +// // Apply filter at current composition state to these transitions. +// // If an arc label to be matched is kNolabel, then that side +// // does not consume a symbol. Returns the new filter state or, +// // if disallowed, FilterState::NoState(). The filter is permitted to +// // modify its inputs, e.g. for optimizations. +// FilterState FilterArc(Arc *arc1, Arc *arc2) const; + +// // Apply filter at current composition state to these final weights +// // (cf. superfinal transitions). The filter may modify its inputs, +// // e.g. for optimizations. +// void FilterFinal(Weight *final1, Weight *final2) const; +// +// // Return resp matchers. Ownership stays with filter. These +// // methods allow the filter to access and possibly modify +// // the composition matchers (useful e.g. with lookahead). +// Matcher1 *GetMatcher1(); +// Matcher2 *GetMatcher2(); +// +// // This specifies how the filter affects the composition result +// // properties. It takes as argument the properties that would +// // apply with a trivial composition fitler. +// uint64 Properties(uint64 props) const; +// }; + +// This filter requires epsilons on FST1 to be read before epsilons on FST2. +template +class SequenceComposeFilter { + public: + typedef typename M1::FST FST1; + typedef typename M2::FST FST2; + typedef typename FST1::Arc Arc; + typedef CharFilterState FilterState; + typedef M1 Matcher1; + typedef M2 Matcher2; + + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + SequenceComposeFilter(const FST1 &fst1, const FST2 &fst2, + M1 *matcher1 = 0, M2 *matcher2 = 0) + : matcher1_(matcher1 ? matcher1 : new M1(fst1, MATCH_OUTPUT)), + matcher2_(matcher2 ? matcher2 : new M2(fst2, MATCH_INPUT)), + fst1_(matcher1_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + SequenceComposeFilter(const SequenceComposeFilter &filter, + bool safe = false) + : matcher1_(filter.matcher1_->Copy(safe)), + matcher2_(filter.matcher2_->Copy(safe)), + fst1_(matcher1_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + ~SequenceComposeFilter() { + delete matcher1_; + delete matcher2_; + } + + FilterState Start() const { return FilterState(0); } + + void SetState(StateId s1, StateId s2, const FilterState &f) { + if (s1_ == s1 && s2_ == s2 && f == f_) + return; + s1_ = s1; + s2_ = s2; + f_ = f; + size_t na1 = internal::NumArcs(fst1_, s1); + size_t ne1 = internal::NumOutputEpsilons(fst1_, s1); + bool fin1 = internal::Final(fst1_, s1) != Weight::Zero(); + alleps1_ = na1 == ne1 && !fin1; + noeps1_ = ne1 == 0; + } + + FilterState FilterArc(Arc *arc1, Arc *arc2) const { + if (arc1->olabel == kNoLabel) + return alleps1_ ? FilterState::NoState() : + noeps1_ ? FilterState(0) : FilterState(1); + else if (arc2->ilabel == kNoLabel) + return f_ != FilterState(0) ? FilterState::NoState() : FilterState(0); + else + return arc1->olabel == 0 ? FilterState::NoState() : FilterState(0); + } + + void FilterFinal(Weight *, Weight *) const {} + + // Return resp matchers. Ownership stays with filter. + Matcher1 *GetMatcher1() { return matcher1_; } + Matcher2 *GetMatcher2() { return matcher2_; } + + uint64 Properties(uint64 props) const { return props; } + + private: + Matcher1 *matcher1_; + Matcher2 *matcher2_; + const FST1 &fst1_; + StateId s1_; // Current fst1_ state; + StateId s2_; // Current fst2_ state; + FilterState f_; // Current filter state + bool alleps1_; // Only epsilons (and non-final) leaving s1_? + bool noeps1_; // No epsilons leaving s1_? + + void operator=(const SequenceComposeFilter &); // disallow +}; + + +// This filter requires epsilons on FST2 to be read before epsilons on FST1. +template +class AltSequenceComposeFilter { + public: + typedef typename M1::FST FST1; + typedef typename M2::FST FST2; + typedef typename FST1::Arc Arc; + typedef CharFilterState FilterState; + typedef M1 Matcher1; + typedef M2 Matcher2; + + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + AltSequenceComposeFilter(const FST1 &fst1, const FST2 &fst2, + M1 *matcher1 = 0, M2 *matcher2 = 0) + : matcher1_(matcher1 ? matcher1 : new M1(fst1, MATCH_OUTPUT)), + matcher2_(matcher2 ? matcher2 : new M2(fst2, MATCH_INPUT)), + fst2_(matcher2_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + AltSequenceComposeFilter(const AltSequenceComposeFilter &filter, + bool safe = false) + : matcher1_(filter.matcher1_->Copy(safe)), + matcher2_(filter.matcher2_->Copy(safe)), + fst2_(matcher2_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + ~AltSequenceComposeFilter() { + delete matcher1_; + delete matcher2_; + } + + FilterState Start() const { return FilterState(0); } + + void SetState(StateId s1, StateId s2, const FilterState &f) { + if (s1_ == s1 && s2_ == s2 && f == f_) + return; + s1_ = s1; + s2_ = s2; + f_ = f; + size_t na2 = internal::NumArcs(fst2_, s2); + size_t ne2 = internal::NumInputEpsilons(fst2_, s2); + bool fin2 = internal::Final(fst2_, s2) != Weight::Zero(); + alleps2_ = na2 == ne2 && !fin2; + noeps2_ = ne2 == 0; + } + + FilterState FilterArc(Arc *arc1, Arc *arc2) const { + if (arc2->ilabel == kNoLabel) + return alleps2_ ? FilterState::NoState() : + noeps2_ ? FilterState(0) : FilterState(1); + else if (arc1->olabel == kNoLabel) + return f_ == FilterState(1) ? FilterState::NoState() : FilterState(0); + else + return arc1->olabel == 0 ? FilterState::NoState() : FilterState(0); + } + + void FilterFinal(Weight *, Weight *) const {} + + // Return resp matchers. Ownership stays with filter. + Matcher1 *GetMatcher1() { return matcher1_; } + Matcher2 *GetMatcher2() { return matcher2_; } + + uint64 Properties(uint64 props) const { return props; } + + private: + Matcher1 *matcher1_; + Matcher2 *matcher2_; + const FST2 &fst2_; + StateId s1_; // Current fst1_ state; + StateId s2_; // Current fst2_ state; + FilterState f_; // Current filter state + bool alleps2_; // Only epsilons (and non-final) leaving s2_? + bool noeps2_; // No epsilons leaving s2_? + +void operator=(const AltSequenceComposeFilter &); // disallow +}; + + +// This filter requires epsilons on FST1 to be matched with epsilons on FST2 +// whenever possible. +template +class MatchComposeFilter { + public: + typedef typename M1::FST FST1; + typedef typename M2::FST FST2; + typedef typename FST1::Arc Arc; + typedef CharFilterState FilterState; + typedef M1 Matcher1; + typedef M2 Matcher2; + + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + MatchComposeFilter(const FST1 &fst1, const FST2 &fst2, + M1 *matcher1 = 0, M2 *matcher2 = 0) + : matcher1_(matcher1 ? matcher1 : new M1(fst1, MATCH_OUTPUT)), + matcher2_(matcher2 ? matcher2 : new M2(fst2, MATCH_INPUT)), + fst1_(matcher1_->GetFst()), + fst2_(matcher2_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + MatchComposeFilter(const MatchComposeFilter &filter, + bool safe = false) + : matcher1_(filter.matcher1_->Copy(safe)), + matcher2_(filter.matcher2_->Copy(safe)), + fst1_(matcher1_->GetFst()), + fst2_(matcher2_->GetFst()), + s1_(kNoStateId), + s2_(kNoStateId), + f_(kNoStateId) {} + + ~MatchComposeFilter() { + delete matcher1_; + delete matcher2_; + } + + FilterState Start() const { return FilterState(0); } + + void SetState(StateId s1, StateId s2, const FilterState &f) { + if (s1_ == s1 && s2_ == s2 && f == f_) + return; + s1_ = s1; + s2_ = s2; + f_ = f; + size_t na1 = internal::NumArcs(fst1_, s1); + size_t ne1 = internal::NumOutputEpsilons(fst1_, s1); + bool f1 = internal::Final(fst1_, s1) != Weight::Zero(); + alleps1_ = na1 == ne1 && !f1; + noeps1_ = ne1 == 0; + size_t na2 = internal::NumArcs(fst2_, s2); + size_t ne2 = internal::NumInputEpsilons(fst2_, s2); + bool f2 = internal::Final(fst2_, s2) != Weight::Zero(); + alleps2_ = na2 == ne2 && !f2; + noeps2_ = ne2 == 0; + } + + FilterState FilterArc(Arc *arc1, Arc *arc2) const { + if (arc2->ilabel == kNoLabel) // Epsilon on Fst1 + return f_ == FilterState(0) ? + (noeps2_ ? FilterState(0) : + (alleps2_ ? FilterState::NoState(): FilterState(1))) : + (f_ == FilterState(1) ? FilterState(1) : FilterState::NoState()); + else if (arc1->olabel == kNoLabel) // Epsilon on Fst2 + return f_ == FilterState(0) ? + (noeps1_ ? FilterState(0) : + (alleps1_ ? FilterState::NoState() : FilterState(2))) : + (f_ == FilterState(2) ? FilterState(2) : FilterState::NoState()); + else if (arc1->olabel == 0) // Epsilon on both + return f_ == FilterState(0) ? FilterState(0) : FilterState::NoState(); + else // Both are non-epsilons + return FilterState(0); + } + + void FilterFinal(Weight *, Weight *) const {} + + // Return resp matchers. Ownership stays with filter. + Matcher1 *GetMatcher1() { return matcher1_; } + Matcher2 *GetMatcher2() { return matcher2_; } + + uint64 Properties(uint64 props) const { return props; } + + private: + Matcher1 *matcher1_; + Matcher2 *matcher2_; + const FST1 &fst1_; + const FST2 &fst2_; + StateId s1_; // Current fst1_ state; + StateId s2_; // Current fst2_ state; + FilterState f_; // Current filter state ID + bool alleps1_, alleps2_; // Only epsilons (and non-final) leaving s1, s2? + bool noeps1_, noeps2_; // No epsilons leaving s1, s2? + + void operator=(const MatchComposeFilter &); // disallow +}; + + +// This filter works with the MultiEpsMatcher to determine if +// 'multi-epsilons' are preserved in the composition output +// (rather than rewritten as 0) and ensures correct properties. +template +class MultiEpsFilter { + public: + typedef typename F::FST1 FST1; + typedef typename F::FST2 FST2; + typedef typename F::Arc Arc; + typedef typename F::Matcher1 Matcher1; + typedef typename F::Matcher2 Matcher2; + typedef typename F::FilterState FilterState; + typedef MultiEpsFilter Filter; + + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + MultiEpsFilter(const FST1 &fst1, const FST2 &fst2, + Matcher1 *matcher1 = 0, Matcher2 *matcher2 = 0, + bool keep_multi_eps = false) + : filter_(fst1, fst2, matcher1, matcher2), + keep_multi_eps_(keep_multi_eps) {} + + MultiEpsFilter(const Filter &filter, bool safe = false) + : filter_(filter.filter_, safe), + keep_multi_eps_(filter.keep_multi_eps_) {} + + FilterState Start() const { return filter_.Start(); } + + void SetState(StateId s1, StateId s2, const FilterState &f) { + return filter_.SetState(s1, s2, f); + } + + FilterState FilterArc(Arc *arc1, Arc *arc2) const { + FilterState f = filter_.FilterArc(arc1, arc2); + if (keep_multi_eps_) { + if (arc1->olabel == kNoLabel) + arc1->ilabel = arc2->ilabel; + if (arc2->ilabel == kNoLabel) + arc2->olabel = arc1->olabel; + } + return f; + } + + void FilterFinal(Weight *w1, Weight *w2) const { + return filter_.FilterFinal(w1, w2); + } + + // Return resp matchers. Ownership stays with filter. + Matcher1 *GetMatcher1() { return filter_.GetMatcher1(); } + Matcher2 *GetMatcher2() { return filter_.GetMatcher2(); } + + uint64 Properties(uint64 iprops) const { + uint64 oprops = filter_.Properties(iprops); + return oprops & kILabelInvariantProperties & kOLabelInvariantProperties; + } + + private: + F filter_; + bool keep_multi_eps_; +}; + +} // namespace fst + + +#endif // FST_LIB_COMPOSE_FILTER_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/compose.h b/extlibs/openfstwin-1.3.1/include/fst/compose.h new file mode 100755 index 00000000000..c0bf4b1bd29 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/compose.h @@ -0,0 +1,673 @@ +// compose.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to compute the composition of two FSTs + +#ifndef FST_LIB_COMPOSE_H__ +#define FST_LIB_COMPOSE_H__ + +#include +#include +#include +using std::vector; + +#include +#include +#include +#include +#include +#include + + +namespace fst { + +// Delayed composition options templated on the arc type, the matcher, +// the composition filter, and the composition state table. By +// default, the matchers, filter, and state table are constructed by +// composition. If set below, the user can instead pass in these +// objects; in that case, ComposeFst takes their ownership. This +// version controls composition implemented between generic Fst +// types and a shared matcher type M for Fst. This should be +// adequate for most applications, giving a reasonable tradeoff +// between efficiency and code sharing (but see ComposeFstImplOptions). +template >, + class F = SequenceComposeFilter, + class T = GenericComposeStateTable > +struct ComposeFstOptions : public CacheOptions { + M *matcher1; // FST1 matcher (see matcher.h) + M *matcher2; // FST2 matcher + F *filter; // Composition filter (see compose-filter.h) + T *state_table; // Composition state table (see compose-state-table.h) + + explicit ComposeFstOptions(const CacheOptions &opts, + M *mat1 = 0, M *mat2 = 0, + F *filt = 0, T *sttable= 0) + : CacheOptions(opts), matcher1(mat1), matcher2(mat2), + filter(filt), state_table(sttable) {} + + ComposeFstOptions() : matcher1(0), matcher2(0), filter(0), state_table(0) {} +}; + + +// Delayed composition options templated on the two matcher types, the +// composition filter, and the composition state table. By default, +// the matchers, filter, and state table are constructed by +// composition. If set below, the user can instead pass in these +// objects; in that case, ComposeFst takes their ownership. This +// version controls composition implemented using arbitrary matchers +// (of the same Arc type but otherwise arbitrary Fst type). The user +// must ensure the matchers are compatible. These options permit the +// most efficient use, but shares the least code. This is for advanced +// use only in the most demanding or specialized applications that can +// benefit from it (o.w. prefer ComposeFstOptions). +template , + class T = GenericComposeStateTable > +struct ComposeFstImplOptions : public CacheOptions { + M1 *matcher1; // FST1 matcher (see matcher.h) + M2 *matcher2; // FST2 matcher + F *filter; // Composition filter (see compose-filter.h) + T *state_table; // Composition state table (see compose-state-table.h) + + explicit ComposeFstImplOptions(const CacheOptions &opts, + M1 *mat1 = 0, M2 *mat2 = 0, + F *filt = 0, T *sttable= 0) + : CacheOptions(opts), matcher1(mat1), matcher2(mat2), + filter(filt), state_table(sttable) {} + + ComposeFstImplOptions() + : matcher1(0), matcher2(0), filter(0), state_table(0) {} +}; + + +// Implementation of delayed composition. This base class is +// common to the variants with different matchers, composition filters +// and state tables. +template +class ComposeFstImplBase : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + ComposeFstImplBase(const Fst &fst1, const Fst &fst2, + const CacheOptions &opts) + :CacheImpl(opts) { + VLOG(2) << "ComposeFst(" << this << "): Begin"; + SetType("compose"); + + if (!CompatSymbols(fst2.InputSymbols(), fst1.OutputSymbols())) { + FSTERROR() << "ComposeFst: output symbol table of 1st argument " + << "does not match input symbol table of 2nd argument"; + SetProperties(kError, kError); + } + + SetInputSymbols(fst1.InputSymbols()); + SetOutputSymbols(fst2.OutputSymbols()); + } + + ComposeFstImplBase(const ComposeFstImplBase &impl) + : CacheImpl(impl) { + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + virtual ComposeFstImplBase *Copy() = 0; + + virtual ~ComposeFstImplBase() {} + + StateId Start() { + if (!HasStart()) { + StateId start = ComputeStart(); + if (start != kNoStateId) { + SetStart(start); + } + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Weight final = ComputeFinal(s); + SetFinal(s, final); + } + return CacheImpl::Final(s); + } + + virtual void Expand(StateId s) = 0; + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + protected: + virtual StateId ComputeStart() = 0; + virtual Weight ComputeFinal(StateId s) = 0; +}; + + +// Implementaion of delayed composition templated on the matchers (see +// matcher.h), composition filter (see compose-filter-inl.h) and +// the composition state table (see compose-state-table.h). +template +class ComposeFstImpl : public ComposeFstImplBase { + typedef typename M1::FST FST1; + typedef typename M2::FST FST2; + typedef typename M1::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef typename F::FilterState FilterState; + typedef typename F::Matcher1 Matcher1; + typedef typename F::Matcher2 Matcher2; + + using CacheBaseImpl >::SetArcs; + using FstImpl::SetType; + using FstImpl::SetProperties; + + typedef ComposeStateTuple StateTuple; + + public: + ComposeFstImpl(const FST1 &fst1, const FST2 &fst2, + const ComposeFstImplOptions &opts); + + ComposeFstImpl(const ComposeFstImpl &impl) + : ComposeFstImplBase(impl), + filter_(new F(*impl.filter_, true)), + matcher1_(filter_->GetMatcher1()), + matcher2_(filter_->GetMatcher2()), + fst1_(matcher1_->GetFst()), + fst2_(matcher2_->GetFst()), + state_table_(new T(*impl.state_table_)), + match_type_(impl.match_type_) {} + + ~ComposeFstImpl() { + VLOG(2) << "ComposeFst(" << this + << "): End: # of visited states: " << state_table_->Size(); + + delete filter_; + delete state_table_; + } + + virtual ComposeFstImpl *Copy() { + return new ComposeFstImpl(*this); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && + (fst1_.Properties(kError, false) || + fst2_.Properties(kError, false) || + (matcher1_->Properties(0) & kError) || + (matcher2_->Properties(0) & kError) | + (filter_->Properties(0) & kError) || + state_table_->Error())) { + SetProperties(kError, kError); + } + return FstImpl::Properties(mask); + } + + // Arranges it so that the first arg to OrderedExpand is the Fst + // that will be matched on. + void Expand(StateId s) { + const StateTuple &tuple = state_table_->Tuple(s); + StateId s1 = tuple.state_id1; + StateId s2 = tuple.state_id2; + filter_->SetState(s1, s2, tuple.filter_state); + if (match_type_ == MATCH_OUTPUT || + (match_type_ == MATCH_BOTH && + internal::NumArcs(fst1_, s1) > internal::NumArcs(fst2_, s2))) + OrderedExpand(s, fst1_, s1, fst2_, s2, matcher1_, false); + else + OrderedExpand(s, fst2_, s2, fst1_, s1, matcher2_, true); + } + + private: + // This does that actual matching of labels in the composition. The + // arguments are ordered so matching is called on state 'sa' of + // 'fsta' for each arc leaving state 'sb' of 'fstb'. The 'match_input' arg + // determines whether the input or output label of arcs at 'sb' is + // the one to match on. + template + void OrderedExpand(StateId s, const Fst &, StateId sa, + const FST &fstb, StateId sb, + Matcher *matchera, bool match_input) { + matchera->SetState(sa); + + // First process non-consuming symbols (e.g., epsilons) on FSTA. + Arc loop(match_input ? 0 : kNoLabel, match_input ? kNoLabel : 0, + Weight::One(), sb); + MatchArc(s, matchera, loop, match_input); + + // Then process matches on FSTB. + for (ArcIterator iterb(fstb, sb); !iterb.Done(); iterb.Next()) + MatchArc(s, matchera, iterb.Value(), match_input); + + SetArcs(s); + } + + // Matches a single transition from 'fstb' against 'fata' at 's'. + template + void MatchArc(StateId s, Matcher *matchera, + const Arc &arc, bool match_input) { + if (matchera->Find(match_input ? arc.olabel : arc.ilabel)) { + for (; !matchera->Done(); matchera->Next()) { + Arc arca = matchera->Value(); + Arc arcb = arc; + if (match_input) { + const FilterState &f = filter_->FilterArc(&arcb, &arca); + if (f != FilterState::NoState()) + AddArc(s, arcb, arca, f); + } else { + const FilterState &f = filter_->FilterArc(&arca, &arcb); + if (f != FilterState::NoState()) + AddArc(s, arca, arcb, f); + } + } + } + } + + // Add a matching transition at 's'. + void AddArc(StateId s, const Arc &arc1, const Arc &arc2, + const FilterState &f) { + StateTuple tuple(arc1.nextstate, arc2.nextstate, f); + Arc oarc(arc1.ilabel, arc2.olabel, Times(arc1.weight, arc2.weight), + state_table_->FindState(tuple)); + CacheImpl::PushArc(s, oarc); + } + + StateId ComputeStart() { + StateId s1 = fst1_.Start(); + if (s1 == kNoStateId) + return kNoStateId; + + StateId s2 = fst2_.Start(); + if (s2 == kNoStateId) + return kNoStateId; + + const FilterState &f = filter_->Start(); + StateTuple tuple(s1, s2, f); + return state_table_->FindState(tuple); + } + + Weight ComputeFinal(StateId s) { + const StateTuple &tuple = state_table_->Tuple(s); + StateId s1 = tuple.state_id1; + Weight final1 = internal::Final(fst1_, s1); + if (final1 == Weight::Zero()) + return final1; + + StateId s2 = tuple.state_id2; + Weight final2 = internal::Final(fst2_, s2); + if (final2 == Weight::Zero()) + return final2; + + filter_->SetState(s1, s2, tuple.filter_state); + filter_->FilterFinal(&final1, &final2); + return Times(final1, final2); + } + + F *filter_; + Matcher1 *matcher1_; + Matcher2 *matcher2_; + const FST1 &fst1_; + const FST2 &fst2_; + T *state_table_; + + MatchType match_type_; + + void operator=(const ComposeFstImpl &); // disallow +}; + +template inline +ComposeFstImpl::ComposeFstImpl( + const FST1 &fst1, const FST2 &fst2, + const ComposeFstImplOptions &opts) + : ComposeFstImplBase(fst1, fst2, opts), + filter_(opts.filter ? opts.filter : + new F(fst1, fst2, opts.matcher1, opts.matcher2)), + matcher1_(filter_->GetMatcher1()), + matcher2_(filter_->GetMatcher2()), + fst1_(matcher1_->GetFst()), + fst2_(matcher2_->GetFst()), + state_table_(opts.state_table ? opts.state_table : + new T(fst1_, fst2_)) { + MatchType type1 = matcher1_->Type(false); + MatchType type2 = matcher2_->Type(false); + if (type1 == MATCH_OUTPUT && type2 == MATCH_INPUT) { + match_type_ = MATCH_BOTH; + } else if (type1 == MATCH_OUTPUT) { + match_type_ = MATCH_OUTPUT; + } else if (type2 == MATCH_INPUT) { + match_type_ = MATCH_INPUT; + } else if (matcher1_->Type(true) == MATCH_OUTPUT) { + match_type_ = MATCH_OUTPUT; + } else if (matcher2_->Type(true) == MATCH_INPUT) { + match_type_ = MATCH_INPUT; + } else { + FSTERROR() << "ComposeFst: 1st argument cannot match on output labels " + << "and 2nd argument cannot match on input labels (sort?)."; + SetProperties(kError, kError); + } + uint64 fprops1 = fst1.Properties(kFstProperties, false); + uint64 fprops2 = fst2.Properties(kFstProperties, false); + uint64 mprops1 = matcher1_->Properties(fprops1); + uint64 mprops2 = matcher2_->Properties(fprops2); + uint64 cprops = ComposeProperties(mprops1, mprops2); + SetProperties(filter_->Properties(cprops), kCopyProperties); + if (state_table_->Error()) SetProperties(kError, kError); + VLOG(2) << "ComposeFst(" << this << "): Initialized"; +} + + +// Computes the composition of two transducers. This version is a +// delayed Fst. If FST1 transduces string x to y with weight a and FST2 +// transduces y to z with weight b, then their composition transduces +// string x to z with weight Times(x, z). +// +// The output labels of the first transducer or the input labels of +// the second transducer must be sorted (with the default matcher). +// The weights need to form a commutative semiring (valid for +// TropicalWeight and LogWeight). +// +// Complexity: +// Assuming the first FST is unsorted and the second is sorted: +// - Time: O(v1 v2 d1 (log d2 + m2)), +// - Space: O(v1 v2) +// where vi = # of states visited, di = maximum out-degree, and mi the +// maximum multiplicity of the states visited for the ith +// FST. Constant time and space to visit an input state or arc is +// assumed and exclusive of caching. +// +// Caveats: +// - ComposeFst does not trim its output (since it is a delayed operation). +// - The efficiency of composition can be strongly affected by several factors: +// - the choice of which tnansducer is sorted - prefer sorting the FST +// that has the greater average out-degree. +// - the amount of non-determinism +// - the presence and location of epsilon transitions - avoid epsilon +// transitions on the output side of the first transducer or +// the input side of the second transducer or prefer placing +// them later in a path since they delay matching and can +// introduce non-coaccessible states and transitions. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class ComposeFst : public ImplToFst< ComposeFstImplBase > { + public: + friend class ArcIterator< ComposeFst >; + friend class StateIterator< ComposeFst >; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef ComposeFstImplBase Impl; + + using ImplToFst::SetImpl; + + // Compose specifying only caching options. + ComposeFst(const Fst &fst1, const Fst &fst2, + const CacheOptions &opts = CacheOptions()) + : ImplToFst(CreateBase(fst1, fst2, opts)) {} + + // Compose specifying one shared matcher type M. Requires input + // Fsts and matcher FST type (M::FST) be Fst. Recommended for + // best code-sharing and matcher compatiblity. + template + ComposeFst(const Fst &fst1, const Fst &fst2, + const ComposeFstOptions &opts) + : ImplToFst(CreateBase1(fst1, fst2, opts)) {} + + // Compose specifying two matcher types M1 and M2. Requires input + // Fsts (of the same Arc type but o.w. arbitrary) match the + // corresponding matcher FST types (M1::FST, M2::FST). Recommended + // only for advanced use in demanding or specialized applications + // due to potential code bloat and matcher incompatibilities. + template + ComposeFst(const typename M1::FST &fst1, const typename M2::FST &fst2, + const ComposeFstImplOptions &opts) + : ImplToFst(CreateBase2(fst1, fst2, opts)) {} + + // See Fst<>::Copy() for doc. + ComposeFst(const ComposeFst &fst, bool safe = false) { + if (safe) + SetImpl(fst.GetImpl()->Copy()); + else + SetImpl(fst.GetImpl(), false); + } + + // Get a copy of this ComposeFst. See Fst<>::Copy() for further doc. + virtual ComposeFst *Copy(bool safe = false) const { + return new ComposeFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + protected: + ComposeFst() {} + + // Create compose implementation specifying two matcher types. + template + static Impl *CreateBase2( + const typename M1::FST &fst1, const typename M2::FST &fst2, + const ComposeFstImplOptions &opts) { + Impl *impl = new ComposeFstImpl(fst1, fst2, opts); + if (!(Weight::Properties() & kCommutative)) { + int64 props1 = fst1.Properties(kUnweighted, true); + int64 props2 = fst2.Properties(kUnweighted, true); + if (!(props1 & kUnweighted) && !(props2 & kUnweighted)) { + FSTERROR() << "ComposeFst: Weights must be a commutative semiring: " + << Weight::Type(); + impl->SetProperties(kError, kError); + } + } + return impl; + } + + // Create compose implementation specifying one matcher type. + // Requires input Fsts and matcher FST type (M::FST) be Fst + template + static Impl *CreateBase1(const Fst &fst1, const Fst &fst2, + const ComposeFstOptions &opts) { + ComposeFstImplOptions nopts(opts, opts.matcher1, opts.matcher2, + opts.filter, opts.state_table); + return CreateBase2(fst1, fst2, nopts); + } + + // Create compose implementation specifying no matcher type. + static Impl *CreateBase(const Fst &fst1, const Fst &fst2, + const CacheOptions &opts) { + switch (LookAheadMatchType(fst1, fst2)) { // Check for lookahead matchers + default: + case MATCH_NONE: { // Default composition (no look-ahead) + ComposeFstOptions nopts(opts); + return CreateBase1(fst1, fst2, nopts); + } + case MATCH_OUTPUT: { // Lookahead on fst1 + typedef typename DefaultLookAhead::FstMatcher M; + typedef typename DefaultLookAhead::ComposeFilter F; + ComposeFstOptions nopts(opts); + return CreateBase1(fst1, fst2, nopts); + } + case MATCH_INPUT: { // Lookahead on fst2 + typedef typename DefaultLookAhead::FstMatcher M; + typedef typename DefaultLookAhead::ComposeFilter F; + ComposeFstOptions nopts(opts); + return CreateBase1(fst1, fst2, nopts); + } + } + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ComposeFst &fst); // disallow +}; + + +// Specialization for ComposeFst. +template +class StateIterator< ComposeFst > + : public CacheStateIterator< ComposeFst > { + public: + explicit StateIterator(const ComposeFst &fst) + : CacheStateIterator< ComposeFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for ComposeFst. +template +class ArcIterator< ComposeFst > + : public CacheArcIterator< ComposeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ComposeFst &fst, StateId s) + : CacheArcIterator< ComposeFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void ComposeFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< ComposeFst >(*this); +} + +// Useful alias when using StdArc. +typedef ComposeFst StdComposeFst; + +enum ComposeFilter { AUTO_FILTER, SEQUENCE_FILTER, ALT_SEQUENCE_FILTER, + MATCH_FILTER }; + +struct ComposeOptions { + bool connect; // Connect output + ComposeFilter filter_type; // Which pre-defined filter to use + + ComposeOptions(bool c, ComposeFilter ft = AUTO_FILTER) + : connect(c), filter_type(ft) {} + ComposeOptions() : connect(true), filter_type(AUTO_FILTER) {} +}; + +// Computes the composition of two transducers. This version writes +// the composed FST into a MurableFst. If FST1 transduces string x to +// y with weight a and FST2 transduces y to z with weight b, then +// their composition transduces string x to z with weight +// Times(x, z). +// +// The output labels of the first transducer or the input labels of +// the second transducer must be sorted. The weights need to form a +// commutative semiring (valid for TropicalWeight and LogWeight). +// +// Complexity: +// Assuming the first FST is unsorted and the second is sorted: +// - Time: O(V1 V2 D1 (log D2 + M2)), +// - Space: O(V1 V2 D1 M2) +// where Vi = # of states, Di = maximum out-degree, and Mi is +// the maximum multiplicity for the ith FST. +// +// Caveats: +// - Compose trims its output. +// - The efficiency of composition can be strongly affected by several factors: +// - the choice of which tnansducer is sorted - prefer sorting the FST +// that has the greater average out-degree. +// - the amount of non-determinism +// - the presence and location of epsilon transitions - avoid epsilon +// transitions on the output side of the first transducer or +// the input side of the second transducer or prefer placing +// them later in a path since they delay matching and can +// introduce non-coaccessible states and transitions. +template +void Compose(const Fst &ifst1, const Fst &ifst2, + MutableFst *ofst, + const ComposeOptions &opts = ComposeOptions()) { + typedef Matcher< Fst > M; + + if (opts.filter_type == AUTO_FILTER) { + CacheOptions nopts; + nopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ComposeFst(ifst1, ifst2, nopts); + } else if (opts.filter_type == SEQUENCE_FILTER) { + ComposeFstOptions copts; + copts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ComposeFst(ifst1, ifst2, copts); + } else if (opts.filter_type == ALT_SEQUENCE_FILTER) { + ComposeFstOptions > copts; + copts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ComposeFst(ifst1, ifst2, copts); + } else if (opts.filter_type == MATCH_FILTER) { + ComposeFstOptions > copts; + copts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ComposeFst(ifst1, ifst2, copts); + } + + if (opts.connect) + Connect(ofst); +} + +} // namespace fst + +#endif // FST_LIB_COMPOSE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/concat.h b/extlibs/openfstwin-1.3.1/include/fst/concat.h new file mode 100755 index 00000000000..3deb90038f8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/concat.h @@ -0,0 +1,245 @@ +// concat.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to compute the concat of two FSTs. + +#ifndef FST_LIB_CONCAT_H__ +#define FST_LIB_CONCAT_H__ + +#include +using std::vector; +#include + +#include +#include + + +namespace fst { + +// Computes the concatenation (product) of two FSTs. If FST1 +// transduces string x to y with weight a and FST2 transduces string w +// to v with weight b, then their concatenation transduces string xw +// to yv with Times(a, b). +// +// This version modifies its MutableFst argument (in first position). +// +// Complexity: +// - Time: O(V1 + V2 + E2) +// - Space: O(V1 + V2 + E2) +// where Vi = # of states and Ei = # of arcs of the ith FST. +// +template +void Concat(MutableFst *fst1, const Fst &fst2) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + // Check that the symbol tables are compatible + if (!CompatSymbols(fst1->InputSymbols(), fst2.InputSymbols()) || + !CompatSymbols(fst1->OutputSymbols(), fst2.OutputSymbols())) { + FSTERROR() << "Concat: input/output symbol tables of 1st argument " + << "do not match input/output symbol tables of 2nd argument"; + fst1->SetProperties(kError, kError); + return; + } + + uint64 props1 = fst1->Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + + StateId start1 = fst1->Start(); + if (start1 == kNoStateId) { + if (props2 & kError) fst1->SetProperties(kError, kError); + return; + } + + StateId numstates1 = fst1->NumStates(); + if (fst2.Properties(kExpanded, false)) + fst1->ReserveStates(numstates1 + CountStates(fst2)); + + for (StateIterator< Fst > siter2(fst2); + !siter2.Done(); + siter2.Next()) { + StateId s1 = fst1->AddState(); + StateId s2 = siter2.Value(); + fst1->SetFinal(s1, fst2.Final(s2)); + fst1->ReserveArcs(s1, fst2.NumArcs(s2)); + for (ArcIterator< Fst > aiter(fst2, s2); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + arc.nextstate += numstates1; + fst1->AddArc(s1, arc); + } + } + + StateId start2 = fst2.Start(); + for (StateId s1 = 0; s1 < numstates1; ++s1) { + Weight final = fst1->Final(s1); + if (final != Weight::Zero()) { + fst1->SetFinal(s1, Weight::Zero()); + if (start2 != kNoStateId) + fst1->AddArc(s1, Arc(0, 0, final, start2 + numstates1)); + } + } + if (start2 != kNoStateId) + fst1->SetProperties(ConcatProperties(props1, props2), kFstProperties); +} + +// Computes the concatentation of two FSTs. This version modifies its +// MutableFst argument (in second position). +// +// Complexity: +// - Time: O(V1 + E1) +// - Space: O(V1 + E1) +// where Vi = # of states and Ei = # of arcs of the ith FST. +// +template +void Concat(const Fst &fst1, MutableFst *fst2) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + // Check that the symbol tables are compatible + if (!CompatSymbols(fst1.InputSymbols(), fst2->InputSymbols()) || + !CompatSymbols(fst1.OutputSymbols(), fst2->OutputSymbols())) { + FSTERROR() << "Concat: input/output symbol tables of 1st argument " + << "do not match input/output symbol tables of 2nd argument"; + fst2->SetProperties(kError, kError); + return; + } + + uint64 props1 = fst1.Properties(kFstProperties, false); + uint64 props2 = fst2->Properties(kFstProperties, false); + + StateId start2 = fst2->Start(); + if (start2 == kNoStateId) { + if (props1 & kError) fst2->SetProperties(kError, kError); + return; + } + + StateId numstates2 = fst2->NumStates(); + if (fst1.Properties(kExpanded, false)) + fst2->ReserveStates(numstates2 + CountStates(fst1)); + + for (StateIterator< Fst > siter(fst1); + !siter.Done(); + siter.Next()) { + StateId s1 = siter.Value(); + StateId s2 = fst2->AddState(); + Weight final = fst1.Final(s1); + fst2->ReserveArcs(s2, fst1.NumArcs(s1) + (final != Weight::Zero() ? 1 : 0)); + if (final != Weight::Zero()) + fst2->AddArc(s2, Arc(0, 0, final, start2)); + for (ArcIterator< Fst > aiter(fst1, s1); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + arc.nextstate += numstates2; + fst2->AddArc(s2, arc); + } + } + StateId start1 = fst1.Start(); + fst2->SetStart(start1 == kNoStateId ? fst2->AddState() : start1 + numstates2); + if (start1 != kNoStateId) + fst2->SetProperties(ConcatProperties(props1, props2), kFstProperties); +} + + +// Computes the concatentation of two FSTs. This version modifies its +// RationalFst input (in first position). +template +void Concat(RationalFst *fst1, const Fst &fst2) { + fst1->GetImpl()->AddConcat(fst2, true); +} + +// Computes the concatentation of two FSTs. This version modifies its +// RationalFst input (in second position). +template +void Concat(const Fst &fst1, RationalFst *fst2) { + fst2->GetImpl()->AddConcat(fst1, false); +} + +typedef RationalFstOptions ConcatFstOptions; + + +// Computes the concatenation (product) of two FSTs; this version is a +// delayed Fst. If FST1 transduces string x to y with weight a and FST2 +// transduces string w to v with weight b, then their concatenation +// transduces string xw to yv with Times(a, b). +// +// Complexity: +// - Time: O(v1 + e1 + v2 + e2), +// - Space: O(v1 + v2) +// where vi = # of states visited and ei = # of arcs visited of the +// ith FST. Constant time and space to visit an input state or arc is +// assumed and exclusive of caching. +template +class ConcatFst : public RationalFst { + public: + using ImplToFst< RationalFstImpl >::GetImpl; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + ConcatFst(const Fst &fst1, const Fst &fst2) { + GetImpl()->InitConcat(fst1, fst2); + } + + ConcatFst(const Fst &fst1, const Fst &fst2, + const ConcatFstOptions &opts) : RationalFst(opts) { + GetImpl()->InitConcat(fst1, fst2); + } + + // See Fst<>::Copy() for doc. + ConcatFst(const ConcatFst &fst, bool safe = false) + : RationalFst(fst, safe) {} + + // Get a copy of this ConcatFst. See Fst<>::Copy() for further doc. + virtual ConcatFst *Copy(bool safe = false) const { + return new ConcatFst(*this, safe); + } +}; + + +// Specialization for ConcatFst. +template +class StateIterator< ConcatFst > : public StateIterator< RationalFst > { + public: + explicit StateIterator(const ConcatFst &fst) + : StateIterator< RationalFst >(fst) {} +}; + + +// Specialization for ConcatFst. +template +class ArcIterator< ConcatFst > : public ArcIterator< RationalFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ConcatFst &fst, StateId s) + : ArcIterator< RationalFst >(fst, s) {} +}; + + +// Useful alias when using StdArc. +typedef ConcatFst StdConcatFst; + +} // namespace fst + +#endif // FST_LIB_CONCAT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/config.h b/extlibs/openfstwin-1.3.1/include/fst/config.h new file mode 100755 index 00000000000..f1fb9595973 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/config.h @@ -0,0 +1,5 @@ +#ifdef _MSC_VER + #pragma warning(disable:4018 4244 4996 4099 4503 4800 4305 4355 4396 4715 4180 4244 4224 4267) + #define HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 1 + #define WIN32_LEAN_AND_MEAN +#endif diff --git a/extlibs/openfstwin-1.3.1/include/fst/config.h.bak b/extlibs/openfstwin-1.3.1/include/fst/config.h.bak new file mode 100755 index 00000000000..046b49c8c3b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/config.h.bak @@ -0,0 +1,12 @@ +/* src/include/fst/config.h. Generated from config.h.in by configure. */ +// OpenFst config file + +/* Define to 1 if you have the ICU library. */ +/* #undef HAVE_ICU */ + +/* Define to 1 if the system has the type `std::tr1::hash'. */ +#define HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 1 + +/* Define to 1 if the system has the type `__gnu_cxx::slist'. */ +#define HAVE___GNU_CXX__SLIST_INT_ 1 diff --git a/extlibs/openfstwin-1.3.1/include/fst/config.h.in b/extlibs/openfstwin-1.3.1/include/fst/config.h.in new file mode 100755 index 00000000000..7815dfcdf8a --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/config.h.in @@ -0,0 +1,11 @@ +// OpenFst config file + +/* Define to 1 if you have the ICU library. */ +#undef HAVE_ICU + +/* Define to 1 if the system has the type `std::tr1::hash'. */ +#define HAVE_STD__TR1__HASH_LONG_LONG_UNSIGNED_ 1 + +/* Define to 1 if the system has the type `__gnu_cxx::slist'. */ +#define HAVE___GNU_CXX__SLIST_INT_ 1 diff --git a/extlibs/openfstwin-1.3.1/include/fst/connect.h b/extlibs/openfstwin-1.3.1/include/fst/connect.h new file mode 100755 index 00000000000..427808c9404 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/connect.h @@ -0,0 +1,319 @@ +// connect.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes and functions to remove unsuccessful paths from an Fst. + +#ifndef FST_LIB_CONNECT_H__ +#define FST_LIB_CONNECT_H__ + +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +// Finds and returns connected components. Use with Visit(). +template +class CcVisitor { + public: + typedef A Arc; + typedef typename Arc::Weight Weight; + typedef typename A::StateId StateId; + + // cc[i]: connected component number for state i. + CcVisitor(vector *cc) + : comps_(new UnionFind(0, kNoStateId)), + cc_(cc), + nstates_(0) { } + + // comps: connected components equiv classes. + CcVisitor(UnionFind *comps) + : comps_(comps), + cc_(0), + nstates_(0) { } + + ~CcVisitor() { + if (cc_) // own comps_? + delete comps_; + } + + void InitVisit(const Fst &fst) { } + + bool InitState(StateId s, StateId root) { + ++nstates_; + if (comps_->FindSet(s) == kNoStateId) + comps_->MakeSet(s); + return true; + } + + bool WhiteArc(StateId s, const A &arc) { + comps_->MakeSet(arc.nextstate); + comps_->Union(s, arc.nextstate); + return true; + } + + bool GreyArc(StateId s, const A &arc) { + comps_->Union(s, arc.nextstate); + return true; + } + + bool BlackArc(StateId s, const A &arc) { + comps_->Union(s, arc.nextstate); + return true; + } + + void FinishState(StateId s) { } + + void FinishVisit() { + if (cc_) + GetCcVector(cc_); + } + + // cc[i]: connected component number for state i. + // Returns number of components. + int GetCcVector(vector *cc) { + cc->clear(); + cc->resize(nstates_, kNoStateId); + StateId ncomp = 0; + for (StateId i = 0; i < nstates_; ++i) { + StateId rep = comps_->FindSet(i); + StateId &comp = (*cc)[rep]; + if (comp == kNoStateId) { + comp = ncomp; + ++ncomp; + } + (*cc)[i] = comp; + } + return ncomp; + } + + private: + UnionFind *comps_; // Components + vector *cc_; // State's cc number + StateId nstates_; // State count +}; + + +// Finds and returns strongly-connected components, accessible and +// coaccessible states and related properties. Uses Tarjan's single +// DFS SCC algorithm (see Aho, et al, "Design and Analysis of Computer +// Algorithms", 189pp). Use with DfsVisit(); +template +class SccVisitor { + public: + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + // scc[i]: strongly-connected component number for state i. + // SCC numbers will be in topological order for acyclic input. + // access[i]: accessibility of state i. + // coaccess[i]: coaccessibility of state i. + // Any of above can be NULL. + // props: related property bits (cyclicity, initial cyclicity, + // accessibility, coaccessibility) set/cleared (o.w. unchanged). + SccVisitor(vector *scc, vector *access, + vector *coaccess, uint64 *props) + : scc_(scc), access_(access), coaccess_(coaccess), props_(props) {} + SccVisitor(uint64 *props) + : scc_(0), access_(0), coaccess_(0), props_(props) {} + + void InitVisit(const Fst &fst); + + bool InitState(StateId s, StateId root); + + bool TreeArc(StateId s, const A &arc) { return true; } + + bool BackArc(StateId s, const A &arc) { + StateId t = arc.nextstate; + if ((*dfnumber_)[t] < (*lowlink_)[s]) + (*lowlink_)[s] = (*dfnumber_)[t]; + if ((*coaccess_)[t]) + (*coaccess_)[s] = true; + *props_ |= kCyclic; + *props_ &= ~kAcyclic; + if (arc.nextstate == start_) { + *props_ |= kInitialCyclic; + *props_ &= ~kInitialAcyclic; + } + return true; + } + + bool ForwardOrCrossArc(StateId s, const A &arc) { + StateId t = arc.nextstate; + if ((*dfnumber_)[t] < (*dfnumber_)[s] /* cross edge */ && + (*onstack_)[t] && (*dfnumber_)[t] < (*lowlink_)[s]) + (*lowlink_)[s] = (*dfnumber_)[t]; + if ((*coaccess_)[t]) + (*coaccess_)[s] = true; + return true; + } + + void FinishState(StateId s, StateId p, const A *); + + void FinishVisit() { + // Numbers SCC's in topological order when acyclic. + if (scc_) + for (StateId i = 0; i < scc_->size(); ++i) + (*scc_)[i] = nscc_ - 1 - (*scc_)[i]; + if (coaccess_internal_) + delete coaccess_; + delete dfnumber_; + delete lowlink_; + delete onstack_; + delete scc_stack_; + } + + private: + vector *scc_; // State's scc number + vector *access_; // State's accessibility + vector *coaccess_; // State's coaccessibility + uint64 *props_; + const Fst *fst_; + StateId start_; + StateId nstates_; // State count + StateId nscc_; // SCC count + bool coaccess_internal_; + vector *dfnumber_; // state discovery times + vector *lowlink_; // lowlink[s] == dfnumber[s] => SCC root + vector *onstack_; // is a state on the SCC stack + vector *scc_stack_; // SCC stack (w/ random access) +}; + +template inline +void SccVisitor::InitVisit(const Fst &fst) { + if (scc_) + scc_->clear(); + if (access_) + access_->clear(); + if (coaccess_) { + coaccess_->clear(); + coaccess_internal_ = false; + } else { + coaccess_ = new vector; + coaccess_internal_ = true; + } + *props_ |= kAcyclic | kInitialAcyclic | kAccessible | kCoAccessible; + *props_ &= ~(kCyclic | kInitialCyclic | kNotAccessible | kNotCoAccessible); + fst_ = &fst; + start_ = fst.Start(); + nstates_ = 0; + nscc_ = 0; + dfnumber_ = new vector; + lowlink_ = new vector; + onstack_ = new vector; + scc_stack_ = new vector; +} + +template inline +bool SccVisitor::InitState(StateId s, StateId root) { + scc_stack_->push_back(s); + while (dfnumber_->size() <= s) { + if (scc_) + scc_->push_back(-1); + if (access_) + access_->push_back(false); + coaccess_->push_back(false); + dfnumber_->push_back(-1); + lowlink_->push_back(-1); + onstack_->push_back(false); + } + (*dfnumber_)[s] = nstates_; + (*lowlink_)[s] = nstates_; + (*onstack_)[s] = true; + if (root == start_) { + if (access_) + (*access_)[s] = true; + } else { + if (access_) + (*access_)[s] = false; + *props_ |= kNotAccessible; + *props_ &= ~kAccessible; + } + ++nstates_; + return true; +} + +template inline +void SccVisitor::FinishState(StateId s, StateId p, const A *) { + if (fst_->Final(s) != Weight::Zero()) + (*coaccess_)[s] = true; + if ((*dfnumber_)[s] == (*lowlink_)[s]) { // root of new SCC + bool scc_coaccess = false; + size_t i = scc_stack_->size(); + StateId t; + do { + t = (*scc_stack_)[--i]; + if ((*coaccess_)[t]) + scc_coaccess = true; + } while (s != t); + do { + t = scc_stack_->back(); + if (scc_) + (*scc_)[t] = nscc_; + if (scc_coaccess) + (*coaccess_)[t] = true; + (*onstack_)[t] = false; + scc_stack_->pop_back(); + } while (s != t); + if (!scc_coaccess) { + *props_ |= kNotCoAccessible; + *props_ &= ~kCoAccessible; + } + ++nscc_; + } + if (p != kNoStateId) { + if ((*coaccess_)[s]) + (*coaccess_)[p] = true; + if ((*lowlink_)[s] < (*lowlink_)[p]) + (*lowlink_)[p] = (*lowlink_)[s]; + } +} + + +// Trims an FST, removing states and arcs that are not on successful +// paths. This version modifies its input. +// +// Complexity: +// - Time: O(V + E) +// - Space: O(V + E) +// where V = # of states and E = # of arcs. +template +void Connect(MutableFst *fst) { + typedef typename Arc::StateId StateId; + + vector access; + vector coaccess; + uint64 props = 0; + SccVisitor scc_visitor(0, &access, &coaccess, &props); + DfsVisit(*fst, &scc_visitor); + vector dstates; + for (StateId s = 0; s < access.size(); ++s) + if (!access[s] || !coaccess[s]) + dstates.push_back(s); + fst->DeleteStates(dstates); + fst->SetProperties(kAccessible | kCoAccessible, kAccessible | kCoAccessible); +} + +} // namespace fst + +#endif // FST_LIB_CONNECT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/const-fst.h b/extlibs/openfstwin-1.3.1/include/fst/const-fst.h new file mode 100755 index 00000000000..f68e8edb7ee --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/const-fst.h @@ -0,0 +1,483 @@ +// const-fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Simple concrete immutable FST whose states and arcs are each stored +// in single arrays. + +#ifndef FST_LIB_CONST_FST_H__ +#define FST_LIB_CONST_FST_H__ + +#include +#include +using std::vector; + +#include +#include // For optional argument declarations +#include +#include + + +namespace fst { + +template class ConstFst; +template void Cast(const F &, G *); + +// States and arcs each implemented by single arrays, templated on the +// Arc definition. The unsigned type U is used to represent indices into +// the arc array. +template +class ConstFstImpl : public FstImpl { + public: + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef U Unsigned; + + ConstFstImpl() + : states_(0), arcs_(0), nstates_(0), narcs_(0), start_(kNoStateId) { + string type = "const"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(U), &size); + type += size; + } + SetType(type); + SetProperties(kNullProperties | kStaticProperties); + } + + explicit ConstFstImpl(const Fst &fst); + + ~ConstFstImpl() { + delete[] states_; + delete[] arcs_; + } + + StateId Start() const { return start_; } + + Weight Final(StateId s) const { return states_[s].final; } + + StateId NumStates() const { return nstates_; } + + size_t NumArcs(StateId s) const { return states_[s].narcs; } + + size_t NumInputEpsilons(StateId s) const { return states_[s].niepsilons; } + + size_t NumOutputEpsilons(StateId s) const { return states_[s].noepsilons; } + + static ConstFstImpl *Read(istream &strm, const FstReadOptions &opts); + + bool Write(ostream &strm, const FstWriteOptions &opts) const; + + A *Arcs(StateId s) { return arcs_ + states_[s].pos; } + + // Provide information needed for generic state iterator + void InitStateIterator(StateIteratorData *data) const { + data->base = 0; + data->nstates = nstates_; + } + + // Provide information needed for the generic arc iterator + void InitArcIterator(StateId s, ArcIteratorData *data) const { + data->base = 0; + data->arcs = arcs_ + states_[s].pos; + data->narcs = states_[s].narcs; + data->ref_count = 0; + } + + private: + friend class ConstFst; // Allow finding narcs_, nstates_ during Write + + // States implemented by array *states_ below, arcs by (single) *arcs_. + struct State { + Weight final; // Final weight + Unsigned pos; // Start of state's arcs in *arcs_ + Unsigned narcs; // Number of arcs (per state) + Unsigned niepsilons; // # of input epsilons + Unsigned noepsilons; // # of output epsilons + State() : final(Weight::Zero()), niepsilons(0), noepsilons(0) {} + }; + + // Properties always true of this Fst class + static const uint64 kStaticProperties = kExpanded; + // Current unaligned file format version. The unaligned version was added and + // made the default since the aligned version does not work on pipes. + static const int kFileVersion = 2; + // Current aligned file format version + static const int kAlignedFileVersion = 1; + // Minimum file format version supported + static const int kMinFileVersion = 1; + // Byte alignment for states and arcs in file format (version 1 only) + static const int kFileAlign = 16; + + State *states_; // States represenation + A *arcs_; // Arcs representation + StateId nstates_; // Number of states + size_t narcs_; // Number of arcs (per FST) + StateId start_; // Initial state + + DISALLOW_COPY_AND_ASSIGN(ConstFstImpl); +}; + +template +const uint64 ConstFstImpl::kStaticProperties; +template +const int ConstFstImpl::kFileVersion; +template +const int ConstFstImpl::kAlignedFileVersion; +template +const int ConstFstImpl::kMinFileVersion; +template +const int ConstFstImpl::kFileAlign; + + +template +ConstFstImpl::ConstFstImpl(const Fst &fst) : nstates_(0), narcs_(0) { + string type = "const"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(sizeof(U) * 8, &size); + type += size; + } + SetType(type); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + start_ = fst.Start(); + + // Count # of states and arcs. + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) { + ++nstates_; + StateId s = siter.Value(); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) + ++narcs_; + } + states_ = new State[nstates_]; + arcs_ = new A[narcs_]; + size_t pos = 0; + for (StateId s = 0; s < nstates_; ++s) { + states_[s].final = fst.Final(s); + states_[s].pos = pos; + states_[s].narcs = 0; + states_[s].niepsilons = 0; + states_[s].noepsilons = 0; + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + ++states_[s].narcs; + if (arc.ilabel == 0) + ++states_[s].niepsilons; + if (arc.olabel == 0) + ++states_[s].noepsilons; + arcs_[pos++] = arc; + } + } + SetProperties(fst.Properties(kCopyProperties, true) | kStaticProperties); +} + + +template +ConstFstImpl *ConstFstImpl::Read(istream &strm, + const FstReadOptions &opts) { + ConstFstImpl *impl = new ConstFstImpl; + FstHeader hdr; + if (!impl->ReadHeader(strm, opts, kMinFileVersion, &hdr)) { + delete impl; + return 0; + } + impl->start_ = hdr.Start(); + impl->nstates_ = hdr.NumStates(); + impl->narcs_ = hdr.NumArcs(); + impl->states_ = new State[impl->nstates_]; + impl->arcs_ = new A[impl->narcs_]; + + // Ensures compatibility + if (hdr.Version() == kAlignedFileVersion) + hdr.SetFlags(hdr.GetFlags() | FstHeader::IS_ALIGNED); + + if ((hdr.GetFlags() & FstHeader::IS_ALIGNED) && + !AlignInput(strm, kFileAlign)) { + LOG(ERROR) << "ConstFst::Read: Alignment failed: " << opts.source; + delete impl; + return 0; + } + size_t b = impl->nstates_ * sizeof(typename ConstFstImpl::State); + strm.read(reinterpret_cast(impl->states_), b); + if (!strm) { + LOG(ERROR) << "ConstFst::Read: Read failed: " << opts.source; + delete impl; + return 0; + } + if ((hdr.GetFlags() & FstHeader::IS_ALIGNED) && + !AlignInput(strm, kFileAlign)) { + LOG(ERROR) << "ConstFst::Read: Alignment failed: " << opts.source; + delete impl; + return 0; + } + b = impl->narcs_ * sizeof(A); + strm.read(reinterpret_cast(impl->arcs_), b); + if (!strm) { + LOG(ERROR) << "ConstFst::Read: Read failed: " << opts.source; + delete impl; + return 0; + } + return impl; +} + +// Simple concrete immutable FST. This class attaches interface to +// implementation and handles reference counting, delegating most +// methods to ImplToExpandedFst. The unsigned type U is used to +// represent indices into the arc array (uint32 by default, declared +// in fst-decl.h). +template +class ConstFst : public ImplToExpandedFst< ConstFstImpl > { + public: + friend class StateIterator< ConstFst >; + friend class ArcIterator< ConstFst >; + template void friend Cast(const F &, G *); + + typedef A Arc; + typedef typename A::StateId StateId; + typedef ConstFstImpl Impl; + typedef U Unsigned; + + ConstFst() : ImplToExpandedFst(new Impl()) {} + + explicit ConstFst(const Fst &fst) + : ImplToExpandedFst(new Impl(fst)) {} + + ConstFst(const ConstFst &fst) : ImplToExpandedFst(fst) {} + + // Get a copy of this ConstFst. See Fst<>::Copy() for further doc. + virtual ConstFst *Copy(bool safe = false) const { + return new ConstFst(*this); + } + + // Read a ConstFst from an input stream; return NULL on error + static ConstFst *Read(istream &strm, const FstReadOptions &opts) { + Impl* impl = Impl::Read(strm, opts); + return impl ? new ConstFst(impl) : 0; + } + + // Read a ConstFst from a file; return NULL on error + // Empty filename reads from standard input + static ConstFst *Read(const string &filename) { + Impl* impl = ImplToExpandedFst::Read(filename); + return impl ? new ConstFst(impl) : 0; + } + + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + return WriteFst(*this, strm, opts); + } + + virtual bool Write(const string &filename) const { + return Fst::WriteFile(filename); + } + + template + static bool WriteFst(const F &fst, ostream &strm, + const FstWriteOptions &opts); + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + explicit ConstFst(Impl *impl) : ImplToExpandedFst(impl) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst >::GetImpl(); } + + void SetImpl(Impl *impl, bool own_impl = true) { + ImplToFst< Impl, ExpandedFst >::SetImpl(impl, own_impl); + } + + void operator=(const ConstFst &fst); // disallow +}; + +// Writes Fst in Const format, potentially with a pass over the machine +// before writing to compute number of states and arcs. +// +template +template +bool ConstFst::WriteFst(const F &fst, ostream &strm, + const FstWriteOptions &opts) { + static const int kFileVersion = 2; + static const int kAlignedFileVersion = 1; + static const int kFileAlign = 16; + int file_version = opts.align ? kAlignedFileVersion : kFileVersion; + size_t num_arcs = -1, num_states = -1; + size_t start_offset = 0; + bool update_header = true; + if (fst.Type() == ConstFst().Type()) { + const ConstFst *const_fst = static_cast *>(&fst); + num_arcs = const_fst->GetImpl()->narcs_; + num_states = const_fst->GetImpl()->nstates_; + update_header = false; + } else if ((start_offset = strm.tellp()) == -1) { + // precompute values needed for header when we cannot seek to rewrite it. + for (StateIterator siter(fst); !siter.Done(); siter.Next()) { + num_arcs += fst.NumArcs(siter.Value()); + num_states++; + } + update_header = false; + } + FstHeader hdr; + hdr.SetStart(fst.Start()); + hdr.SetNumStates(num_states); + hdr.SetNumArcs(num_arcs); + string type = "const"; + if (sizeof(U) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(U), &size); + type += size; + } + FstImpl::WriteFstHeader(fst, strm, opts, file_version, type, &hdr); + if (opts.align && !AlignOutput(strm, kFileAlign)) { + LOG(ERROR) << "Could not align file during write after header"; + return false; + } + size_t pos = 0, states = 0; + typename ConstFstImpl::State state; + for (StateIterator siter(fst); !siter.Done(); siter.Next()) { + state.final = fst.Final(siter.Value()); + state.pos = pos; + state.narcs = fst.NumArcs(siter.Value()); + state.niepsilons = fst.NumInputEpsilons(siter.Value()); + state.noepsilons = fst.NumOutputEpsilons(siter.Value()); + strm.write(reinterpret_cast(&state), sizeof(state)); + pos += state.narcs; + states++; + } + hdr.SetNumStates(states); + hdr.SetNumArcs(pos); + if (opts.align && !AlignOutput(strm, kFileAlign)) { + LOG(ERROR) << "Could not align file during write after writing states"; + } + for (StateIterator siter(fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + for (ArcIterator aiter(fst, s); !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + strm.write(reinterpret_cast(&arc), sizeof(arc)); + } + } + strm.flush(); + if (!strm) { + LOG(ERROR) << "WriteAsVectorFst write failed: " << opts.source; + return false; + } + if (update_header) { + return FstImpl::UpdateFstHeader(fst, strm, opts, file_version, type, + &hdr, start_offset); + } else { + if (hdr.NumStates() != num_states) { + LOG(ERROR) << "Inconsistent number of states observed during write"; + return false; + } + if (hdr.NumArcs() != num_arcs) { + LOG(ERROR) << "Inconsistent number of arcs observed during write"; + return false; + } + } + return true; +} + +// Specialization for ConstFst; see generic version in fst.h +// for sample usage (but use the ConstFst type!). This version +// should inline. +template +class StateIterator< ConstFst > { + public: + typedef typename A::StateId StateId; + + explicit StateIterator(const ConstFst &fst) + : nstates_(fst.GetImpl()->NumStates()), s_(0) {} + + bool Done() const { return s_ >= nstates_; } + + StateId Value() const { return s_; } + + void Next() { ++s_; } + + void Reset() { s_ = 0; } + + private: + StateId nstates_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ConstFst; see generic version in fst.h +// for sample usage (but use the ConstFst type!). This version +// should inline. +template +class ArcIterator< ConstFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ConstFst &fst, StateId s) + : arcs_(fst.GetImpl()->Arcs(s)), + narcs_(fst.GetImpl()->NumArcs(s)), i_(0) {} + + bool Done() const { return i_ >= narcs_; } + + const A& Value() const { return arcs_[i_]; } + + void Next() { ++i_; } + + size_t Position() const { return i_; } + + void Reset() { i_ = 0; } + + void Seek(size_t a) { i_ = a; } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 f, uint32 m) {} + + private: + const A *arcs_; + size_t narcs_; + size_t i_; + + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// A useful alias when using StdArc. +typedef ConstFst StdConstFst; + +} // namespace fst + +#endif // FST_LIB_CONST_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/determinize.h b/extlibs/openfstwin-1.3.1/include/fst/determinize.h new file mode 100755 index 00000000000..46ad314851b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/determinize.h @@ -0,0 +1,887 @@ +// determinize.h + + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to determinize an FST. + +#ifndef FST_LIB_DETERMINIZE_H__ +#define FST_LIB_DETERMINIZE_H__ + +#include +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +// +// COMMON DIVISORS - these are used in determinization to compute +// the transition weights. In the simplest case, it is just the same +// as the semiring Plus(). However, other choices permit more efficient +// determinization when the output contains strings. +// + +// The default common divisor uses the semiring Plus. +template +class DefaultCommonDivisor { + public: + typedef W Weight; + + W operator()(const W &w1, const W &w2) const { return Plus(w1, w2); } +}; + + +// The label common divisor for a (left) string semiring selects a +// single letter common prefix or the empty string. This is used in +// the determinization of output strings so that at most a single +// letter will appear in the output of a transtion. +template +class LabelCommonDivisor { + public: + typedef StringWeight Weight; + + Weight operator()(const Weight &w1, const Weight &w2) const { + StringWeightIterator iter1(w1); + StringWeightIterator iter2(w2); + + if (!(StringWeight::Properties() & kLeftSemiring)) { + FSTERROR() << "LabelCommonDivisor: Weight needs to be left semiring"; + return Weight::NoWeight(); + } else if (w1.Size() == 0 || w2.Size() == 0) { + return Weight::One(); + } else if (w1 == Weight::Zero()) { + return Weight(iter2.Value()); + } else if (w2 == Weight::Zero()) { + return Weight(iter1.Value()); + } else if (iter1.Value() == iter2.Value()) { + return Weight(iter1.Value()); + } else { + return Weight::One(); + } + } +}; + + +// The gallic common divisor uses the label common divisor on the +// string component and the template argument D common divisor on the +// weight component, which defaults to the default common divisor. +template > +class GallicCommonDivisor { + public: + typedef GallicWeight Weight; + + Weight operator()(const Weight &w1, const Weight &w2) const { + return Weight(label_common_divisor_(w1.Value1(), w2.Value1()), + weight_common_divisor_(w1.Value2(), w2.Value2())); + } + + private: + LabelCommonDivisor label_common_divisor_; + D weight_common_divisor_; +}; + +// Options for finite-state transducer determinization. +template +struct DeterminizeFstOptions : CacheOptions { + typedef typename Arc::Label Label; + float delta; // Quantization delta for subset weights + Label subsequential_label; // Label used for residual final output + // when producing subsequential transducers. + + explicit DeterminizeFstOptions(const CacheOptions &opts, + float del = kDelta, + Label lab = 0) + : CacheOptions(opts), delta(del), subsequential_label(lab) {} + + explicit DeterminizeFstOptions(float del = kDelta, Label lab = 0) + : delta(del), subsequential_label(lab) {} +}; + + +// Implementation of delayed DeterminizeFst. This base class is +// common to the variants that implement acceptor and transducer +// determinization. +template +class DeterminizeFstImplBase : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + DeterminizeFstImplBase(const Fst &fst, + const DeterminizeFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()) { + SetType("determinize"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(DeterminizeProperties(props, + opts.subsequential_label != 0), + kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + DeterminizeFstImplBase(const DeterminizeFstImplBase &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)) { + SetType("determinize"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + virtual ~DeterminizeFstImplBase() { delete fst_; } + + virtual DeterminizeFstImplBase *Copy() = 0; + + StateId Start() { + if (!HasStart()) { + StateId start = ComputeStart(); + if (start != kNoStateId) { + SetStart(start); + } + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Weight final = ComputeFinal(s); + SetFinal(s, final); + } + return CacheImpl::Final(s); + } + + virtual void Expand(StateId s) = 0; + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + virtual StateId ComputeStart() = 0; + + virtual Weight ComputeFinal(StateId s) = 0; + + const Fst &GetFst() const { return *fst_; } + + private: + const Fst *fst_; // Input Fst + + void operator=(const DeterminizeFstImplBase &); // disallow +}; + + +// Implementation of delayed determinization for weighted acceptors. +// It is templated on the arc type A and the common divisor D. +template +class DeterminizeFsaImpl : public DeterminizeFstImplBase { + public: + using FstImpl::SetProperties; + using DeterminizeFstImplBase::GetFst; + using DeterminizeFstImplBase::SetArcs; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + struct Element { + Element() {} + + Element(StateId s, Weight w) : state_id(s), weight(w) {} + + StateId state_id; // Input state Id + Weight weight; // Residual weight + }; + typedef slist Subset; + typedef map LabelMap; + + DeterminizeFsaImpl(const Fst &fst, D common_divisor, + const vector *in_dist, vector *out_dist, + const DeterminizeFstOptions &opts) + : DeterminizeFstImplBase(fst, opts), + delta_(opts.delta), + in_dist_(in_dist), + out_dist_(out_dist), + common_divisor_(common_divisor), + subset_hash_(0, SubsetKey(), SubsetEqual(&elements_)) { + if (!fst.Properties(kAcceptor, true)) { + FSTERROR() << "DeterminizeFst: argument not an acceptor"; + SetProperties(kError, kError); + } + if (!(Weight::Properties() & kLeftSemiring)) { + FSTERROR() << "DeterminizeFst: Weight needs to be left distributive: " + << Weight::Type(); + SetProperties(kError, kError); + } + if (out_dist_) + out_dist_->clear(); + } + + DeterminizeFsaImpl(const DeterminizeFsaImpl &impl) + : DeterminizeFstImplBase(impl), + delta_(impl.delta_), + in_dist_(0), + out_dist_(0), + common_divisor_(impl.common_divisor_), + subset_hash_(0, SubsetKey(), SubsetEqual(&elements_)) { + if (impl.out_dist_) { + FSTERROR() << "DeterminizeFsaImpl: cannot copy with out_dist vector"; + SetProperties(kError, kError); + } + } + + virtual ~DeterminizeFsaImpl() { + for (int i = 0; i < subsets_.size(); ++i) + delete subsets_[i]; + } + + virtual DeterminizeFsaImpl *Copy() { + return new DeterminizeFsaImpl(*this); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (GetFst().Properties(kError, false))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + virtual StateId ComputeStart() { + StateId s = GetFst().Start(); + if (s == kNoStateId) + return kNoStateId; + Element element(s, Weight::One()); + Subset *subset = new Subset; + subset->push_front(element); + return FindState(subset); + } + + virtual Weight ComputeFinal(StateId s) { + Subset *subset = subsets_[s]; + Weight final = Weight::Zero(); + for (typename Subset::iterator siter = subset->begin(); + siter != subset->end(); + ++siter) { + Element &element = *siter; + final = Plus(final, Times(element.weight, + GetFst().Final(element.state_id))); + if (!final.Member()) + SetProperties(kError, kError); + } + return final; + } + + // Finds the state corresponding to a subset. Only creates a new state + // if the subset is not found in the subset hash. FindState takes + // ownership of the subset argument (so that it doesn't have to copy it + // if it creates a new state). + // + // The method exploits the following device: all pairs stored in the + // associative container subset_hash_ are of the form (subset, + // id(subset) + 1), i.e. subset_hash_[subset] > 0 if subset has been + // stored previously. For unassigned subsets, the call to + // subset_hash_[subset] creates a new pair (subset, 0). As a result, + // subset_hash_[subset] == 0 iff subset is new. + StateId FindState(Subset *subset) { + StateId &assoc_value = subset_hash_[subset]; + if (assoc_value == 0) { // subset wasn't present; create new state + StateId s = CreateState(subset); + assoc_value = s + 1; + return s; + } else { + delete subset; + return assoc_value - 1; // NB: assoc_value = ID + 1 + } + } + + StateId CreateState(Subset *subset) { + StateId s = subsets_.size(); + subsets_.push_back(subset); + if (in_dist_) + out_dist_->push_back(ComputeDistance(subset)); + return s; + } + + // Compute distance from a state to the final states in the DFA + // given the distances in the NFA. + Weight ComputeDistance(const Subset *subset) { + Weight outd = Weight::Zero(); + for (typename Subset::const_iterator siter = subset->begin(); + siter != subset->end(); ++siter) { + const Element &element = *siter; + Weight ind = element.state_id < in_dist_->size() ? + (*in_dist_)[element.state_id] : Weight::Zero(); + outd = Plus(outd, Times(element.weight, ind)); + } + return outd; + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + virtual void Expand(StateId s) { + + LabelMap label_map; + LabelSubsets(s, &label_map); + + for (typename LabelMap::iterator liter = label_map.begin(); + liter != label_map.end(); + ++liter) + AddArc(s, liter->first, liter->second); + SetArcs(s); + } + + private: + // Constructs destination subsets per label. At return, subset + // element weights include the input automaton label weights and the + // subsets may contain duplicate states. + void LabelSubsets(StateId s, LabelMap *label_map) { + Subset *src_subset = subsets_[s]; + + for (typename Subset::iterator siter = src_subset->begin(); + siter != src_subset->end(); + ++siter) { + Element &src_element = *siter; + for (ArcIterator< Fst > aiter(GetFst(), src_element.state_id); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + Element dest_element(arc.nextstate, + Times(src_element.weight, arc.weight)); + Subset* &dest_subset = (*label_map)[arc.ilabel]; + if (dest_subset == 0) + dest_subset = new Subset; + dest_subset->push_front(dest_element); + } + } + } + + // Adds an arc from state S to the destination state associated + // with subset DEST_SUBSET (as created by LabelSubsets). + void AddArc(StateId s, Label label, Subset *dest_subset) { + A arc; + arc.ilabel = label; + arc.olabel = label; + arc.weight = Weight::Zero(); + + typename Subset::iterator oiter; + for (typename Subset::iterator diter = dest_subset->begin(); + diter != dest_subset->end();) { + Element &dest_element = *diter; + // Computes label weight. + arc.weight = common_divisor_(arc.weight, dest_element.weight); + + while (elements_.size() <= dest_element.state_id) + elements_.push_back(0); + Element *matching_element = elements_[dest_element.state_id]; + if (matching_element) { + // Found duplicate state: sums state weight and deletes dup. + matching_element->weight = Plus(matching_element->weight, + dest_element.weight); + if (!matching_element->weight.Member()) + SetProperties(kError, kError); + ++diter; + dest_subset->erase_after(oiter); + } else { + // Saves element so we can check for duplicate for this state. + elements_[dest_element.state_id] = &dest_element; + oiter = diter; + ++diter; + } + } + + // Divides out label weight from destination subset elements. + // Quantizes to ensure comparisons are effective. + // Clears element vector. + for (typename Subset::iterator diter = dest_subset->begin(); + diter != dest_subset->end(); + ++diter) { + Element &dest_element = *diter; + dest_element.weight = Divide(dest_element.weight, arc.weight, + DIVIDE_LEFT); + dest_element.weight = dest_element.weight.Quantize(delta_); + elements_[dest_element.state_id] = 0; + } + + arc.nextstate = FindState(dest_subset); + CacheImpl::PushArc(s, arc); + } + + // Comparison object for hashing Subset(s). Subsets are not sorted in this + // implementation, so ordering must not be assumed in the equivalence + // test. + class SubsetEqual { + public: + // Constructor takes vector needed to check equality. See immediately + // below for constraints on it. + explicit SubsetEqual(vector *elements) + : elements_(elements) {} + + // At each call to operator(), the elements_ vector should contain + // only NULLs. When this operator returns, elements_ will still + // have this property. + bool operator()(Subset* subset1, Subset* subset2) const { + if (subset1->size() != subset2->size()) + return false; + + // Loads first subset elements in element vector. + for (typename Subset::iterator iter1 = subset1->begin(); + iter1 != subset1->end(); + ++iter1) { + Element &element1 = *iter1; + while (elements_->size() <= element1.state_id) + elements_->push_back(0); + (*elements_)[element1.state_id] = &element1; + } + + // Checks second subset matches first via element vector. + for (typename Subset::iterator iter2 = subset2->begin(); + iter2 != subset2->end(); + ++iter2) { + Element &element2 = *iter2; + while (elements_->size() <= element2.state_id) + elements_->push_back(0); + Element *element1 = (*elements_)[element2.state_id]; + if (!element1 || element1->weight != element2.weight) { + // Mismatch found. Resets element vector before returning false. + for (typename Subset::iterator iter1 = subset1->begin(); + iter1 != subset1->end(); + ++iter1) + (*elements_)[iter1->state_id] = 0; + return false; + } else { + (*elements_)[element2.state_id] = 0; // Clears entry + } + } + return true; + } + private: + vector *elements_; + }; + + // Hash function for Subset to Fst states. Subset elements are not + // sorted in this implementation, so the hash must be invariant + // under subset reordering. + class SubsetKey { + public: + size_t operator()(const Subset* subset) const { + size_t hash = 0; + for (typename Subset::const_iterator iter = subset->begin(); + iter != subset->end(); + ++iter) { + const Element &element = *iter; + int lshift = element.state_id % (CHAR_BIT * sizeof(size_t) - 1) + 1; + int rshift = CHAR_BIT * sizeof(size_t) - lshift; + size_t n = element.state_id; + hash ^= n << lshift ^ n >> rshift ^ element.weight.Hash(); + } + return hash; + } + }; + + float delta_; // Quantization delta for subset weights + const vector *in_dist_; // Distance to final NFA states + vector *out_dist_; // Distance to final DFA states + + D common_divisor_; + + // Used to test equivalence of subsets. + vector elements_; + + // Maps from StateId to Subset. + vector subsets_; + + // Hashes from Subset to its StateId in the output automaton. + typedef unordered_map + SubsetHash; + + // Hashes from Label to Subsets corr. to destination states of current state. + SubsetHash subset_hash_; + + void operator=(const DeterminizeFsaImpl &); // disallow +}; + + +// Implementation of delayed determinization for transducers. +// Transducer determinization is implemented by mapping the input to +// the Gallic semiring as an acceptor whose weights contain the output +// strings and using acceptor determinization above to determinize +// that acceptor. +template +class DeterminizeFstImpl : public DeterminizeFstImplBase { + public: + using FstImpl::SetProperties; + using DeterminizeFstImplBase::GetFst; + using CacheBaseImpl< CacheState >::GetCacheGc; + using CacheBaseImpl< CacheState >::GetCacheLimit; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + typedef ToGallicMapper ToMapper; + typedef FromGallicMapper FromMapper; + + typedef typename ToMapper::ToArc ToArc; + typedef ArcMapFst ToFst; + typedef ArcMapFst FromFst; + + typedef GallicCommonDivisor CommonDivisor; + typedef GallicFactor FactorIterator; + + DeterminizeFstImpl(const Fst &fst, const DeterminizeFstOptions &opts) + : DeterminizeFstImplBase(fst, opts), + delta_(opts.delta), + subsequential_label_(opts.subsequential_label) { + Init(GetFst()); + } + + DeterminizeFstImpl(const DeterminizeFstImpl &impl) + : DeterminizeFstImplBase(impl), + delta_(impl.delta_), + subsequential_label_(impl.subsequential_label_) { + Init(GetFst()); + } + + ~DeterminizeFstImpl() { delete from_fst_; } + + virtual DeterminizeFstImpl *Copy() { + return new DeterminizeFstImpl(*this); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (GetFst().Properties(kError, false) || + from_fst_->Properties(kError, false))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + virtual StateId ComputeStart() { return from_fst_->Start(); } + + virtual Weight ComputeFinal(StateId s) { return from_fst_->Final(s); } + + virtual void Expand(StateId s) { + for (ArcIterator aiter(*from_fst_, s); + !aiter.Done(); + aiter.Next()) + CacheImpl::PushArc(s, aiter.Value()); + CacheImpl::SetArcs(s); + } + + private: + // Initialization of transducer determinization implementation, which + // is defined after DeterminizeFst since it calls it. + void Init(const Fst &fst); + + float delta_; + Label subsequential_label_; + FromFst *from_fst_; + + void operator=(const DeterminizeFstImpl &); // disallow +}; + + +// Determinizes a weighted transducer. This version is a delayed +// Fst. The result will be an equivalent FST that has the property +// that no state has two transitions with the same input label. +// For this algorithm, epsilon transitions are treated as regular +// symbols (cf. RmEpsilon). +// +// The transducer must be functional. The weights must be (weakly) +// left divisible (valid for TropicalWeight and LogWeight for instance) +// and be zero-sum-free if for all a,b: (Plus(a, b) = 0 => a = b = 0. +// +// Complexity: +// - Determinizable: exponential (polynomial in the size of the output) +// - Non-determinizable) does not terminate +// +// The determinizable automata include all unweighted and all acyclic input. +// +// References: +// - Mehryar Mohri, "Finite-State Transducers in Language and Speech +// Processing". Computational Linguistics, 23:2, 1997. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class DeterminizeFst : public ImplToFst< DeterminizeFstImplBase > { + public: + friend class ArcIterator< DeterminizeFst >; + friend class StateIterator< DeterminizeFst >; + template friend class DeterminizeFstImpl; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef CacheState State; + typedef DeterminizeFstImplBase Impl; + + using ImplToFst::SetImpl; + + explicit DeterminizeFst( + const Fst &fst, + const DeterminizeFstOptions &opts = DeterminizeFstOptions()) { + if (fst.Properties(kAcceptor, true)) { + // Calls implementation for acceptors. + typedef DefaultCommonDivisor D; + SetImpl(new DeterminizeFsaImpl(fst, D(), 0, 0, opts)); + } else { + // Calls implementation for transducers. + SetImpl(new DeterminizeFstImpl(fst, opts)); + } + } + + // This acceptor-only version additionally computes the distance to + // final states in the output if provided with those distances for the + // input. Useful for e.g. unique N-shortest paths. + DeterminizeFst( + const Fst &fst, + const vector &in_dist, vector *out_dist, + const DeterminizeFstOptions &opts = DeterminizeFstOptions()) { + if (!fst.Properties(kAcceptor, true)) { + FSTERROR() << "DeterminizeFst:" + << " distance to final states computed for acceptors only"; + GetImpl()->SetProperties(kError, kError); + } + typedef DefaultCommonDivisor D; + SetImpl(new DeterminizeFsaImpl(fst, D(), &in_dist, out_dist, opts)); + } + + // See Fst<>::Copy() for doc. + DeterminizeFst(const DeterminizeFst &fst, bool safe = false) { + if (safe) + SetImpl(fst.GetImpl()->Copy()); + else + SetImpl(fst.GetImpl(), false); + } + + // Get a copy of this DeterminizeFst. See Fst<>::Copy() for further doc. + virtual DeterminizeFst *Copy(bool safe = false) const { + return new DeterminizeFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // This private version is for passing the common divisor to + // FSA determinization. + template + DeterminizeFst(const Fst &fst, const D &common_div, + const DeterminizeFstOptions &opts) + : ImplToFst( + new DeterminizeFsaImpl(fst, common_div, 0, 0, opts)) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const DeterminizeFst &fst); // Disallow +}; + + +// Initialization of transducer determinization implementation. which +// is defined after DeterminizeFst since it calls it. +template +void DeterminizeFstImpl::Init(const Fst &fst) { + // Mapper to an acceptor. + ToFst to_fst(fst, ToMapper()); + + // Determinize acceptor. + // This recursive call terminates since it passes the common divisor + // to a private constructor. + CacheOptions copts(GetCacheGc(), GetCacheLimit()); + DeterminizeFstOptions dopts(copts, delta_); + DeterminizeFst det_fsa(to_fst, CommonDivisor(), dopts); + + // Mapper back to transducer. + FactorWeightOptions fopts(CacheOptions(true, 0), delta_, + kFactorFinalWeights, + subsequential_label_, + subsequential_label_); + FactorWeightFst factored_fst(det_fsa, fopts); + from_fst_ = new FromFst(factored_fst, FromMapper(subsequential_label_)); +} + + +// Specialization for DeterminizeFst. +template +class StateIterator< DeterminizeFst > + : public CacheStateIterator< DeterminizeFst > { + public: + explicit StateIterator(const DeterminizeFst &fst) + : CacheStateIterator< DeterminizeFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for DeterminizeFst. +template +class ArcIterator< DeterminizeFst > + : public CacheArcIterator< DeterminizeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const DeterminizeFst &fst, StateId s) + : CacheArcIterator< DeterminizeFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void DeterminizeFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< DeterminizeFst >(*this); +} + + +// Useful aliases when using StdArc. +typedef DeterminizeFst StdDeterminizeFst; + + +template +struct DeterminizeOptions { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + float delta; // Quantization delta for subset weights. + Weight weight_threshold; // Pruning weight threshold. + StateId state_threshold; // Pruning state threshold. + Label subsequential_label; // Label used for residual final output + // when producing subsequential transducers. + + explicit DeterminizeOptions(float d = kDelta, Weight w = Weight::Zero(), + StateId n = kNoStateId, Label l = 0) + : delta(d), weight_threshold(w), state_threshold(n), + subsequential_label(l) {} +}; + + +// Determinizes a weighted transducer. This version writes the +// determinized Fst to an output MutableFst. The result will be an +// equivalent FSt that has the property that no state has two +// transitions with the same input label. For this algorithm, epsilon +// transitions are treated as regular symbols (cf. RmEpsilon). +// +// The transducer must be functional. The weights must be (weakly) +// left divisible (valid for TropicalWeight and LogWeight). +// +// Complexity: +// - Determinizable: exponential (polynomial in the size of the output) +// - Non-determinizable: does not terminate +// +// The determinizable automata include all unweighted and all acyclic input. +// +// References: +// - Mehryar Mohri, "Finite-State Transducers in Language and Speech +// Processing". Computational Linguistics, 23:2, 1997. +template +void Determinize(const Fst &ifst, MutableFst *ofst, + const DeterminizeOptions &opts + = DeterminizeOptions()) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + DeterminizeFstOptions nopts; + nopts.delta = opts.delta; + nopts.subsequential_label = opts.subsequential_label; + + nopts.gc_limit = 0; // Cache only the last state for fastest copy. + + if (opts.weight_threshold != Weight::Zero() || + opts.state_threshold != kNoStateId) { + if (ifst.Properties(kAcceptor, false)) { + vector idistance, odistance; + ShortestDistance(ifst, &idistance, true); + DeterminizeFst dfst(ifst, idistance, &odistance, nopts); + PruneOptions< Arc, AnyArcFilter > popts(opts.weight_threshold, + opts.state_threshold, + AnyArcFilter(), + &odistance); + Prune(dfst, ofst, popts); + } else { + *ofst = DeterminizeFst(ifst, nopts); + Prune(ofst, opts.weight_threshold, opts.state_threshold); + } + } else { + *ofst = DeterminizeFst(ifst, nopts); + } +} + + +} // namespace fst + +#endif // FST_LIB_DETERMINIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/determinize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/determinize.h.bak new file mode 100755 index 00000000000..a145e4a5799 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/determinize.h.bak @@ -0,0 +1,887 @@ +// determinize.h + + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to determinize an FST. + +#ifndef FST_LIB_DETERMINIZE_H__ +#define FST_LIB_DETERMINIZE_H__ + +#include +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +// +// COMMON DIVISORS - these are used in determinization to compute +// the transition weights. In the simplest case, it is just the same +// as the semiring Plus(). However, other choices permit more efficient +// determinization when the output contains strings. +// + +// The default common divisor uses the semiring Plus. +template +class DefaultCommonDivisor { + public: + typedef W Weight; + + W operator()(const W &w1, const W &w2) const { return Plus(w1, w2); } +}; + + +// The label common divisor for a (left) string semiring selects a +// single letter common prefix or the empty string. This is used in +// the determinization of output strings so that at most a single +// letter will appear in the output of a transtion. +template +class LabelCommonDivisor { + public: + typedef StringWeight Weight; + + Weight operator()(const Weight &w1, const Weight &w2) const { + StringWeightIterator iter1(w1); + StringWeightIterator iter2(w2); + + if (!(StringWeight::Properties() & kLeftSemiring)) { + FSTERROR() << "LabelCommonDivisor: Weight needs to be left semiring"; + return Weight::NoWeight(); + } else if (w1.Size() == 0 || w2.Size() == 0) { + return Weight::One(); + } else if (w1 == Weight::Zero()) { + return Weight(iter2.Value()); + } else if (w2 == Weight::Zero()) { + return Weight(iter1.Value()); + } else if (iter1.Value() == iter2.Value()) { + return Weight(iter1.Value()); + } else { + return Weight::One(); + } + } +}; + + +// The gallic common divisor uses the label common divisor on the +// string component and the template argument D common divisor on the +// weight component, which defaults to the default common divisor. +template > +class GallicCommonDivisor { + public: + typedef GallicWeight Weight; + + Weight operator()(const Weight &w1, const Weight &w2) const { + return Weight(label_common_divisor_(w1.Value1(), w2.Value1()), + weight_common_divisor_(w1.Value2(), w2.Value2())); + } + + private: + LabelCommonDivisor label_common_divisor_; + D weight_common_divisor_; +}; + +// Options for finite-state transducer determinization. +template +struct DeterminizeFstOptions : CacheOptions { + typedef typename Arc::Label Label; + float delta; // Quantization delta for subset weights + Label subsequential_label; // Label used for residual final output + // when producing subsequential transducers. + + explicit DeterminizeFstOptions(const CacheOptions &opts, + float del = kDelta, + Label lab = 0) + : CacheOptions(opts), delta(del), subsequential_label(lab) {} + + explicit DeterminizeFstOptions(float del = kDelta, Label lab = 0) + : delta(del), subsequential_label(lab) {} +}; + + +// Implementation of delayed DeterminizeFst. This base class is +// common to the variants that implement acceptor and transducer +// determinization. +template +class DeterminizeFstImplBase : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + DeterminizeFstImplBase(const Fst &fst, + const DeterminizeFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()) { + SetType("determinize"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(DeterminizeProperties(props, + opts.subsequential_label != 0), + kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + DeterminizeFstImplBase(const DeterminizeFstImplBase &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)) { + SetType("determinize"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + virtual ~DeterminizeFstImplBase() { delete fst_; } + + virtual DeterminizeFstImplBase *Copy() = 0; + + StateId Start() { + if (!HasStart()) { + StateId start = ComputeStart(); + if (start != kNoStateId) { + SetStart(start); + } + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Weight final = ComputeFinal(s); + SetFinal(s, final); + } + return CacheImpl::Final(s); + } + + virtual void Expand(StateId s) = 0; + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + virtual StateId ComputeStart() = 0; + + virtual Weight ComputeFinal(StateId s) = 0; + + const Fst &GetFst() const { return *fst_; } + + private: + const Fst *fst_; // Input Fst + + void operator=(const DeterminizeFstImplBase &); // disallow +}; + + +// Implementation of delayed determinization for weighted acceptors. +// It is templated on the arc type A and the common divisor D. +template +class DeterminizeFsaImpl : public DeterminizeFstImplBase { + public: + using FstImpl::SetProperties; + using DeterminizeFstImplBase::GetFst; + using DeterminizeFstImplBase::SetArcs; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + struct Element { + Element() {} + + Element(StateId s, Weight w) : state_id(s), weight(w) {} + + StateId state_id; // Input state Id + Weight weight; // Residual weight + }; + typedef slist Subset; + typedef map LabelMap; + + DeterminizeFsaImpl(const Fst &fst, D common_divisor, + const vector *in_dist, vector *out_dist, + const DeterminizeFstOptions &opts) + : DeterminizeFstImplBase(fst, opts), + delta_(opts.delta), + in_dist_(in_dist), + out_dist_(out_dist), + common_divisor_(common_divisor), + subset_hash_(0, SubsetKey(), SubsetEqual(&elements_)) { + if (!fst.Properties(kAcceptor, true)) { + FSTERROR() << "DeterminizeFst: argument not an acceptor"; + SetProperties(kError, kError); + } + if (!(Weight::Properties() & kLeftSemiring)) { + FSTERROR() << "DeterminizeFst: Weight needs to be left distributive: " + << Weight::Type(); + SetProperties(kError, kError); + } + if (out_dist_) + out_dist_->clear(); + } + + DeterminizeFsaImpl(const DeterminizeFsaImpl &impl) + : DeterminizeFstImplBase(impl), + delta_(impl.delta_), + in_dist_(0), + out_dist_(0), + common_divisor_(impl.common_divisor_), + subset_hash_(0, SubsetKey(), SubsetEqual(&elements_)) { + if (impl.out_dist_) { + FSTERROR() << "DeterminizeFsaImpl: cannot copy with out_dist vector"; + SetProperties(kError, kError); + } + } + + virtual ~DeterminizeFsaImpl() { + for (int i = 0; i < subsets_.size(); ++i) + delete subsets_[i]; + } + + virtual DeterminizeFsaImpl *Copy() { + return new DeterminizeFsaImpl(*this); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (GetFst().Properties(kError, false))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + virtual StateId ComputeStart() { + StateId s = GetFst().Start(); + if (s == kNoStateId) + return kNoStateId; + Element element(s, Weight::One()); + Subset *subset = new Subset; + subset->push_front(element); + return FindState(subset); + } + + virtual Weight ComputeFinal(StateId s) { + Subset *subset = subsets_[s]; + Weight final = Weight::Zero(); + for (typename Subset::iterator siter = subset->begin(); + siter != subset->end(); + ++siter) { + Element &element = *siter; + final = Plus(final, Times(element.weight, + GetFst().Final(element.state_id))); + if (!final.Member()) + SetProperties(kError, kError); + } + return final; + } + + // Finds the state corresponding to a subset. Only creates a new state + // if the subset is not found in the subset hash. FindState takes + // ownership of the subset argument (so that it doesn't have to copy it + // if it creates a new state). + // + // The method exploits the following device: all pairs stored in the + // associative container subset_hash_ are of the form (subset, + // id(subset) + 1), i.e. subset_hash_[subset] > 0 if subset has been + // stored previously. For unassigned subsets, the call to + // subset_hash_[subset] creates a new pair (subset, 0). As a result, + // subset_hash_[subset] == 0 iff subset is new. + StateId FindState(Subset *subset) { + StateId &assoc_value = subset_hash_[subset]; + if (assoc_value == 0) { // subset wasn't present; create new state + StateId s = CreateState(subset); + assoc_value = s + 1; + return s; + } else { + delete subset; + return assoc_value - 1; // NB: assoc_value = ID + 1 + } + } + + StateId CreateState(Subset *subset) { + StateId s = subsets_.size(); + subsets_.push_back(subset); + if (in_dist_) + out_dist_->push_back(ComputeDistance(subset)); + return s; + } + + // Compute distance from a state to the final states in the DFA + // given the distances in the NFA. + Weight ComputeDistance(const Subset *subset) { + Weight outd = Weight::Zero(); + for (typename Subset::const_iterator siter = subset->begin(); + siter != subset->end(); ++siter) { + const Element &element = *siter; + Weight ind = element.state_id < in_dist_->size() ? + (*in_dist_)[element.state_id] : Weight::Zero(); + outd = Plus(outd, Times(element.weight, ind)); + } + return outd; + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + virtual void Expand(StateId s) { + + LabelMap label_map; + LabelSubsets(s, &label_map); + + for (typename LabelMap::iterator liter = label_map.begin(); + liter != label_map.end(); + ++liter) + AddArc(s, liter->first, liter->second); + SetArcs(s); + } + + private: + // Constructs destination subsets per label. At return, subset + // element weights include the input automaton label weights and the + // subsets may contain duplicate states. + void LabelSubsets(StateId s, LabelMap *label_map) { + Subset *src_subset = subsets_[s]; + + for (typename Subset::iterator siter = src_subset->begin(); + siter != src_subset->end(); + ++siter) { + Element &src_element = *siter; + for (ArcIterator< Fst > aiter(GetFst(), src_element.state_id); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + Element dest_element(arc.nextstate, + Times(src_element.weight, arc.weight)); + Subset* &dest_subset = (*label_map)[arc.ilabel]; + if (dest_subset == 0) + dest_subset = new Subset; + dest_subset->push_front(dest_element); + } + } + } + + // Adds an arc from state S to the destination state associated + // with subset DEST_SUBSET (as created by LabelSubsets). + void AddArc(StateId s, Label label, Subset *dest_subset) { + A arc; + arc.ilabel = label; + arc.olabel = label; + arc.weight = Weight::Zero(); + + typename Subset::iterator oiter; + for (typename Subset::iterator diter = dest_subset->begin(); + diter != dest_subset->end();) { + Element &dest_element = *diter; + // Computes label weight. + arc.weight = common_divisor_(arc.weight, dest_element.weight); + + while (elements_.size() <= dest_element.state_id) + elements_.push_back(0); + Element *matching_element = elements_[dest_element.state_id]; + if (matching_element) { + // Found duplicate state: sums state weight and deletes dup. + matching_element->weight = Plus(matching_element->weight, + dest_element.weight); + if (!matching_element->weight.Member()) + SetProperties(kError, kError); + ++diter; + dest_subset->erase_after(oiter); + } else { + // Saves element so we can check for duplicate for this state. + elements_[dest_element.state_id] = &dest_element; + oiter = diter; + ++diter; + } + } + + // Divides out label weight from destination subset elements. + // Quantizes to ensure comparisons are effective. + // Clears element vector. + for (typename Subset::iterator diter = dest_subset->begin(); + diter != dest_subset->end(); + ++diter) { + Element &dest_element = *diter; + dest_element.weight = Divide(dest_element.weight, arc.weight, + DIVIDE_LEFT); + dest_element.weight = dest_element.weight.Quantize(delta_); + elements_[dest_element.state_id] = 0; + } + + arc.nextstate = FindState(dest_subset); + CacheImpl::PushArc(s, arc); + } + + // Comparison object for hashing Subset(s). Subsets are not sorted in this + // implementation, so ordering must not be assumed in the equivalence + // test. + class SubsetEqual { + public: + // Constructor takes vector needed to check equality. See immediately + // below for constraints on it. + explicit SubsetEqual(vector *elements) + : elements_(elements) {} + + // At each call to operator(), the elements_ vector should contain + // only NULLs. When this operator returns, elements_ will still + // have this property. + bool operator()(Subset* subset1, Subset* subset2) const { + if (subset1->size() != subset2->size()) + return false; + + // Loads first subset elements in element vector. + for (typename Subset::iterator iter1 = subset1->begin(); + iter1 != subset1->end(); + ++iter1) { + Element &element1 = *iter1; + while (elements_->size() <= element1.state_id) + elements_->push_back(0); + (*elements_)[element1.state_id] = &element1; + } + + // Checks second subset matches first via element vector. + for (typename Subset::iterator iter2 = subset2->begin(); + iter2 != subset2->end(); + ++iter2) { + Element &element2 = *iter2; + while (elements_->size() <= element2.state_id) + elements_->push_back(0); + Element *element1 = (*elements_)[element2.state_id]; + if (!element1 || element1->weight != element2.weight) { + // Mismatch found. Resets element vector before returning false. + for (typename Subset::iterator iter1 = subset1->begin(); + iter1 != subset1->end(); + ++iter1) + (*elements_)[iter1->state_id] = 0; + return false; + } else { + (*elements_)[element2.state_id] = 0; // Clears entry + } + } + return true; + } + private: + vector *elements_; + }; + + // Hash function for Subset to Fst states. Subset elements are not + // sorted in this implementation, so the hash must be invariant + // under subset reordering. + class SubsetKey { + public: + size_t operator()(const Subset* subset) const { + size_t hash = 0; + for (typename Subset::const_iterator iter = subset->begin(); + iter != subset->end(); + ++iter) { + const Element &element = *iter; + int lshift = element.state_id % (CHAR_BIT * sizeof(size_t) - 1) + 1; + int rshift = CHAR_BIT * sizeof(size_t) - lshift; + size_t n = element.state_id; + hash ^= n << lshift ^ n >> rshift ^ element.weight.Hash(); + } + return hash; + } + }; + + float delta_; // Quantization delta for subset weights + const vector *in_dist_; // Distance to final NFA states + vector *out_dist_; // Distance to final DFA states + + D common_divisor_; + + // Used to test equivalence of subsets. + vector elements_; + + // Maps from StateId to Subset. + vector subsets_; + + // Hashes from Subset to its StateId in the output automaton. + typedef unordered_map + SubsetHash; + + // Hashes from Label to Subsets corr. to destination states of current state. + SubsetHash subset_hash_; + + void operator=(const DeterminizeFsaImpl &); // disallow +}; + + +// Implementation of delayed determinization for transducers. +// Transducer determinization is implemented by mapping the input to +// the Gallic semiring as an acceptor whose weights contain the output +// strings and using acceptor determinization above to determinize +// that acceptor. +template +class DeterminizeFstImpl : public DeterminizeFstImplBase { + public: + using FstImpl::SetProperties; + using DeterminizeFstImplBase::GetFst; + using CacheBaseImpl< CacheState >::GetCacheGc; + using CacheBaseImpl< CacheState >::GetCacheLimit; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + typedef ToGallicMapper ToMapper; + typedef FromGallicMapper FromMapper; + + typedef typename ToMapper::ToArc ToArc; + typedef ArcMapFst ToFst; + typedef ArcMapFst FromFst; + + typedef GallicCommonDivisor CommonDivisor; + typedef GallicFactor FactorIterator; + + DeterminizeFstImpl(const Fst &fst, const DeterminizeFstOptions &opts) + : DeterminizeFstImplBase(fst, opts), + delta_(opts.delta), + subsequential_label_(opts.subsequential_label) { + Init(GetFst()); + } + + DeterminizeFstImpl(const DeterminizeFstImpl &impl) + : DeterminizeFstImplBase(impl), + delta_(impl.delta_), + subsequential_label_(impl.subsequential_label_) { + Init(GetFst()); + } + + ~DeterminizeFstImpl() { delete from_fst_; } + + virtual DeterminizeFstImpl *Copy() { + return new DeterminizeFstImpl(*this); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (GetFst().Properties(kError, false) || + from_fst_->Properties(kError, false))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + virtual StateId ComputeStart() { return from_fst_->Start(); } + + virtual Weight ComputeFinal(StateId s) { return from_fst_->Final(s); } + + virtual void Expand(StateId s) { + for (ArcIterator aiter(*from_fst_, s); + !aiter.Done(); + aiter.Next()) + CacheImpl::PushArc(s, aiter.Value()); + CacheImpl::SetArcs(s); + } + + private: + // Initialization of transducer determinization implementation, which + // is defined after DeterminizeFst since it calls it. + void Init(const Fst &fst); + + float delta_; + Label subsequential_label_; + FromFst *from_fst_; + + void operator=(const DeterminizeFstImpl &); // disallow +}; + + +// Determinizes a weighted transducer. This version is a delayed +// Fst. The result will be an equivalent FST that has the property +// that no state has two transitions with the same input label. +// For this algorithm, epsilon transitions are treated as regular +// symbols (cf. RmEpsilon). +// +// The transducer must be functional. The weights must be (weakly) +// left divisible (valid for TropicalWeight and LogWeight for instance) +// and be zero-sum-free if for all a,b: (Plus(a, b) = 0 => a = b = 0. +// +// Complexity: +// - Determinizable: exponential (polynomial in the size of the output) +// - Non-determinizable) does not terminate +// +// The determinizable automata include all unweighted and all acyclic input. +// +// References: +// - Mehryar Mohri, "Finite-State Transducers in Language and Speech +// Processing". Computational Linguistics, 23:2, 1997. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class DeterminizeFst : public ImplToFst< DeterminizeFstImplBase > { + public: + friend class ArcIterator< DeterminizeFst >; + friend class StateIterator< DeterminizeFst >; + template friend class DeterminizeFstImpl; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef CacheState State; + typedef DeterminizeFstImplBase Impl; + + using ImplToFst::SetImpl; + + explicit DeterminizeFst( + const Fst &fst, + const DeterminizeFstOptions &opts = DeterminizeFstOptions()) { + if (fst.Properties(kAcceptor, true)) { + // Calls implementation for acceptors. + typedef DefaultCommonDivisor D; + SetImpl(new DeterminizeFsaImpl(fst, D(), 0, 0, opts)); + } else { + // Calls implementation for transducers. + SetImpl(new DeterminizeFstImpl(fst, opts)); + } + } + + // This acceptor-only version additionally computes the distance to + // final states in the output if provided with those distances for the + // input. Useful for e.g. unique N-shortest paths. + DeterminizeFst( + const Fst &fst, + const vector &in_dist, vector *out_dist, + const DeterminizeFstOptions &opts = DeterminizeFstOptions()) { + if (!fst.Properties(kAcceptor, true)) { + FSTERROR() << "DeterminizeFst:" + << " distance to final states computed for acceptors only"; + GetImpl()->SetProperties(kError, kError); + } + typedef DefaultCommonDivisor D; + SetImpl(new DeterminizeFsaImpl(fst, D(), &in_dist, out_dist, opts)); + } + + // See Fst<>::Copy() for doc. + DeterminizeFst(const DeterminizeFst &fst, bool safe = false) { + if (safe) + SetImpl(fst.GetImpl()->Copy()); + else + SetImpl(fst.GetImpl(), false); + } + + // Get a copy of this DeterminizeFst. See Fst<>::Copy() for further doc. + virtual DeterminizeFst *Copy(bool safe = false) const { + return new DeterminizeFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // This private version is for passing the common divisor to + // FSA determinization. + template + DeterminizeFst(const Fst &fst, const D &common_div, + const DeterminizeFstOptions &opts) + : ImplToFst( + new DeterminizeFsaImpl(fst, common_div, 0, 0, opts)) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const DeterminizeFst &fst); // Disallow +}; + + +// Initialization of transducer determinization implementation. which +// is defined after DeterminizeFst since it calls it. +template +void DeterminizeFstImpl::Init(const Fst &fst) { + // Mapper to an acceptor. + ToFst to_fst(fst, ToMapper()); + + // Determinize acceptor. + // This recursive call terminates since it passes the common divisor + // to a private constructor. + CacheOptions copts(GetCacheGc(), GetCacheLimit()); + DeterminizeFstOptions dopts(copts, delta_); + DeterminizeFst det_fsa(to_fst, CommonDivisor(), dopts); + + // Mapper back to transducer. + FactorWeightOptions fopts(CacheOptions(true, 0), delta_, + kFactorFinalWeights, + subsequential_label_, + subsequential_label_); + FactorWeightFst factored_fst(det_fsa, fopts); + from_fst_ = new FromFst(factored_fst, FromMapper(subsequential_label_)); +} + + +// Specialization for DeterminizeFst. +template +class StateIterator< DeterminizeFst > + : public CacheStateIterator< DeterminizeFst > { + public: + explicit StateIterator(const DeterminizeFst &fst) + : CacheStateIterator< DeterminizeFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for DeterminizeFst. +template +class ArcIterator< DeterminizeFst > + : public CacheArcIterator< DeterminizeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const DeterminizeFst &fst, StateId s) + : CacheArcIterator< DeterminizeFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void DeterminizeFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< DeterminizeFst >(*this); +} + + +// Useful aliases when using StdArc. +typedef DeterminizeFst StdDeterminizeFst; + + +template +struct DeterminizeOptions { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + float delta; // Quantization delta for subset weights. + Weight weight_threshold; // Pruning weight threshold. + StateId state_threshold; // Pruning state threshold. + Label subsequential_label; // Label used for residual final output + // when producing subsequential transducers. + + explicit DeterminizeOptions(float d = kDelta, Weight w = Weight::Zero(), + StateId n = kNoStateId, Label l = 0) + : delta(d), weight_threshold(w), state_threshold(n), + subsequential_label(l) {} +}; + + +// Determinizes a weighted transducer. This version writes the +// determinized Fst to an output MutableFst. The result will be an +// equivalent FSt that has the property that no state has two +// transitions with the same input label. For this algorithm, epsilon +// transitions are treated as regular symbols (cf. RmEpsilon). +// +// The transducer must be functional. The weights must be (weakly) +// left divisible (valid for TropicalWeight and LogWeight). +// +// Complexity: +// - Determinizable: exponential (polynomial in the size of the output) +// - Non-determinizable: does not terminate +// +// The determinizable automata include all unweighted and all acyclic input. +// +// References: +// - Mehryar Mohri, "Finite-State Transducers in Language and Speech +// Processing". Computational Linguistics, 23:2, 1997. +template +void Determinize(const Fst &ifst, MutableFst *ofst, + const DeterminizeOptions &opts + = DeterminizeOptions()) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + DeterminizeFstOptions nopts; + nopts.delta = opts.delta; + nopts.subsequential_label = opts.subsequential_label; + + nopts.gc_limit = 0; // Cache only the last state for fastest copy. + + if (opts.weight_threshold != Weight::Zero() || + opts.state_threshold != kNoStateId) { + if (ifst.Properties(kAcceptor, false)) { + vector idistance, odistance; + ShortestDistance(ifst, &idistance, true); + DeterminizeFst dfst(ifst, idistance, &odistance, nopts); + PruneOptions< Arc, AnyArcFilter > popts(opts.weight_threshold, + opts.state_threshold, + AnyArcFilter(), + &odistance); + Prune(dfst, ofst, popts); + } else { + *ofst = DeterminizeFst(ifst, nopts); + Prune(ofst, opts.weight_threshold, opts.state_threshold); + } + } else { + *ofst = DeterminizeFst(ifst, nopts); + } +} + + +} // namespace fst + +#endif // FST_LIB_DETERMINIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/dfs-visit.h b/extlibs/openfstwin-1.3.1/include/fst/dfs-visit.h new file mode 100755 index 00000000000..b47c78d3fa5 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/dfs-visit.h @@ -0,0 +1,204 @@ +// dfs-visit.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Depth-first search visitation. See visit.h for more general +// search queue disciplines. + +#ifndef FST_LIB_DFS_VISIT_H__ +#define FST_LIB_DFS_VISIT_H__ + +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +// Visitor Interface - class determines actions taken during a Dfs. +// If any of the boolean member functions return false, the DFS is +// aborted by first calling FinishState() on all currently grey states +// and then calling FinishVisit(). +// +// Note this is similar to the more general visitor interface in visit.h +// except that FinishState returns additional information appropriate only for +// a DFS and some methods names here are better suited to a DFS. +// +// template +// class Visitor { +// public: +// typedef typename Arc::StateId StateId; +// +// Visitor(T *return_data); +// // Invoked before DFS visit +// void InitVisit(const Fst &fst); +// // Invoked when state discovered (2nd arg is DFS tree root) +// bool InitState(StateId s, StateId root); +// // Invoked when tree arc examined (to white/undiscovered state) +// bool TreeArc(StateId s, const Arc &a); +// // Invoked when back arc examined (to grey/unfinished state) +// bool BackArc(StateId s, const Arc &a); +// // Invoked when forward or cross arc examined (to black/finished state) +// bool ForwardOrCrossArc(StateId s, const Arc &a); +// // Invoked when state finished (PARENT is kNoStateID and ARC == NULL +// // when S is tree root) +// void FinishState(StateId s, StateId parent, const Arc *parent_arc); +// // Invoked after DFS visit +// void FinishVisit(); +// }; + +// An Fst state's DFS status +const int kDfsWhite = 0; // Undiscovered +const int kDfsGrey = 1; // Discovered & unfinished +const int kDfsBlack = 2; // Finished + +// An Fst state's DFS stack state +template +struct DfsState { + typedef typename Arc::StateId StateId; + + DfsState(const Fst &fst, StateId s): state_id(s), arc_iter(fst, s) {} + + StateId state_id; // Fst state ... + ArcIterator< Fst > arc_iter; // and its corresponding arcs +}; + + +// Performs depth-first visitation. Visitor class argument determines +// actions and contains any return data. ArcFilter determines arcs +// that are considered. +// +// Note this is similar to Visit() in visit.h called with a LIFO +// queue except this version has a Visitor class specialized and +// augmented for a DFS. +template +void DfsVisit(const Fst &fst, V *visitor, ArcFilter filter) { + typedef typename Arc::StateId StateId; + + visitor->InitVisit(fst); + + StateId start = fst.Start(); + if (start == kNoStateId) { + visitor->FinishVisit(); + return; + } + + vector state_color; // Fst state DFS status + stack *> state_stack; // DFS execution stack + + StateId nstates = start + 1; // # of known states in general case + bool expanded = false; + if (fst.Properties(kExpanded, false)) { // tests if expanded case, then + nstates = CountStates(fst); // uses ExpandedFst::NumStates(). + expanded = true; + } + + state_color.resize(nstates, kDfsWhite); + StateIterator< Fst > siter(fst); + + // Continue DFS while true + bool dfs = true; + + // Iterate over trees in DFS forest. + for (StateId root = start; dfs && root < nstates;) { + state_color[root] = kDfsGrey; + state_stack.push(new DfsState(fst, root)); + dfs = visitor->InitState(root, root); + while (!state_stack.empty()) { + DfsState *dfs_state = state_stack.top(); + StateId s = dfs_state->state_id; + if (s >= state_color.size()) { + nstates = s + 1; + state_color.resize(nstates, kDfsWhite); + } + ArcIterator< Fst > &aiter = dfs_state->arc_iter; + if (!dfs || aiter.Done()) { + state_color[s] = kDfsBlack; + delete dfs_state; + state_stack.pop(); + if (!state_stack.empty()) { + DfsState *parent_state = state_stack.top(); + StateId p = parent_state->state_id; + ArcIterator< Fst > &piter = parent_state->arc_iter; + visitor->FinishState(s, p, &piter.Value()); + piter.Next(); + } else { + visitor->FinishState(s, kNoStateId, 0); + } + continue; + } + const Arc &arc = aiter.Value(); + if (arc.nextstate >= state_color.size()) { + nstates = arc.nextstate + 1; + state_color.resize(nstates, kDfsWhite); + } + if (!filter(arc)) { + aiter.Next(); + continue; + } + int next_color = state_color[arc.nextstate]; + switch (next_color) { + default: + case kDfsWhite: + dfs = visitor->TreeArc(s, arc); + if (!dfs) break; + state_color[arc.nextstate] = kDfsGrey; + state_stack.push(new DfsState(fst, arc.nextstate)); + dfs = visitor->InitState(arc.nextstate, root); + break; + case kDfsGrey: + dfs = visitor->BackArc(s, arc); + aiter.Next(); + break; + case kDfsBlack: + dfs = visitor->ForwardOrCrossArc(s, arc); + aiter.Next(); + break; + } + } + + // Find next tree root + for (root = root == start ? 0 : root + 1; + root < nstates && state_color[root] != kDfsWhite; + ++root); + + // Check for a state beyond the largest known state + if (!expanded && root == nstates) { + for (; !siter.Done(); siter.Next()) { + if (siter.Value() == nstates) { + ++nstates; + state_color.push_back(kDfsWhite); + break; + } + } + } + } + visitor->FinishVisit(); +} + + +template +void DfsVisit(const Fst &fst, V *visitor) { + DfsVisit(fst, visitor, AnyArcFilter()); +} + +} // namespace fst + +#endif // FST_LIB_DFS_VISIT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/difference.h b/extlibs/openfstwin-1.3.1/include/fst/difference.h new file mode 100755 index 00000000000..8a3306f60fa --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/difference.h @@ -0,0 +1,189 @@ +// difference.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to compute the difference between two FSAs + +#ifndef FST_LIB_DIFFERENCE_H__ +#define FST_LIB_DIFFERENCE_H__ + +#include +using std::vector; +#include + +#include +#include +#include + + +namespace fst { + +template >, + class F = SequenceComposeFilter, + class T = GenericComposeStateTable > +struct DifferenceFstOptions : public ComposeFstOptions { + explicit DifferenceFstOptions(const CacheOptions &opts, + M *mat1 = 0, M *mat2 = 0, + F *filt = 0, T *sttable= 0) + : ComposeFstOptions(mat1, mat2, filt, sttable) { } + + DifferenceFstOptions() {} +}; + +// Computes the difference between two FSAs. This version is a delayed +// Fst. Only strings that are in the first automaton but not in second +// are retained in the result. +// +// The first argument must be an acceptor; the second argument must be +// an unweighted, epsilon-free, deterministic acceptor. One of the +// arguments must be label-sorted. +// +// Complexity: same as ComposeFst. +// +// Caveats: same as ComposeFst. +template +class DifferenceFst : public ComposeFst { + public: + using ImplToFst< ComposeFstImplBase >::SetImpl; + using ImplToFst< ComposeFstImplBase >::GetImpl; + + using ComposeFst::CreateBase1; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + // A - B = A ^ B'. + DifferenceFst(const Fst &fst1, const Fst &fst2, + const CacheOptions &opts = CacheOptions()) { + typedef RhoMatcher< Matcher > > R; + + ComplementFst cfst(fst2); + ComposeFstOptions copts(CacheOptions(), + new R(fst1, MATCH_NONE), + new R(cfst, MATCH_INPUT, + ComplementFst::kRhoLabel)); + SetImpl(CreateBase1(fst1, cfst, copts)); + + if (!fst1.Properties(kAcceptor, true)) { + FSTERROR() << "DifferenceFst: 1st argument not an acceptor"; + GetImpl()->SetProperties(kError, kError); + } + } + + template + DifferenceFst(const Fst &fst1, const Fst &fst2, + const DifferenceFstOptions &opts) { + typedef RhoMatcher R; + + ComplementFst cfst(fst2); + ComposeFstOptions copts(opts); + copts.matcher1 = new R(fst1, MATCH_NONE, kNoLabel, MATCHER_REWRITE_ALWAYS, + opts.matcher1); + copts.matcher2 = new R(cfst, MATCH_INPUT, ComplementFst::kRhoLabel, + MATCHER_REWRITE_ALWAYS, opts.matcher2); + + SetImpl(CreateBase1(fst1, cfst, copts)); + + if (!fst1.Properties(kAcceptor, true)) { + FSTERROR() << "DifferenceFst: 1st argument not an acceptor"; + GetImpl()->SetProperties(kError, kError); + } + } + + // See Fst<>::Copy() for doc. + DifferenceFst(const DifferenceFst &fst, bool safe = false) + : ComposeFst(fst, safe) {} + + // Get a copy of this DifferenceFst. See Fst<>::Copy() for further doc. + virtual DifferenceFst *Copy(bool safe = false) const { + return new DifferenceFst(*this, safe); + } +}; + + +// Specialization for DifferenceFst. +template +class StateIterator< DifferenceFst > + : public StateIterator< ComposeFst > { + public: + explicit StateIterator(const DifferenceFst &fst) + : StateIterator< ComposeFst >(fst) {} +}; + + +// Specialization for DifferenceFst. +template +class ArcIterator< DifferenceFst > + : public ArcIterator< ComposeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const DifferenceFst &fst, StateId s) + : ArcIterator< ComposeFst >(fst, s) {} +}; + +// Useful alias when using StdArc. +typedef DifferenceFst StdDifferenceFst; + + +typedef ComposeOptions DifferenceOptions; + + +// Computes the difference between two FSAs. This version is writes +// the difference to an output MutableFst. Only strings that are in +// the first automaton but not in second are retained in the result. +// +// The first argument must be an acceptor; the second argument must be +// an unweighted, epsilon-free, deterministic acceptor. One of the +// arguments must be label-sorted. +// +// Complexity: same as Compose. +// +// Caveats: same as Compose. +template +void Difference(const Fst &ifst1, const Fst &ifst2, + MutableFst *ofst, + const DifferenceOptions &opts = DifferenceOptions()) { + typedef Matcher< Fst > M; + + if (opts.filter_type == AUTO_FILTER) { + CacheOptions nopts; + nopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = DifferenceFst(ifst1, ifst2, nopts); + } else if (opts.filter_type == SEQUENCE_FILTER) { + DifferenceFstOptions dopts; + dopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = DifferenceFst(ifst1, ifst2, dopts); + } else if (opts.filter_type == ALT_SEQUENCE_FILTER) { + DifferenceFstOptions > dopts; + dopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = DifferenceFst(ifst1, ifst2, dopts); + } else if (opts.filter_type == MATCH_FILTER) { + DifferenceFstOptions > dopts; + dopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = DifferenceFst(ifst1, ifst2, dopts); + } + + if (opts.connect) + Connect(ofst); +} + +} // namespace fst + +#endif // FST_LIB_DIFFERENCE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/edit-fst.h b/extlibs/openfstwin-1.3.1/include/fst/edit-fst.h new file mode 100755 index 00000000000..303cb249ab0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/edit-fst.h @@ -0,0 +1,774 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: dbikel@google.com (Dan Bikel) +// +// An \ref Fst implementation that allows non-destructive edit operations on an +// existing fst. + +#ifndef FST_LIB_EDIT_FST_H_ +#define FST_LIB_EDIT_FST_H_ + +#include +using std::vector; + +#include + +namespace fst { + +// The EditFst class enables non-destructive edit operations on a wrapped +// ExpandedFst. The implementation uses copy-on-write semantics at the node +// level: if a user has an underlying fst on which he or she wants to perform a +// relatively small number of edits (read: mutations), then this implementation +// will copy the edited node to an internal MutableFst and perform any edits in +// situ on that copied node. This class supports all the methods of MutableFst +// except for DeleteStates(const vector &); thus, new nodes may also be +// added, and one may add transitions from existing nodes of the wrapped fst to +// new nodes. +// +// N.B.: The documentation for Fst::Copy(true) says that its behavior is +// undefined if invoked on an fst that has already been accessed. This class +// requires that the Fst implementation it wraps provides consistent, reliable +// behavior when its Copy(true) method is invoked, where consistent means +// the graph structure, graph properties and state numbering and do not change. +// VectorFst and CompactFst, for example, are both well-behaved in this regard. + +// The EditFstData class is a container for all mutable data for EditFstImpl; +// also, this class provides most of the actual implementation of what EditFst +// does (that is, most of EditFstImpl's methods delegate to methods in this, the +// EditFstData class). Instances of this class are reference-counted and can be +// shared between otherwise independent EditFstImpl instances. This scheme +// allows EditFstImpl to implement the thread-safe, copy-on-write semantics +// required by Fst::Copy(true). +// +// template parameters: +// A the type of arc to use +// WrappedFstT the type of fst wrapped by the EditFst instance that +// this EditFstData instance is backing +// MutableFstT the type of mutable fst to use internally for edited states; +// crucially, MutableFstT::Copy(false) *must* yield an fst that is +// thread-safe for reading (VectorFst, for example, has this property) +template , + typename MutableFstT = VectorFst > +class EditFstData { + public: + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef typename unordered_map::const_iterator + IdMapIterator; + typedef typename unordered_map::const_iterator + FinalWeightIterator; + + + EditFstData() : num_new_states_(0) { + SetEmptyAndDeleteKeysForInternalMaps(); + } + + EditFstData(const EditFstData &other) : + edits_(other.edits_), + external_to_internal_ids_(other.external_to_internal_ids_), + edited_final_weights_(other.edited_final_weights_), + num_new_states_(other.num_new_states_) { + } + + ~EditFstData() { + } + + static EditFstData *Read(istream &strm, + const FstReadOptions &opts); + + bool Write(ostream &strm, const FstWriteOptions &opts) const { + // Serialize all private data members of this class. + FstWriteOptions edits_opts(opts); + edits_opts.write_header = true; // Force writing contained header. + edits_.Write(strm, edits_opts); + WriteType(strm, external_to_internal_ids_); + WriteType(strm, edited_final_weights_); + WriteType(strm, num_new_states_); + if (!strm) { + LOG(ERROR) << "EditFstData::Write: write failed: " << opts.source; + return false; + } + return true; + } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + StateId NumNewStates() const { + return num_new_states_; + } + + // accessor methods for the fst holding edited states + StateId EditedStart() const { + return edits_.Start(); + } + + Weight Final(StateId s, const WrappedFstT *wrapped) const { + FinalWeightIterator final_weight_it = GetFinalWeightIterator(s); + if (final_weight_it == NotInFinalWeightMap()) { + IdMapIterator it = GetEditedIdMapIterator(s); + return it == NotInEditedMap() ? + wrapped->Final(s) : edits_.Final(it->second); + } + else { + return final_weight_it->second; + } + } + + size_t NumArcs(StateId s, const WrappedFstT *wrapped) const { + IdMapIterator it = GetEditedIdMapIterator(s); + return it == NotInEditedMap() ? + wrapped->NumArcs(s) : edits_.NumArcs(it->second); + } + + size_t NumInputEpsilons(StateId s, const WrappedFstT *wrapped) const { + IdMapIterator it = GetEditedIdMapIterator(s); + return it == NotInEditedMap() ? + wrapped->NumInputEpsilons(s) : + edits_.NumInputEpsilons(it->second); + } + + size_t NumOutputEpsilons(StateId s, const WrappedFstT *wrapped) const { + IdMapIterator it = GetEditedIdMapIterator(s); + return it == NotInEditedMap() ? + wrapped->NumOutputEpsilons(s) : + edits_.NumOutputEpsilons(it->second); + } + + void SetEditedProperties(uint64 props, uint64 mask) { + edits_.SetProperties(props, mask); + } + + // non-const MutableFst operations + + // Sets the start state for this fst. + void SetStart(StateId s) { + edits_.SetStart(s); + } + + // Sets the final state for this fst. + Weight SetFinal(StateId s, Weight w, const WrappedFstT *wrapped) { + Weight old_weight = Final(s, wrapped); + IdMapIterator it = GetEditedIdMapIterator(s); + // if we haven't already edited state s, don't add it to edited_ (which can + // be expensive if s has many transitions); just use the + // edited_final_weights_ map + if (it == NotInEditedMap()) { + edited_final_weights_[s] = w; + } + else { + edits_.SetFinal(GetEditableInternalId(s, wrapped), w); + } + return old_weight; + } + + // Adds a new state to this fst, initially with no arcs. + StateId AddState(StateId curr_num_states) { + StateId internal_state_id = edits_.AddState(); + StateId external_state_id = curr_num_states; + external_to_internal_ids_[external_state_id] = internal_state_id; + num_new_states_++; + return external_state_id; + } + + // Adds the specified arc to the specified state of this fst. + const A *AddArc(StateId s, const Arc &arc, const WrappedFstT *wrapped) { + StateId internal_id = GetEditableInternalId(s, wrapped); + + size_t num_arcs = edits_.NumArcs(internal_id); + ArcIterator arc_it(edits_, internal_id); + const A *prev_arc = NULL; + if (num_arcs > 0) { + // grab the final arc associated with this state in edits_ + arc_it.Seek(num_arcs - 1); + prev_arc = &(arc_it.Value()); + } + edits_.AddArc(internal_id, arc); + return prev_arc; + } + + void DeleteStates() { + edits_.DeleteStates(); + num_new_states_ = 0; + external_to_internal_ids_.clear(); + edited_final_weights_.clear(); + } + + // Removes all but the first n outgoing arcs of the specified state. + void DeleteArcs(StateId s, size_t n, const WrappedFstT *wrapped) { + edits_.DeleteArcs(GetEditableInternalId(s, wrapped), n); + } + + // Removes all outgoing arcs from the specified state. + void DeleteArcs(StateId s, const WrappedFstT *wrapped) { + edits_.DeleteArcs(GetEditableInternalId(s, wrapped)); + } + + // end methods for non-const MutableFst operations + + // Provides information for the generic arc iterator. + void InitArcIterator(StateId s, ArcIteratorData *data, + const WrappedFstT *wrapped) const { + IdMapIterator id_map_it = GetEditedIdMapIterator(s); + if (id_map_it == NotInEditedMap()) { + VLOG(3) << "EditFstData::InitArcIterator: iterating on state " + << s << " of original fst"; + wrapped->InitArcIterator(s, data); + } else { + VLOG(2) << "EditFstData::InitArcIterator: iterating on edited state " + << s << " (internal state id: " << id_map_it->second << ")"; + edits_.InitArcIterator(id_map_it->second, data); + } + } + + // Provides information for the generic mutable arc iterator. + void InitMutableArcIterator(StateId s, MutableArcIteratorData *data, + const WrappedFstT *wrapped) { + data->base = + new MutableArcIterator(&edits_, + GetEditableInternalId(s, wrapped)); + } + + // Prints out the map from external to internal state id's (for debugging + // purposes). + void PrintMap() { + for (IdMapIterator map_it = external_to_internal_ids_.begin(); + map_it != NotInEditedMap(); ++map_it) { + LOG(INFO) << "(external,internal)=(" + << map_it->first << "," << map_it->second << ")"; + } + } + + + private: + void SetEmptyAndDeleteKeysForInternalMaps() { + } + + // Returns the iterator of the map from external to internal state id's + // of edits_ for the specified external state id. + IdMapIterator GetEditedIdMapIterator(StateId s) const { + return external_to_internal_ids_.find(s); + } + IdMapIterator NotInEditedMap() const { + return external_to_internal_ids_.end(); + } + + FinalWeightIterator GetFinalWeightIterator(StateId s) const { + return edited_final_weights_.find(s); + } + FinalWeightIterator NotInFinalWeightMap() const { + return edited_final_weights_.end(); + } + + // Returns the internal state id of the specified external id if the state has + // already been made editable, or else copies the state from wrapped_ + // to edits_ and returns the state id of the newly editable state in edits_. + // + // \return makes the specified state editable if it isn't already and returns + // its state id in edits_ + StateId GetEditableInternalId(StateId s, const WrappedFstT *wrapped) { + IdMapIterator id_map_it = GetEditedIdMapIterator(s); + if (id_map_it == NotInEditedMap()) { + StateId new_internal_id = edits_.AddState(); + VLOG(2) << "EditFstData::GetEditableInternalId: editing state " << s + << " of original fst; new internal state id:" << new_internal_id; + external_to_internal_ids_[s] = new_internal_id; + for (ArcIterator< Fst > arc_iterator(*wrapped, s); + !arc_iterator.Done(); + arc_iterator.Next()) { + edits_.AddArc(new_internal_id, arc_iterator.Value()); + } + // copy the final weight + FinalWeightIterator final_weight_it = GetFinalWeightIterator(s); + if (final_weight_it == NotInFinalWeightMap()) { + edits_.SetFinal(new_internal_id, wrapped->Final(s)); + } else { + edits_.SetFinal(new_internal_id, final_weight_it->second); + edited_final_weights_.erase(s); + } + return new_internal_id; + } else { + return id_map_it->second; + } + } + + // A mutable fst (by default, a VectorFst) to contain new states, and/or + // copies of states from a wrapped ExpandedFst that have been modified in + // some way. + MutableFstT edits_; + // A mapping from external state id's to the internal id's of states that + // appear in edits_. + unordered_map external_to_internal_ids_; + // A mapping from external state id's to final state weights assigned to + // those states. The states in this map are *only* those whose final weight + // has been modified; if any other part of the state has been modified, + // the entire state is copied to edits_, and all modifications reside there. + unordered_map edited_final_weights_; + // The number of new states added to this mutable fst impl, which is <= the + // number of states in edits_ (since edits_ contains both edited *and* new + // states). + StateId num_new_states_; + RefCounter ref_count_; +}; + +// EditFstData method implementations: just the Read method. +template +EditFstData * +EditFstData::Read(istream &strm, + const FstReadOptions &opts) { + EditFstData *data = + new EditFstData(); + // next read in MutabelFstT machine that stores edits + FstReadOptions edits_opts(opts); + edits_opts.header = 0; // Contained header was written out, so read it in. + + // Because our internal representation of edited states is a solid object + // of type MutableFstT (defaults to VectorFst) and not a pointer, + // and because the static Read method allocates a new object on the heap, + // we need to call Read, check if there was a failure, use + // MutableFstT::operator= to assign the object (not the pointer) to the + // edits_ data member (which will increase the ref count by 1 on the impl) + // and, finally, delete the heap-allocated object. + MutableFstT *edits = MutableFstT::Read(strm, edits_opts); + if (!edits) { + return 0; + } + data->edits_ = *edits; + delete edits; + // finally, read in rest of private data members + ReadType(strm, &data->external_to_internal_ids_); + ReadType(strm, &data->edited_final_weights_); + ReadType(strm, &data->num_new_states_); + if (!strm) { + LOG(ERROR) << "EditFst::Read: read failed: " << opts.source; + return 0; + } + return data; +} + +// This class enables non-destructive edit operations on a wrapped ExpandedFst. +// The implementation uses copy-on-write semantics at the node level: if a user +// has an underlying fst on which he or she wants to perform a relatively small +// number of edits (read: mutations), then this implementation will copy the +// edited node to an internal MutableFst and perform any edits in situ on that +// copied node. This class supports all the methods of MutableFst except for +// DeleteStates(const vector &); thus, new nodes may also be added, and +// one may add transitions from existing nodes of the wrapped fst to new nodes. +// +// template parameters: +// A the type of arc to use +// WrappedFstT the type of fst wrapped by the EditFst instance that +// this EditFstImpl instance is backing +// MutableFstT the type of mutable fst to use internally for edited states; +// crucially, MutableFstT::Copy(false) *must* yield an fst that is +// thread-safe for reading (VectorFst, for example, has this property) +template , + typename MutableFstT = VectorFst > +class EditFstImpl : public FstImpl { + public: + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::WriteHeader; + + typedef A Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + // Constructs an editable fst implementation with no states. Effectively, + // this initially-empty fst will in every way mimic the behavior of + // a VectorFst--more precisely, a VectorFstImpl instance--but with slightly + // slower performance (by a constant factor), due to the fact that + // this class maintains a mapping between external state id's and + // their internal equivalents. + EditFstImpl() { + FstImpl::SetType("edit"); + wrapped_ = new MutableFstT(); + InheritPropertiesFromWrapped(); + data_ = new EditFstData(); + } + + // Wraps the specified ExpandedFst. This constructor requires that the + // specified Fst is an ExpandedFst instance. This requirement is only enforced + // at runtime. (See below for the reason.) + // + // This library uses the pointer-to-implementation or "PIMPL" design pattern. + // In particular, to make it convenient to bind an implementation class to its + // interface, there are a pair of template "binder" classes, one for immutable + // and one for mutable fst's (ImplToFst and ImplToMutableFst, respectively). + // As it happens, the API for the ImplToMutableFst class requires that + // the implementation class--the template parameter "I"--have a constructor + // taking a const Fst reference. Accordingly, the constructor here must + // perform a static_cast to the WrappedFstT type required by EditFst and + // therefore EditFstImpl. + explicit EditFstImpl(const Fst &wrapped) + : wrapped_(static_cast(wrapped.Copy())) { + FstImpl::SetType("edit"); + + data_ = new EditFstData(); + // have edits_ inherit all properties from wrapped_ + data_->SetEditedProperties(wrapped_->Properties(kFstProperties, false), + kFstProperties); + InheritPropertiesFromWrapped(); + } + + // A copy constructor for this implementation class, used to implement + // the Copy() method of the Fst interface. + EditFstImpl(const EditFstImpl &impl) + : wrapped_(static_cast(impl.wrapped_->Copy(true))), + data_(impl.data_) { + data_->IncrRefCount(); + SetProperties(impl.Properties()); + } + + ~EditFstImpl() { + delete wrapped_; + if (!data_->DecrRefCount()) { + delete data_; + } + } + + // const Fst/ExpandedFst operations, declared in the Fst and ExpandedFst + // interfaces + StateId Start() const { + StateId edited_start = data_->EditedStart(); + return edited_start == kNoStateId ? wrapped_->Start() : edited_start; + } + + Weight Final(StateId s) const { + return data_->Final(s, wrapped_); + } + + size_t NumArcs(StateId s) const { + return data_->NumArcs(s, wrapped_); + } + + size_t NumInputEpsilons(StateId s) const { + return data_->NumInputEpsilons(s, wrapped_); + } + + size_t NumOutputEpsilons(StateId s) const { + return data_->NumOutputEpsilons(s, wrapped_); + } + + StateId NumStates() const { + return wrapped_->NumStates() + data_->NumNewStates(); + } + + static EditFstImpl * + Read(istream &strm, + const FstReadOptions &opts); + + bool Write(ostream &strm, const FstWriteOptions &opts) const { + FstHeader hdr; + hdr.SetStart(Start()); + hdr.SetNumStates(NumStates()); + FstWriteOptions header_opts(opts); + header_opts.write_isymbols = false; // Let contained FST hold any symbols. + header_opts.write_osymbols = false; + WriteHeader(strm, header_opts, kFileVersion, &hdr); + + // First, serialize wrapped fst to stream. + FstWriteOptions wrapped_opts(opts); + wrapped_opts.write_header = true; // Force writing contained header. + wrapped_->Write(strm, wrapped_opts); + + data_->Write(strm, opts); + + strm.flush(); + if (!strm) { + LOG(ERROR) << "EditFst::Write: write failed: " << opts.source; + return false; + } + return true; + } + // end const Fst operations + + // non-const MutableFst operations + + // Sets the start state for this fst. + void SetStart(StateId s) { + MutateCheck(); + data_->SetStart(s); + SetProperties(SetStartProperties(FstImpl::Properties())); + } + + // Sets the final state for this fst. + void SetFinal(StateId s, Weight w) { + MutateCheck(); + Weight old_weight = data_->SetFinal(s, w, wrapped_); + SetProperties(SetFinalProperties(FstImpl::Properties(), old_weight, w)); + } + + // Adds a new state to this fst, initially with no arcs. + StateId AddState() { + MutateCheck(); + SetProperties(AddStateProperties(FstImpl::Properties())); + return data_->AddState(NumStates()); + } + + // Adds the specified arc to the specified state of this fst. + void AddArc(StateId s, const Arc &arc) { + MutateCheck(); + const A *prev_arc = data_->AddArc(s, arc, wrapped_); + SetProperties(AddArcProperties(FstImpl::Properties(), s, arc, prev_arc)); + } + + void DeleteStates(const vector& dstates) { + FSTERROR() << ": EditFstImpl::DeleteStates(const std::vector&): " + << " not implemented"; + SetProperties(kError, kError); + } + + // Deletes all states in this fst. + void DeleteStates(); + + // Removes all but the first n outgoing arcs of the specified state. + void DeleteArcs(StateId s, size_t n) { + MutateCheck(); + data_->DeleteArcs(s, n, wrapped_); + SetProperties(DeleteArcsProperties(FstImpl::Properties())); + } + + // Removes all outgoing arcs from the specified state. + void DeleteArcs(StateId s) { + MutateCheck(); + data_->DeleteArcs(s, wrapped_); + SetProperties(DeleteArcsProperties(FstImpl::Properties())); + } + + void ReserveStates(StateId s) { + } + + void ReserveArcs(StateId s, size_t n) { + } + + // end non-const MutableFst operations + + // Provides information for the generic state iterator. + void InitStateIterator(StateIteratorData *data) const { + data->base = 0; + data->nstates = NumStates(); + } + + // Provides information for the generic arc iterator. + void InitArcIterator(StateId s, ArcIteratorData *data) const { + data_->InitArcIterator(s, data, wrapped_); + } + + // Provides information for the generic mutable arc iterator. + void InitMutableArcIterator(StateId s, MutableArcIteratorData *data) { + MutateCheck(); + data_->InitMutableArcIterator(s, data, wrapped_); + } + + private: + typedef typename unordered_map::const_iterator + IdMapIterator; + typedef typename unordered_map::const_iterator + FinalWeightIterator; + // Properties always true of this Fst class + static const uint64 kStaticProperties = kExpanded | kMutable; + // Current file format version + static const int kFileVersion = 2; + // Minimum file format version supported + static const int kMinFileVersion = 2; + + // Causes this fst to inherit all the properties from its wrapped fst, except + // for the two properties that always apply to EditFst instances: kExpanded + // and kMutable. + void InheritPropertiesFromWrapped() { + SetProperties(wrapped_->Properties(kCopyProperties, false) | + kStaticProperties); + SetInputSymbols(wrapped_->InputSymbols()); + SetOutputSymbols(wrapped_->OutputSymbols()); + } + + // This method ensures that any operations that alter the mutable data + // portion of this EditFstImpl cause the data_ member to be copied when its + // reference count is greater than 1. Note that this method is distinct from + // MutableFst::Mutate, which gets invoked whenever one of the basic mutation + // methods defined in MutableFst is invoked, such as SetInputSymbols. + // The MutateCheck here in EditFstImpl is invoked whenever one of the + // mutating methods specifically related to the types of edits provided + // by EditFst is performed, such as changing an arc of an existing state + // of the wrapped fst via a MutableArcIterator, or adding a new state via + // AddState(). + void MutateCheck() { + if (data_->RefCount() > 1) { + EditFstData *data_copy = + new EditFstData(*data_); + if (data_ && !data_->DecrRefCount()) { + delete data_; + } + data_ = data_copy; + } + } + + // The fst that this fst wraps. The purpose of this class is to enable + // non-destructive edits on this wrapped fst. + const WrappedFstT *wrapped_; + // The mutable data for this EditFst instance, with delegates for all the + // methods that can mutate data. + EditFstData *data_; +}; + +template +const uint64 EditFstImpl::kStaticProperties; + +// EditFstImpl IMPLEMENTATION STARTS HERE + +template +inline void EditFstImpl::DeleteStates() { + data_->DeleteStates(); + delete wrapped_; + // we are deleting all states, so just forget about pointer to wrapped_ + // and do what default constructor does: set wrapped_ to a new VectorFst + wrapped_ = new MutableFstT(); + uint64 newProps = DeleteAllStatesProperties(FstImpl::Properties(), + kStaticProperties); + FstImpl::SetProperties(newProps); +} + +template +EditFstImpl * +EditFstImpl::Read(istream &strm, + const FstReadOptions &opts) { + EditFstImpl *impl = new EditFstImpl(); + FstHeader hdr; + if (!impl->ReadHeader(strm, opts, kMinFileVersion, &hdr)) { + return 0; + } + impl->SetStart(hdr.Start()); + + // first, read in wrapped fst + FstReadOptions wrapped_opts(opts); + wrapped_opts.header = 0; // Contained header was written out, so read it in. + Fst *wrapped_fst = Fst::Read(strm, wrapped_opts); + if (!wrapped_fst) { + return 0; + } + impl->wrapped_ = static_cast(wrapped_fst); + + impl->data_ = EditFstData::Read(strm, opts); + + if (!impl->data_) { + delete wrapped_fst; + return 0; + } + + return impl; +} + +// END EditFstImpl IMPLEMENTATION + +// Concrete, editable FST. This class attaches interface to implementation. +template , + typename MutableFstT = VectorFst > +class EditFst : + public ImplToMutableFst< EditFstImpl > { + public: + friend class MutableArcIterator< EditFst >; + + typedef A Arc; + typedef typename A::StateId StateId; + typedef EditFstImpl Impl; + + EditFst() : ImplToMutableFst(new Impl()) {} + + explicit EditFst(const Fst &fst) : + ImplToMutableFst(new Impl(fst)) {} + + explicit EditFst(const WrappedFstT &fst) : + ImplToMutableFst(new Impl(fst)) {} + + // See Fst<>::Copy() for doc. + EditFst(const EditFst &fst, bool safe = false) : + ImplToMutableFst(fst, safe) {} + + virtual ~EditFst() {} + + // Get a copy of this EditFst. See Fst<>::Copy() for further doc. + virtual EditFst *Copy(bool safe = false) const { + return new EditFst(*this, safe); + } + + EditFst & + operator=(const EditFst &fst) { + SetImpl(fst.GetImpl(), false); + return *this; + } + + virtual EditFst &operator=(const Fst &fst) { + if (this != &fst) { + SetImpl(new Impl(fst)); + } + return *this; + } + + // Read an EditFst from an input stream; return NULL on error. + static EditFst * + Read(istream &strm, + const FstReadOptions &opts) { + Impl* impl = Impl::Read(strm, opts); + return impl ? new EditFst(impl) : 0; + } + + // Read an EditFst from a file; return NULL on error. + // Empty filename reads from standard input. + static EditFst *Read(const string &filename) { + Impl* impl = ImplToExpandedFst >::Read(filename); + return impl ? new EditFst(impl) : 0; + } + + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + return GetImpl()->Write(strm, opts); + } + + virtual bool Write(const string &filename) const { + return Fst::WriteFile(filename); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + virtual + void InitMutableArcIterator(StateId s, MutableArcIteratorData *data) { + GetImpl()->InitMutableArcIterator(s, data); + } + private: + explicit EditFst(Impl *impl) : ImplToMutableFst(impl) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst< Impl, MutableFst >::GetImpl(); } + + void SetImpl(Impl *impl, bool own_impl = true) { + ImplToFst< Impl, MutableFst >::SetImpl(impl, own_impl); + } +}; + +} // namespace fst + +#endif // FST_LIB_EDIT_FST_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/encode.h b/extlibs/openfstwin-1.3.1/include/fst/encode.h new file mode 100755 index 00000000000..dcb5d443a8c --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/encode.h @@ -0,0 +1,599 @@ +// encode.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Class to encode and decoder an fst. + +#ifndef FST_LIB_ENCODE_H__ +#define FST_LIB_ENCODE_H__ + +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +static const uint32 kEncodeLabels = 0x0001; +static const uint32 kEncodeWeights = 0x0002; +static const uint32 kEncodeFlags = 0x0003; // All non-internal flags + +static const uint32 kEncodeHasISymbols = 0x0004; // For internal use +static const uint32 kEncodeHasOSymbols = 0x0008; // For internal use + +enum EncodeType { ENCODE = 1, DECODE = 2 }; + +// Identifies stream data as an encode table (and its endianity) +static const int32 kEncodeMagicNumber = 2129983209; + + +// The following class encapsulates implementation details for the +// encoding and decoding of label/weight tuples used for encoding +// and decoding of Fsts. The EncodeTable is bidirectional. I.E it +// stores both the Tuple of encode labels and weights to a unique +// label, and the reverse. +template class EncodeTable { + public: + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + // Encoded data consists of arc input/output labels and arc weight + struct Tuple { + Tuple() {} + Tuple(Label ilabel_, Label olabel_, Weight weight_) + : ilabel(ilabel_), olabel(olabel_), weight(weight_) {} + Tuple(const Tuple& tuple) + : ilabel(tuple.ilabel), olabel(tuple.olabel), weight(tuple.weight) {} + + Label ilabel; + Label olabel; + Weight weight; + }; + + // Comparison object for hashing EncodeTable Tuple(s). + class TupleEqual { + public: + bool operator()(const Tuple* x, const Tuple* y) const { + return (x->ilabel == y->ilabel && + x->olabel == y->olabel && + x->weight == y->weight); + } + }; + + // Hash function for EncodeTabe Tuples. Based on the encode flags + // we either hash the labels, weights or combination of them. + class TupleKey { + public: + TupleKey() + : encode_flags_(kEncodeLabels | kEncodeWeights) {} + + TupleKey(const TupleKey& key) + : encode_flags_(key.encode_flags_) {} + + explicit TupleKey(uint32 encode_flags) + : encode_flags_(encode_flags) {} + + size_t operator()(const Tuple* x) const { + size_t hash = x->ilabel; + const int lshift = 5; + const int rshift = CHAR_BIT * sizeof(size_t) - 5; + if (encode_flags_ & kEncodeLabels) + hash = hash << lshift ^ hash >> rshift ^ x->olabel; + if (encode_flags_ & kEncodeWeights) + hash = hash << lshift ^ hash >> rshift ^ x->weight.Hash(); + return hash; + } + + private: + int32 encode_flags_; + }; + + typedef unordered_map EncodeHash; + + explicit EncodeTable(uint32 encode_flags) + : flags_(encode_flags), + encode_hash_(1024, TupleKey(encode_flags)), + isymbols_(0), osymbols_(0) {} + + ~EncodeTable() { + for (size_t i = 0; i < encode_tuples_.size(); ++i) { + delete encode_tuples_[i]; + } + delete isymbols_; + delete osymbols_; + } + + // Given an arc encode either input/ouptut labels or input/costs or both + Label Encode(const A &arc) { + const Tuple tuple(arc.ilabel, + flags_ & kEncodeLabels ? arc.olabel : 0, + flags_ & kEncodeWeights ? arc.weight : Weight::One()); + typename EncodeHash::const_iterator it = encode_hash_.find(&tuple); + if (it == encode_hash_.end()) { + encode_tuples_.push_back(new Tuple(tuple)); + encode_hash_[encode_tuples_.back()] = encode_tuples_.size(); + return encode_tuples_.size(); + } else { + return it->second; + } + } + + // Given an arc, look up its encoded label. Returns kNoLabel if not found. + Label GetLabel(const A &arc) const { + const Tuple tuple(arc.ilabel, + flags_ & kEncodeLabels ? arc.olabel : 0, + flags_ & kEncodeWeights ? arc.weight : Weight::One()); + typename EncodeHash::const_iterator it = encode_hash_.find(&tuple); + if (it == encode_hash_.end()) { + return kNoLabel; + } else { + return it->second; + } + } + + // Given an encode arc Label decode back to input/output labels and costs + const Tuple* Decode(Label key) const { + if (key < 1 || key > encode_tuples_.size()) { + LOG(ERROR) << "EncodeTable::Decode: unknown decode key: " << key; + return 0; + } + return encode_tuples_[key - 1]; + } + + size_t Size() const { return encode_tuples_.size(); } + + bool Write(ostream &strm, const string &source) const; + + static EncodeTable *Read(istream &strm, const string &source); + + const uint32 flags() const { return flags_ & kEncodeFlags; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + + SymbolTable *InputSymbols() const { return isymbols_; } + + SymbolTable *OutputSymbols() const { return osymbols_; } + + void SetInputSymbols(const SymbolTable* syms) { + if (isymbols_) delete isymbols_; + if (syms) { + isymbols_ = syms->Copy(); + flags_ |= kEncodeHasISymbols; + } else { + isymbols_ = 0; + flags_ &= ~kEncodeHasISymbols; + } + } + + void SetOutputSymbols(const SymbolTable* syms) { + if (osymbols_) delete osymbols_; + if (syms) { + osymbols_ = syms->Copy(); + flags_ |= kEncodeHasOSymbols; + } else { + osymbols_ = 0; + flags_ &= ~kEncodeHasOSymbols; + } + } + + private: + uint32 flags_; + vector encode_tuples_; + EncodeHash encode_hash_; + RefCounter ref_count_; + SymbolTable *isymbols_; // Pre-encoded ilabel symbol table + SymbolTable *osymbols_; // Pre-encoded olabel symbol table + + DISALLOW_COPY_AND_ASSIGN(EncodeTable); +}; + +template inline +bool EncodeTable::Write(ostream &strm, const string &source) const { + WriteType(strm, kEncodeMagicNumber); + WriteType(strm, flags_); + int64 size = encode_tuples_.size(); + WriteType(strm, size); + for (size_t i = 0; i < size; ++i) { + const Tuple* tuple = encode_tuples_[i]; + WriteType(strm, tuple->ilabel); + WriteType(strm, tuple->olabel); + tuple->weight.Write(strm); + } + + if (flags_ & kEncodeHasISymbols) + isymbols_->Write(strm); + + if (flags_ & kEncodeHasOSymbols) + osymbols_->Write(strm); + + strm.flush(); + if (!strm) { + LOG(ERROR) << "EncodeTable::Write: write failed: " << source; + return false; + } + return true; +} + +template inline +EncodeTable *EncodeTable::Read(istream &strm, const string &source) { + int32 magic_number = 0; + ReadType(strm, &magic_number); + if (magic_number != kEncodeMagicNumber) { + LOG(ERROR) << "EncodeTable::Read: Bad encode table header: " << source; + return 0; + } + uint32 flags; + ReadType(strm, &flags); + EncodeTable *table = new EncodeTable(flags); + + int64 size; + ReadType(strm, &size); + if (!strm) { + LOG(ERROR) << "EncodeTable::Read: read failed: " << source; + return 0; + } + + for (size_t i = 0; i < size; ++i) { + Tuple* tuple = new Tuple(); + ReadType(strm, &tuple->ilabel); + ReadType(strm, &tuple->olabel); + tuple->weight.Read(strm); + if (!strm) { + LOG(ERROR) << "EncodeTable::Read: read failed: " << source; + return 0; + } + table->encode_tuples_.push_back(tuple); + table->encode_hash_[table->encode_tuples_.back()] = + table->encode_tuples_.size(); + } + + if (flags & kEncodeHasISymbols) + table->isymbols_ = SymbolTable::Read(strm, source); + + if (flags & kEncodeHasOSymbols) + table->osymbols_ = SymbolTable::Read(strm, source); + + return table; +} + + +// A mapper to encode/decode weighted transducers. Encoding of an +// Fst is useful for performing classical determinization or minimization +// on a weighted transducer by treating it as an unweighted acceptor over +// encoded labels. +// +// The Encode mapper stores the encoding in a local hash table (EncodeTable) +// This table is shared (and reference counted) between the encoder and +// decoder. A decoder has read only access to the EncodeTable. +// +// The EncodeMapper allows on the fly encoding of the machine. As the +// EncodeTable is generated the same table may by used to decode the machine +// on the fly. For example in the following sequence of operations +// +// Encode -> Determinize -> Decode +// +// we will use the encoding table generated during the encode step in the +// decode, even though the encoding is not complete. +// +template class EncodeMapper { + typedef typename A::Weight Weight; + typedef typename A::Label Label; + public: + EncodeMapper(uint32 flags, EncodeType type) + : flags_(flags), + type_(type), + table_(new EncodeTable(flags)), + error_(false) {} + + EncodeMapper(const EncodeMapper& mapper) + : flags_(mapper.flags_), + type_(mapper.type_), + table_(mapper.table_), + error_(false) { + table_->IncrRefCount(); + } + + // Copy constructor but setting the type, typically to DECODE + EncodeMapper(const EncodeMapper& mapper, EncodeType type) + : flags_(mapper.flags_), + type_(type), + table_(mapper.table_), + error_(mapper.error_) { + table_->IncrRefCount(); + } + + ~EncodeMapper() { + if (!table_->DecrRefCount()) delete table_; + } + + A operator()(const A &arc); + + MapFinalAction FinalAction() const { + return (type_ == ENCODE && (flags_ & kEncodeWeights)) ? + MAP_REQUIRE_SUPERFINAL : MAP_NO_SUPERFINAL; + } + + MapSymbolsAction InputSymbolsAction() const { return MAP_CLEAR_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 inprops) { + uint64 outprops = inprops; + if (error_) outprops |= kError; + + uint64 mask = kFstProperties; + if (flags_ & kEncodeLabels) + mask &= kILabelInvariantProperties & kOLabelInvariantProperties; + if (flags_ & kEncodeWeights) + mask &= kILabelInvariantProperties & kWeightInvariantProperties & + (type_ == ENCODE ? kAddSuperFinalProperties : + kRmSuperFinalProperties); + + return outprops & mask; + } + + const uint32 flags() const { return flags_; } + const EncodeType type() const { return type_; } + const EncodeTable &table() const { return *table_; } + + bool Write(ostream &strm, const string& source) { + return table_->Write(strm, source); + } + + bool Write(const string& filename) { + ofstream strm(filename.c_str(), ofstream::out | ofstream::binary); + if (!strm) { + LOG(ERROR) << "EncodeMap: Can't open file: " << filename; + return false; + } + return Write(strm, filename); + } + + static EncodeMapper *Read(istream &strm, + const string& source, + EncodeType type = ENCODE) { + EncodeTable *table = EncodeTable::Read(strm, source); + return table ? new EncodeMapper(table->flags(), type, table) : 0; + } + + static EncodeMapper *Read(const string& filename, + EncodeType type = ENCODE) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "EncodeMap: Can't open file: " << filename; + return NULL; + } + return Read(strm, filename, type); + } + + SymbolTable *InputSymbols() const { return table_->InputSymbols(); } + + SymbolTable *OutputSymbols() const { return table_->OutputSymbols(); } + + void SetInputSymbols(const SymbolTable* syms) { + table_->SetInputSymbols(syms); + } + + void SetOutputSymbols(const SymbolTable* syms) { + table_->SetOutputSymbols(syms); + } + + private: + uint32 flags_; + EncodeType type_; + EncodeTable* table_; + bool error_; + + explicit EncodeMapper(uint32 flags, EncodeType type, EncodeTable *table) + : flags_(flags), type_(type), table_(table) {} + void operator=(const EncodeMapper &); // Disallow. +}; + +template inline +A EncodeMapper::operator()(const A &arc) { + if (type_ == ENCODE) { // labels and/or weights to single label + if ((arc.nextstate == kNoStateId && !(flags_ & kEncodeWeights)) || + (arc.nextstate == kNoStateId && (flags_ & kEncodeWeights) && + arc.weight == Weight::Zero())) { + return arc; + } else { + Label label = table_->Encode(arc); + return A(label, + flags_ & kEncodeLabels ? label : arc.olabel, + flags_ & kEncodeWeights ? Weight::One() : arc.weight, + arc.nextstate); + } + } else { // type_ == DECODE + if (arc.nextstate == kNoStateId) { + return arc; + } else { + if (arc.ilabel == 0) return arc; + if (flags_ & kEncodeLabels && arc.ilabel != arc.olabel) { + FSTERROR() << "EncodeMapper: Label-encoded arc has different " + "input and output labels"; + error_ = true; + } + if (flags_ & kEncodeWeights && arc.weight != Weight::One()) { + FSTERROR() << + "EncodeMapper: Weight-encoded arc has non-trivial weight"; + error_ = true; + } + const typename EncodeTable::Tuple* tuple = table_->Decode(arc.ilabel); + if (!tuple) { + FSTERROR() << "EncodeMapper: decode failed"; + error_ = true; + return A(kNoLabel, kNoLabel, Weight::NoWeight(), arc.nextstate); + } else { + return A(tuple->ilabel, + flags_ & kEncodeLabels ? tuple->olabel : arc.olabel, + flags_ & kEncodeWeights ? tuple->weight : arc.weight, + arc.nextstate); + } + } + } +} + + +// Complexity: O(nstates + narcs) +template inline +void Encode(MutableFst *fst, EncodeMapper* mapper) { + mapper->SetInputSymbols(fst->InputSymbols()); + mapper->SetOutputSymbols(fst->OutputSymbols()); + ArcMap(fst, mapper); +} + +template inline +void Decode(MutableFst* fst, const EncodeMapper& mapper) { + ArcMap(fst, EncodeMapper(mapper, DECODE)); + RmFinalEpsilon(fst); + fst->SetInputSymbols(mapper.InputSymbols()); + fst->SetOutputSymbols(mapper.OutputSymbols()); +} + + +// On the fly label and/or weight encoding of input Fst +// +// Complexity: +// - Constructor: O(1) +// - Traversal: O(nstates_visited + narcs_visited), assuming constant +// time to visit an input state or arc. +template +class EncodeFst : public ArcMapFst > { + public: + typedef A Arc; + typedef EncodeMapper C; + typedef ArcMapFstImpl< A, A, EncodeMapper > Impl; + using ImplToFst::GetImpl; + + EncodeFst(const Fst &fst, EncodeMapper* encoder) + : ArcMapFst(fst, encoder, ArcMapFstOptions()) { + encoder->SetInputSymbols(fst.InputSymbols()); + encoder->SetOutputSymbols(fst.OutputSymbols()); + } + + EncodeFst(const Fst &fst, const EncodeMapper& encoder) + : ArcMapFst(fst, encoder, ArcMapFstOptions()) {} + + // See Fst<>::Copy() for doc. + EncodeFst(const EncodeFst &fst, bool copy = false) + : ArcMapFst(fst, copy) {} + + // Get a copy of this EncodeFst. See Fst<>::Copy() for further doc. + virtual EncodeFst *Copy(bool safe = false) const { + if (safe) { + FSTERROR() << "EncodeFst::Copy(true): not allowed."; + GetImpl()->SetProperties(kError, kError); + } + return new EncodeFst(*this); + } +}; + + +// On the fly label and/or weight encoding of input Fst +// +// Complexity: +// - Constructor: O(1) +// - Traversal: O(nstates_visited + narcs_visited), assuming constant +// time to visit an input state or arc. +template +class DecodeFst : public ArcMapFst > { + public: + typedef A Arc; + typedef EncodeMapper C; + typedef ArcMapFstImpl< A, A, EncodeMapper > Impl; + using ImplToFst::GetImpl; + + DecodeFst(const Fst &fst, const EncodeMapper& encoder) + : ArcMapFst(fst, + EncodeMapper(encoder, DECODE), + ArcMapFstOptions()) { + GetImpl()->SetInputSymbols(encoder.InputSymbols()); + GetImpl()->SetOutputSymbols(encoder.OutputSymbols()); + } + + // See Fst<>::Copy() for doc. + DecodeFst(const DecodeFst &fst, bool safe = false) + : ArcMapFst(fst, safe) {} + + // Get a copy of this DecodeFst. See Fst<>::Copy() for further doc. + virtual DecodeFst *Copy(bool safe = false) const { + return new DecodeFst(*this, safe); + } +}; + + +// Specialization for EncodeFst. +template +class StateIterator< EncodeFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const EncodeFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for EncodeFst. +template +class ArcIterator< EncodeFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const EncodeFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Specialization for DecodeFst. +template +class StateIterator< DecodeFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const DecodeFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for DecodeFst. +template +class ArcIterator< DecodeFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const DecodeFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Useful aliases when using StdArc. +typedef EncodeFst StdEncodeFst; + +typedef DecodeFst StdDecodeFst; + +} // namespace fst + +#endif // FST_LIB_ENCODE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/encode.h.bak b/extlibs/openfstwin-1.3.1/include/fst/encode.h.bak new file mode 100755 index 00000000000..08b84cbea70 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/encode.h.bak @@ -0,0 +1,599 @@ +// encode.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Class to encode and decoder an fst. + +#ifndef FST_LIB_ENCODE_H__ +#define FST_LIB_ENCODE_H__ + +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +static const uint32 kEncodeLabels = 0x0001; +static const uint32 kEncodeWeights = 0x0002; +static const uint32 kEncodeFlags = 0x0003; // All non-internal flags + +static const uint32 kEncodeHasISymbols = 0x0004; // For internal use +static const uint32 kEncodeHasOSymbols = 0x0008; // For internal use + +enum EncodeType { ENCODE = 1, DECODE = 2 }; + +// Identifies stream data as an encode table (and its endianity) +static const int32 kEncodeMagicNumber = 2129983209; + + +// The following class encapsulates implementation details for the +// encoding and decoding of label/weight tuples used for encoding +// and decoding of Fsts. The EncodeTable is bidirectional. I.E it +// stores both the Tuple of encode labels and weights to a unique +// label, and the reverse. +template class EncodeTable { + public: + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + // Encoded data consists of arc input/output labels and arc weight + struct Tuple { + Tuple() {} + Tuple(Label ilabel_, Label olabel_, Weight weight_) + : ilabel(ilabel_), olabel(olabel_), weight(weight_) {} + Tuple(const Tuple& tuple) + : ilabel(tuple.ilabel), olabel(tuple.olabel), weight(tuple.weight) {} + + Label ilabel; + Label olabel; + Weight weight; + }; + + // Comparison object for hashing EncodeTable Tuple(s). + class TupleEqual { + public: + bool operator()(const Tuple* x, const Tuple* y) const { + return (x->ilabel == y->ilabel && + x->olabel == y->olabel && + x->weight == y->weight); + } + }; + + // Hash function for EncodeTabe Tuples. Based on the encode flags + // we either hash the labels, weights or combination of them. + class TupleKey { + public: + TupleKey() + : encode_flags_(kEncodeLabels | kEncodeWeights) {} + + TupleKey(const TupleKey& key) + : encode_flags_(key.encode_flags_) {} + + explicit TupleKey(uint32 encode_flags) + : encode_flags_(encode_flags) {} + + size_t operator()(const Tuple* x) const { + size_t hash = x->ilabel; + const int lshift = 5; + const int rshift = CHAR_BIT * sizeof(size_t) - 5; + if (encode_flags_ & kEncodeLabels) + hash = hash << lshift ^ hash >> rshift ^ x->olabel; + if (encode_flags_ & kEncodeWeights) + hash = hash << lshift ^ hash >> rshift ^ x->weight.Hash(); + return hash; + } + + private: + int32 encode_flags_; + }; + + typedef unordered_map EncodeHash; + + explicit EncodeTable(uint32 encode_flags) + : flags_(encode_flags), + encode_hash_(1024, TupleKey(encode_flags)), + isymbols_(0), osymbols_(0) {} + + ~EncodeTable() { + for (size_t i = 0; i < encode_tuples_.size(); ++i) { + delete encode_tuples_[i]; + } + delete isymbols_; + delete osymbols_; + } + + // Given an arc encode either input/ouptut labels or input/costs or both + Label Encode(const A &arc) { + const Tuple tuple(arc.ilabel, + flags_ & kEncodeLabels ? arc.olabel : 0, + flags_ & kEncodeWeights ? arc.weight : Weight::One()); + typename EncodeHash::const_iterator it = encode_hash_.find(&tuple); + if (it == encode_hash_.end()) { + encode_tuples_.push_back(new Tuple(tuple)); + encode_hash_[encode_tuples_.back()] = encode_tuples_.size(); + return encode_tuples_.size(); + } else { + return it->second; + } + } + + // Given an arc, look up its encoded label. Returns kNoLabel if not found. + Label GetLabel(const A &arc) const { + const Tuple tuple(arc.ilabel, + flags_ & kEncodeLabels ? arc.olabel : 0, + flags_ & kEncodeWeights ? arc.weight : Weight::One()); + typename EncodeHash::const_iterator it = encode_hash_.find(&tuple); + if (it == encode_hash_.end()) { + return kNoLabel; + } else { + return it->second; + } + } + + // Given an encode arc Label decode back to input/output labels and costs + const Tuple* Decode(Label key) const { + if (key < 1 || key > encode_tuples_.size()) { + LOG(ERROR) << "EncodeTable::Decode: unknown decode key: " << key; + return 0; + } + return encode_tuples_[key - 1]; + } + + size_t Size() const { return encode_tuples_.size(); } + + bool Write(ostream &strm, const string &source) const; + + static EncodeTable *Read(istream &strm, const string &source); + + const uint32 flags() const { return flags_ & kEncodeFlags; } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + + SymbolTable *InputSymbols() const { return isymbols_; } + + SymbolTable *OutputSymbols() const { return osymbols_; } + + void SetInputSymbols(const SymbolTable* syms) { + if (isymbols_) delete isymbols_; + if (syms) { + isymbols_ = syms->Copy(); + flags_ |= kEncodeHasISymbols; + } else { + isymbols_ = 0; + flags_ &= ~kEncodeHasISymbols; + } + } + + void SetOutputSymbols(const SymbolTable* syms) { + if (osymbols_) delete osymbols_; + if (syms) { + osymbols_ = syms->Copy(); + flags_ |= kEncodeHasOSymbols; + } else { + osymbols_ = 0; + flags_ &= ~kEncodeHasOSymbols; + } + } + + private: + uint32 flags_; + vector encode_tuples_; + EncodeHash encode_hash_; + RefCounter ref_count_; + SymbolTable *isymbols_; // Pre-encoded ilabel symbol table + SymbolTable *osymbols_; // Pre-encoded olabel symbol table + + DISALLOW_COPY_AND_ASSIGN(EncodeTable); +}; + +template inline +bool EncodeTable::Write(ostream &strm, const string &source) const { + WriteType(strm, kEncodeMagicNumber); + WriteType(strm, flags_); + int64 size = encode_tuples_.size(); + WriteType(strm, size); + for (size_t i = 0; i < size; ++i) { + const Tuple* tuple = encode_tuples_[i]; + WriteType(strm, tuple->ilabel); + WriteType(strm, tuple->olabel); + tuple->weight.Write(strm); + } + + if (flags_ & kEncodeHasISymbols) + isymbols_->Write(strm); + + if (flags_ & kEncodeHasOSymbols) + osymbols_->Write(strm); + + strm.flush(); + if (!strm) { + LOG(ERROR) << "EncodeTable::Write: write failed: " << source; + return false; + } + return true; +} + +template inline +EncodeTable *EncodeTable::Read(istream &strm, const string &source) { + int32 magic_number = 0; + ReadType(strm, &magic_number); + if (magic_number != kEncodeMagicNumber) { + LOG(ERROR) << "EncodeTable::Read: Bad encode table header: " << source; + return 0; + } + uint32 flags; + ReadType(strm, &flags); + EncodeTable *table = new EncodeTable(flags); + + int64 size; + ReadType(strm, &size); + if (!strm) { + LOG(ERROR) << "EncodeTable::Read: read failed: " << source; + return 0; + } + + for (size_t i = 0; i < size; ++i) { + Tuple* tuple = new Tuple(); + ReadType(strm, &tuple->ilabel); + ReadType(strm, &tuple->olabel); + tuple->weight.Read(strm); + if (!strm) { + LOG(ERROR) << "EncodeTable::Read: read failed: " << source; + return 0; + } + table->encode_tuples_.push_back(tuple); + table->encode_hash_[table->encode_tuples_.back()] = + table->encode_tuples_.size(); + } + + if (flags & kEncodeHasISymbols) + table->isymbols_ = SymbolTable::Read(strm, source); + + if (flags & kEncodeHasOSymbols) + table->osymbols_ = SymbolTable::Read(strm, source); + + return table; +} + + +// A mapper to encode/decode weighted transducers. Encoding of an +// Fst is useful for performing classical determinization or minimization +// on a weighted transducer by treating it as an unweighted acceptor over +// encoded labels. +// +// The Encode mapper stores the encoding in a local hash table (EncodeTable) +// This table is shared (and reference counted) between the encoder and +// decoder. A decoder has read only access to the EncodeTable. +// +// The EncodeMapper allows on the fly encoding of the machine. As the +// EncodeTable is generated the same table may by used to decode the machine +// on the fly. For example in the following sequence of operations +// +// Encode -> Determinize -> Decode +// +// we will use the encoding table generated during the encode step in the +// decode, even though the encoding is not complete. +// +template class EncodeMapper { + typedef typename A::Weight Weight; + typedef typename A::Label Label; + public: + EncodeMapper(uint32 flags, EncodeType type) + : flags_(flags), + type_(type), + table_(new EncodeTable(flags)), + error_(false) {} + + EncodeMapper(const EncodeMapper& mapper) + : flags_(mapper.flags_), + type_(mapper.type_), + table_(mapper.table_), + error_(false) { + table_->IncrRefCount(); + } + + // Copy constructor but setting the type, typically to DECODE + EncodeMapper(const EncodeMapper& mapper, EncodeType type) + : flags_(mapper.flags_), + type_(type), + table_(mapper.table_), + error_(mapper.error_) { + table_->IncrRefCount(); + } + + ~EncodeMapper() { + if (!table_->DecrRefCount()) delete table_; + } + + A operator()(const A &arc); + + MapFinalAction FinalAction() const { + return (type_ == ENCODE && (flags_ & kEncodeWeights)) ? + MAP_REQUIRE_SUPERFINAL : MAP_NO_SUPERFINAL; + } + + MapSymbolsAction InputSymbolsAction() const { return MAP_CLEAR_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 inprops) { + uint64 outprops = inprops; + if (error_) outprops |= kError; + + uint64 mask = kFstProperties; + if (flags_ & kEncodeLabels) + mask &= kILabelInvariantProperties & kOLabelInvariantProperties; + if (flags_ & kEncodeWeights) + mask &= kILabelInvariantProperties & kWeightInvariantProperties & + (type_ == ENCODE ? kAddSuperFinalProperties : + kRmSuperFinalProperties); + + return outprops & mask; + } + + const uint32 flags() const { return flags_; } + const EncodeType type() const { return type_; } + const EncodeTable &table() const { return *table_; } + + bool Write(ostream &strm, const string& source) { + return table_->Write(strm, source); + } + + bool Write(const string& filename) { + ofstream strm(filename.c_str(), ofstream::out | ofstream::binary); + if (!strm) { + LOG(ERROR) << "EncodeMap: Can't open file: " << filename; + return false; + } + return Write(strm, filename); + } + + static EncodeMapper *Read(istream &strm, + const string& source, + EncodeType type = ENCODE) { + EncodeTable *table = EncodeTable::Read(strm, source); + return table ? new EncodeMapper(table->flags(), type, table) : 0; + } + + static EncodeMapper *Read(const string& filename, + EncodeType type = ENCODE) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "EncodeMap: Can't open file: " << filename; + return NULL; + } + return Read(strm, filename, type); + } + + SymbolTable *InputSymbols() const { return table_->InputSymbols(); } + + SymbolTable *OutputSymbols() const { return table_->OutputSymbols(); } + + void SetInputSymbols(const SymbolTable* syms) { + table_->SetInputSymbols(syms); + } + + void SetOutputSymbols(const SymbolTable* syms) { + table_->SetOutputSymbols(syms); + } + + private: + uint32 flags_; + EncodeType type_; + EncodeTable* table_; + bool error_; + + explicit EncodeMapper(uint32 flags, EncodeType type, EncodeTable *table) + : flags_(flags), type_(type), table_(table) {} + void operator=(const EncodeMapper &); // Disallow. +}; + +template inline +A EncodeMapper::operator()(const A &arc) { + if (type_ == ENCODE) { // labels and/or weights to single label + if ((arc.nextstate == kNoStateId && !(flags_ & kEncodeWeights)) || + (arc.nextstate == kNoStateId && (flags_ & kEncodeWeights) && + arc.weight == Weight::Zero())) { + return arc; + } else { + Label label = table_->Encode(arc); + return A(label, + flags_ & kEncodeLabels ? label : arc.olabel, + flags_ & kEncodeWeights ? Weight::One() : arc.weight, + arc.nextstate); + } + } else { // type_ == DECODE + if (arc.nextstate == kNoStateId) { + return arc; + } else { + if (arc.ilabel == 0) return arc; + if (flags_ & kEncodeLabels && arc.ilabel != arc.olabel) { + FSTERROR() << "EncodeMapper: Label-encoded arc has different " + "input and output labels"; + error_ = true; + } + if (flags_ & kEncodeWeights && arc.weight != Weight::One()) { + FSTERROR() << + "EncodeMapper: Weight-encoded arc has non-trivial weight"; + error_ = true; + } + const typename EncodeTable::Tuple* tuple = table_->Decode(arc.ilabel); + if (!tuple) { + FSTERROR() << "EncodeMapper: decode failed"; + error_ = true; + return A(kNoLabel, kNoLabel, Weight::NoWeight(), arc.nextstate); + } else { + return A(tuple->ilabel, + flags_ & kEncodeLabels ? tuple->olabel : arc.olabel, + flags_ & kEncodeWeights ? tuple->weight : arc.weight, + arc.nextstate); + } + } + } +} + + +// Complexity: O(nstates + narcs) +template inline +void Encode(MutableFst *fst, EncodeMapper* mapper) { + mapper->SetInputSymbols(fst->InputSymbols()); + mapper->SetOutputSymbols(fst->OutputSymbols()); + ArcMap(fst, mapper); +} + +template inline +void Decode(MutableFst* fst, const EncodeMapper& mapper) { + ArcMap(fst, EncodeMapper(mapper, DECODE)); + RmFinalEpsilon(fst); + fst->SetInputSymbols(mapper.InputSymbols()); + fst->SetOutputSymbols(mapper.OutputSymbols()); +} + + +// On the fly label and/or weight encoding of input Fst +// +// Complexity: +// - Constructor: O(1) +// - Traversal: O(nstates_visited + narcs_visited), assuming constant +// time to visit an input state or arc. +template +class EncodeFst : public ArcMapFst > { + public: + typedef A Arc; + typedef EncodeMapper C; + typedef ArcMapFstImpl< A, A, EncodeMapper > Impl; + using ImplToFst::GetImpl; + + EncodeFst(const Fst &fst, EncodeMapper* encoder) + : ArcMapFst(fst, encoder, ArcMapFstOptions()) { + encoder->SetInputSymbols(fst.InputSymbols()); + encoder->SetOutputSymbols(fst.OutputSymbols()); + } + + EncodeFst(const Fst &fst, const EncodeMapper& encoder) + : ArcMapFst(fst, encoder, ArcMapFstOptions()) {} + + // See Fst<>::Copy() for doc. + EncodeFst(const EncodeFst &fst, bool copy = false) + : ArcMapFst(fst, copy) {} + + // Get a copy of this EncodeFst. See Fst<>::Copy() for further doc. + virtual EncodeFst *Copy(bool safe = false) const { + if (safe) { + FSTERROR() << "EncodeFst::Copy(true): not allowed."; + GetImpl()->SetProperties(kError, kError); + } + return new EncodeFst(*this); + } +}; + + +// On the fly label and/or weight encoding of input Fst +// +// Complexity: +// - Constructor: O(1) +// - Traversal: O(nstates_visited + narcs_visited), assuming constant +// time to visit an input state or arc. +template +class DecodeFst : public ArcMapFst > { + public: + typedef A Arc; + typedef EncodeMapper C; + typedef ArcMapFstImpl< A, A, EncodeMapper > Impl; + using ImplToFst::GetImpl; + + DecodeFst(const Fst &fst, const EncodeMapper& encoder) + : ArcMapFst(fst, + EncodeMapper(encoder, DECODE), + ArcMapFstOptions()) { + GetImpl()->SetInputSymbols(encoder.InputSymbols()); + GetImpl()->SetOutputSymbols(encoder.OutputSymbols()); + } + + // See Fst<>::Copy() for doc. + DecodeFst(const DecodeFst &fst, bool safe = false) + : ArcMapFst(fst, safe) {} + + // Get a copy of this DecodeFst. See Fst<>::Copy() for further doc. + virtual DecodeFst *Copy(bool safe = false) const { + return new DecodeFst(*this, safe); + } +}; + + +// Specialization for EncodeFst. +template +class StateIterator< EncodeFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const EncodeFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for EncodeFst. +template +class ArcIterator< EncodeFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const EncodeFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Specialization for DecodeFst. +template +class StateIterator< DecodeFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const DecodeFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for DecodeFst. +template +class ArcIterator< DecodeFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const DecodeFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Useful aliases when using StdArc. +typedef EncodeFst StdEncodeFst; + +typedef DecodeFst StdDecodeFst; + +} // namespace fst + +#endif // FST_LIB_ENCODE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h b/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h new file mode 100755 index 00000000000..619f65bec60 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h @@ -0,0 +1,74 @@ +// epsnormalize.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Function that implements epsilon normalization. + +#ifndef FST_LIB_EPSNORMALIZE_H__ +#define FST_LIB_EPSNORMALIZE_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include + + +#include +#include +#include +#include + + +namespace fst { + +enum EpsNormalizeType {EPS_NORM_INPUT, EPS_NORM_OUTPUT}; + +// Returns an equivalent FST that is epsilon-normalized. An acceptor is +// epsilon-normalized if it is epsilon-removed. A transducer is input +// epsilon-normalized if additionally if on each path any epsilon input +// label follows all non-epsilon input labels. Output epsilon-normalized +// is defined similarly. +// +// The input FST needs to be functional. +// +// References: +// - Mehryar Mohri. "Generic epsilon-removal and input epsilon-normalization +// algorithms for weighted transducers", International Journal of Computer +// Science, 13(1): 129-143, 2002. +template +void EpsNormalize(const Fst &ifst, MutableFst *ofst, + EpsNormalizeType type = EPS_NORM_INPUT) { + VectorFst< GallicArc > gfst; + if (type == EPS_NORM_INPUT) + ArcMap(ifst, &gfst, ToGallicMapper()); + else // type == EPS_NORM_OUTPUT + ArcMap(InvertFst(ifst), &gfst, + ToGallicMapper()); + RmEpsilon(&gfst); + FactorWeightFst< GallicArc, + GallicFactor > + fwfst(gfst); + ArcMap(fwfst, ofst, FromGallicMapper()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + if(type == EPS_NORM_OUTPUT) + Invert(ofst); +} + +} // namespace fst + +#endif // FST_LIB_EPSNORMALIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h.bak new file mode 100755 index 00000000000..8187737f1eb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/epsnormalize.h.bak @@ -0,0 +1,74 @@ +// epsnormalize.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Function that implements epsilon normalization. + +#ifndef FST_LIB_EPSNORMALIZE_H__ +#define FST_LIB_EPSNORMALIZE_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include + + +#include +#include +#include +#include + + +namespace fst { + +enum EpsNormalizeType {EPS_NORM_INPUT, EPS_NORM_OUTPUT}; + +// Returns an equivalent FST that is epsilon-normalized. An acceptor is +// epsilon-normalized if it is epsilon-removed. A transducer is input +// epsilon-normalized if additionally if on each path any epsilon input +// label follows all non-epsilon input labels. Output epsilon-normalized +// is defined similarly. +// +// The input FST needs to be functional. +// +// References: +// - Mehryar Mohri. "Generic epsilon-removal and input epsilon-normalization +// algorithms for weighted transducers", International Journal of Computer +// Science, 13(1): 129-143, 2002. +template +void EpsNormalize(const Fst &ifst, MutableFst *ofst, + EpsNormalizeType type = EPS_NORM_INPUT) { + VectorFst< GallicArc > gfst; + if (type == EPS_NORM_INPUT) + ArcMap(ifst, &gfst, ToGallicMapper()); + else // type == EPS_NORM_OUTPUT + ArcMap(InvertFst(ifst), &gfst, + ToGallicMapper()); + RmEpsilon(&gfst); + FactorWeightFst< GallicArc, + GallicFactor > + fwfst(gfst); + ArcMap(fwfst, ofst, FromGallicMapper()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + if(type == EPS_NORM_OUTPUT) + Invert(ofst); +} + +} // namespace fst + +#endif // FST_LIB_EPSNORMALIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/equal.h b/extlibs/openfstwin-1.3.1/include/fst/equal.h new file mode 100755 index 00000000000..33be19856b7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/equal.h @@ -0,0 +1,124 @@ +// test.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Function to test equality of two Fsts. + +#ifndef FST_LIB_EQUAL_H__ +#define FST_LIB_EQUAL_H__ + +#include + + +namespace fst { + +// Tests if two Fsts have the same states and arcs in the same order. +template +bool Equal(const Fst &fst1, const Fst &fst2, float delta = kDelta) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + if (fst1.Start() != fst2.Start()) { + VLOG(1) << "Equal: mismatched start states"; + return false; + } + + StateIterator< Fst > siter1(fst1); + StateIterator< Fst > siter2(fst2); + + while (!siter1.Done() || !siter2.Done()) { + if (siter1.Done() || siter2.Done()) { + VLOG(1) << "Equal: mismatched # of states"; + return false; + } + StateId s1 = siter1.Value(); + StateId s2 = siter2.Value(); + if (s1 != s2) { + VLOG(1) << "Equal: mismatched states:" + << ", state1 = " << s1 + << ", state2 = " << s2; + return false; + } + Weight final1 = fst1.Final(s1); + Weight final2 = fst2.Final(s2); + if (!ApproxEqual(final1, final2, delta)) { + VLOG(1) << "Equal: mismatched final weights:" + << " state = " << s1 + << ", final1 = " << final1 + << ", final2 = " << final2; + return false; + } + ArcIterator< Fst > aiter1(fst1, s1); + ArcIterator< Fst > aiter2(fst2, s2); + for (size_t a = 0; !aiter1.Done() || !aiter2.Done(); ++a) { + if (aiter1.Done() || aiter2.Done()) { + VLOG(1) << "Equal: mismatched # of arcs" + << " state = " << s1; + return false; + } + Arc arc1 = aiter1.Value(); + Arc arc2 = aiter2.Value(); + if (arc1.ilabel != arc2.ilabel) { + VLOG(1) << "Equal: mismatched arc input labels:" + << " state = " << s1 + << ", arc = " << a + << ", ilabel1 = " << arc1.ilabel + << ", ilabel2 = " << arc2.ilabel; + return false; + } else if (arc1.olabel != arc2.olabel) { + VLOG(1) << "Equal: mismatched arc output labels:" + << " state = " << s1 + << ", arc = " << a + << ", olabel1 = " << arc1.olabel + << ", olabel2 = " << arc2.olabel; + return false; + } else if (!ApproxEqual(arc1.weight, arc2.weight, delta)) { + VLOG(1) << "Equal: mismatched arc weights:" + << " state = " << s1 + << ", arc = " << a + << ", weight1 = " << arc1.weight + << ", weight2 = " << arc2.weight; + return false; + } else if (arc1.nextstate != arc2.nextstate) { + VLOG(1) << "Equal: mismatched input label:" + << " state = " << s1 + << ", arc = " << a + << ", nextstate1 = " << arc1.nextstate + << ", nextstate2 = " << arc2.nextstate; + return false; + } + aiter1.Next(); + aiter2.Next(); + + } + // Sanity checks: should never fail + if (fst1.NumArcs(s1) != fst2.NumArcs(s2) || + fst1.NumInputEpsilons(s1) != fst2.NumInputEpsilons(s2) || + fst1.NumOutputEpsilons(s1) != fst2.NumOutputEpsilons(s2)) { + FSTERROR() << "Equal: inconsistent arc/epsilon counts"; + } + + siter1.Next(); + siter2.Next(); + } + return true; +} + +} // namespace fst + + +#endif // FST_LIB_EQUAL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/equivalent.h b/extlibs/openfstwin-1.3.1/include/fst/equivalent.h new file mode 100755 index 00000000000..f0bc17faa10 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/equivalent.h @@ -0,0 +1,274 @@ +// equivalent.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: wojciech@google.com (Wojciech Skut) +// +// \file Functions and classes to determine the equivalence of two +// FSTs. + +#ifndef FST_LIB_EQUIVALENT_H__ +#define FST_LIB_EQUIVALENT_H__ + +#include +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include + + +namespace fst { + +// Traits-like struct holding utility functions/typedefs/constants for +// the equivalence algorithm. +// +// Encoding device: in order to make the statesets of the two acceptors +// disjoint, we map Arc::StateId on the type MappedId. The states of +// the first acceptor are mapped on odd numbers (s -> 2s + 1), and +// those of the second one on even numbers (s -> 2s + 2). The number 0 +// is reserved for an implicit (non-final) 'dead state' (required for +// the correct treatment of non-coaccessible states; kNoStateId is +// mapped to kDeadState for both acceptors). The union-find algorithm +// operates on the mapped IDs. +template +struct EquivalenceUtil { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef StateId MappedId; // ID for an equivalence class. + + // MappedId for an implicit dead state. + static const MappedId kDeadState = 0; + + // MappedId for lookup failure. + static const MappedId kInvalidId = -1; + + // Maps state ID to the representative of the corresponding + // equivalence class. The parameter 'which_fst' takes the values 1 + // and 2, identifying the input FST. + static MappedId MapState(StateId s, int32 which_fst) { + return + (kNoStateId == s) + ? + kDeadState + : + (static_cast(s) << 1) + which_fst; + } + // Maps set ID to State ID. + static StateId UnMapState(MappedId id) { + return static_cast((--id) >> 1); + } + // Convenience function: checks if state with MappedId 's' is final + // in acceptor 'fa'. + static bool IsFinal(const Fst &fa, MappedId s) { + return + (kDeadState == s) ? + false : (fa.Final(UnMapState(s)) != Weight::Zero()); + } + // Convenience function: returns the representative of 'id' in 'sets', + // creating a new set if needed. + static MappedId FindSet(UnionFind *sets, MappedId id) { + MappedId repr = sets->FindSet(id); + if (repr != kInvalidId) { + return repr; + } else { + sets->MakeSet(id); + return id; + } + } +}; + +template const +typename EquivalenceUtil::MappedId EquivalenceUtil::kDeadState; + +template const +typename EquivalenceUtil::MappedId EquivalenceUtil::kInvalidId; + + +// Equivalence checking algorithm: determines if the two FSTs +// fst1 and fst2 are equivalent. The input +// FSTs must be deterministic input-side epsilon-free acceptors, +// unweighted or with weights over a left semiring. Two acceptors are +// considered equivalent if they accept exactly the same set of +// strings (with the same weights). +// +// The algorithm (cf. Aho, Hopcroft and Ullman, "The Design and +// Analysis of Computer Programs") successively constructs sets of +// states that can be reached by the same prefixes, starting with a +// set containing the start states of both acceptors. A disjoint tree +// forest (the union-find algorithm) is used to represent the sets of +// states. The algorithm returns 'false' if one of the constructed +// sets contains both final and non-final states. Returns optional error +// value (when FLAGS_error_fatal = false). +// +// Complexity: quasi-linear, i.e. O(n G(n)), where +// n = |S1| + |S2| is the number of states in both acceptors +// G(n) is a very slowly growing function that can be approximated +// by 4 by all practical purposes. +// +template +bool Equivalent(const Fst &fst1, + const Fst &fst2, + double delta = kDelta, bool *error = 0) { + typedef typename Arc::Weight Weight; + if (error) *error = false; + + // Check that the symbol table are compatible + if (!CompatSymbols(fst1.InputSymbols(), fst2.InputSymbols()) || + !CompatSymbols(fst1.OutputSymbols(), fst2.OutputSymbols())) { + FSTERROR() << "Equivalent: input/output symbol tables of 1st argument " + << "do not match input/output symbol tables of 2nd argument"; + if (error) *error = true; + return false; + } + // Check properties first: + uint64 props = kNoEpsilons | kIDeterministic | kAcceptor; + if (fst1.Properties(props, true) != props) { + FSTERROR() << "Equivalent: first argument not an" + << " epsilon-free deterministic acceptor"; + if (error) *error = true; + return false; + } + if (fst2.Properties(props, true) != props) { + FSTERROR() << "Equivalent: second argument not an" + << " epsilon-free deterministic acceptor"; + if (error) *error = true; + return false; + } + + if ((fst1.Properties(kUnweighted , true) != kUnweighted) + || (fst2.Properties(kUnweighted , true) != kUnweighted)) { + VectorFst efst1(fst1); + VectorFst efst2(fst2); + Push(&efst1, REWEIGHT_TO_INITIAL, delta); + Push(&efst2, REWEIGHT_TO_INITIAL, delta); + ArcMap(&efst1, QuantizeMapper(delta)); + ArcMap(&efst2, QuantizeMapper(delta)); + EncodeMapper mapper(kEncodeWeights|kEncodeLabels, ENCODE); + ArcMap(&efst1, &mapper); + ArcMap(&efst2, &mapper); + return Equivalent(efst1, efst2); + } + + // Convenience typedefs: + typedef typename Arc::StateId StateId; + typedef EquivalenceUtil Util; + typedef typename Util::MappedId MappedId; + enum { FST1 = 1, FST2 = 2 }; // Required by Util::MapState(...) + + MappedId s1 = Util::MapState(fst1.Start(), FST1); + MappedId s2 = Util::MapState(fst2.Start(), FST2); + + // The union-find structure. + UnionFind eq_classes(1000, Util::kInvalidId); + + // Initialize the union-find structure. + eq_classes.MakeSet(s1); + eq_classes.MakeSet(s2); + + // Data structure for the (partial) acceptor transition function of + // fst1 and fst2: input labels mapped to pairs of MappedId's + // representing destination states of the corresponding arcs in fst1 + // and fst2, respectively. + typedef + unordered_map > + Label2StatePairMap; + + Label2StatePairMap arc_pairs; + + // Pairs of MappedId's to be processed, organized in a queue. + deque > q; + + bool ret = true; + // Early return if the start states differ w.r.t. being final. + if (Util::IsFinal(fst1, s1) != Util::IsFinal(fst2, s2)) { + ret = false; + } + + // Main loop: explores the two acceptors in a breadth-first manner, + // updating the equivalence relation on the statesets. Loop + // invariant: each block of states contains either final states only + // or non-final states only. + for (q.push_back(make_pair(s1, s2)); ret && !q.empty(); q.pop_front()) { + s1 = q.front().first; + s2 = q.front().second; + + // Representatives of the equivalence classes of s1/s2. + MappedId rep1 = Util::FindSet(&eq_classes, s1); + MappedId rep2 = Util::FindSet(&eq_classes, s2); + + if (rep1 != rep2) { + eq_classes.Union(rep1, rep2); + arc_pairs.clear(); + + // Copy outgoing arcs starting at s1 into the hashtable. + if (Util::kDeadState != s1) { + ArcIterator > arc_iter(fst1, Util::UnMapState(s1)); + for (; !arc_iter.Done(); arc_iter.Next()) { + const Arc &arc = arc_iter.Value(); + if (arc.weight != Weight::Zero()) { // Zero-weight arcs + // are treated as + // non-exisitent. + arc_pairs[arc.ilabel].first = Util::MapState(arc.nextstate, FST1); + } + } + } + // Copy outgoing arcs starting at s2 into the hashtable. + if (Util::kDeadState != s2) { + ArcIterator > arc_iter(fst2, Util::UnMapState(s2)); + for (; !arc_iter.Done(); arc_iter.Next()) { + const Arc &arc = arc_iter.Value(); + if (arc.weight != Weight::Zero()) { // Zero-weight arcs + // are treated as + // non-existent. + arc_pairs[arc.ilabel].second = Util::MapState(arc.nextstate, FST2); + } + } + } + // Iterate through the hashtable and process pairs of target + // states. + for (typename Label2StatePairMap::const_iterator + arc_iter = arc_pairs.begin(); + arc_iter != arc_pairs.end(); + ++arc_iter) { + const pair &p = arc_iter->second; + if (Util::IsFinal(fst1, p.first) != Util::IsFinal(fst2, p.second)) { + // Detected inconsistency: return false. + ret = false; + break; + } + q.push_back(p); + } + } + } + + if (fst1.Properties(kError, false) || fst2.Properties(kError, false)) { + if (error) *error = true; + return false; + } + + return ret; +} + +} // namespace fst + +#endif // FST_LIB_EQUIVALENT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/equivalent.h.bak b/extlibs/openfstwin-1.3.1/include/fst/equivalent.h.bak new file mode 100755 index 00000000000..7f8708a6812 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/equivalent.h.bak @@ -0,0 +1,274 @@ +// equivalent.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: wojciech@google.com (Wojciech Skut) +// +// \file Functions and classes to determine the equivalence of two +// FSTs. + +#ifndef FST_LIB_EQUIVALENT_H__ +#define FST_LIB_EQUIVALENT_H__ + +#include +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include + + +namespace fst { + +// Traits-like struct holding utility functions/typedefs/constants for +// the equivalence algorithm. +// +// Encoding device: in order to make the statesets of the two acceptors +// disjoint, we map Arc::StateId on the type MappedId. The states of +// the first acceptor are mapped on odd numbers (s -> 2s + 1), and +// those of the second one on even numbers (s -> 2s + 2). The number 0 +// is reserved for an implicit (non-final) 'dead state' (required for +// the correct treatment of non-coaccessible states; kNoStateId is +// mapped to kDeadState for both acceptors). The union-find algorithm +// operates on the mapped IDs. +template +struct EquivalenceUtil { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef StateId MappedId; // ID for an equivalence class. + + // MappedId for an implicit dead state. + static const MappedId kDeadState = 0; + + // MappedId for lookup failure. + static const MappedId kInvalidId = -1; + + // Maps state ID to the representative of the corresponding + // equivalence class. The parameter 'which_fst' takes the values 1 + // and 2, identifying the input FST. + static MappedId MapState(StateId s, int32 which_fst) { + return + (kNoStateId == s) + ? + kDeadState + : + (static_cast(s) << 1) + which_fst; + } + // Maps set ID to State ID. + static StateId UnMapState(MappedId id) { + return static_cast((--id) >> 1); + } + // Convenience function: checks if state with MappedId 's' is final + // in acceptor 'fa'. + static bool IsFinal(const Fst &fa, MappedId s) { + return + (kDeadState == s) ? + false : (fa.Final(UnMapState(s)) != Weight::Zero()); + } + // Convenience function: returns the representative of 'id' in 'sets', + // creating a new set if needed. + static MappedId FindSet(UnionFind *sets, MappedId id) { + MappedId repr = sets->FindSet(id); + if (repr != kInvalidId) { + return repr; + } else { + sets->MakeSet(id); + return id; + } + } +}; + +template const +typename EquivalenceUtil::MappedId EquivalenceUtil::kDeadState; + +template const +typename EquivalenceUtil::MappedId EquivalenceUtil::kInvalidId; + + +// Equivalence checking algorithm: determines if the two FSTs +// fst1 and fst2 are equivalent. The input +// FSTs must be deterministic input-side epsilon-free acceptors, +// unweighted or with weights over a left semiring. Two acceptors are +// considered equivalent if they accept exactly the same set of +// strings (with the same weights). +// +// The algorithm (cf. Aho, Hopcroft and Ullman, "The Design and +// Analysis of Computer Programs") successively constructs sets of +// states that can be reached by the same prefixes, starting with a +// set containing the start states of both acceptors. A disjoint tree +// forest (the union-find algorithm) is used to represent the sets of +// states. The algorithm returns 'false' if one of the constructed +// sets contains both final and non-final states. Returns optional error +// value (when FLAGS_error_fatal = false). +// +// Complexity: quasi-linear, i.e. O(n G(n)), where +// n = |S1| + |S2| is the number of states in both acceptors +// G(n) is a very slowly growing function that can be approximated +// by 4 by all practical purposes. +// +template +bool Equivalent(const Fst &fst1, + const Fst &fst2, + double delta = kDelta, bool *error = 0) { + typedef typename Arc::Weight Weight; + if (error) *error = false; + + // Check that the symbol table are compatible + if (!CompatSymbols(fst1.InputSymbols(), fst2.InputSymbols()) || + !CompatSymbols(fst1.OutputSymbols(), fst2.OutputSymbols())) { + FSTERROR() << "Equivalent: input/output symbol tables of 1st argument " + << "do not match input/output symbol tables of 2nd argument"; + if (error) *error = true; + return false; + } + // Check properties first: + uint64 props = kNoEpsilons | kIDeterministic | kAcceptor; + if (fst1.Properties(props, true) != props) { + FSTERROR() << "Equivalent: first argument not an" + << " epsilon-free deterministic acceptor"; + if (error) *error = true; + return false; + } + if (fst2.Properties(props, true) != props) { + FSTERROR() << "Equivalent: second argument not an" + << " epsilon-free deterministic acceptor"; + if (error) *error = true; + return false; + } + + if ((fst1.Properties(kUnweighted , true) != kUnweighted) + || (fst2.Properties(kUnweighted , true) != kUnweighted)) { + VectorFst efst1(fst1); + VectorFst efst2(fst2); + Push(&efst1, REWEIGHT_TO_INITIAL, delta); + Push(&efst2, REWEIGHT_TO_INITIAL, delta); + ArcMap(&efst1, QuantizeMapper(delta)); + ArcMap(&efst2, QuantizeMapper(delta)); + EncodeMapper mapper(kEncodeWeights|kEncodeLabels, ENCODE); + ArcMap(&efst1, &mapper); + ArcMap(&efst2, &mapper); + return Equivalent(efst1, efst2); + } + + // Convenience typedefs: + typedef typename Arc::StateId StateId; + typedef EquivalenceUtil Util; + typedef typename Util::MappedId MappedId; + enum { FST1 = 1, FST2 = 2 }; // Required by Util::MapState(...) + + MappedId s1 = Util::MapState(fst1.Start(), FST1); + MappedId s2 = Util::MapState(fst2.Start(), FST2); + + // The union-find structure. + UnionFind eq_classes(1000, Util::kInvalidId); + + // Initialize the union-find structure. + eq_classes.MakeSet(s1); + eq_classes.MakeSet(s2); + + // Data structure for the (partial) acceptor transition function of + // fst1 and fst2: input labels mapped to pairs of MappedId's + // representing destination states of the corresponding arcs in fst1 + // and fst2, respectively. + typedef + unordered_map > + Label2StatePairMap; + + Label2StatePairMap arc_pairs; + + // Pairs of MappedId's to be processed, organized in a queue. + deque > q; + + bool ret = true; + // Early return if the start states differ w.r.t. being final. + if (Util::IsFinal(fst1, s1) != Util::IsFinal(fst2, s2)) { + ret = false; + } + + // Main loop: explores the two acceptors in a breadth-first manner, + // updating the equivalence relation on the statesets. Loop + // invariant: each block of states contains either final states only + // or non-final states only. + for (q.push_back(make_pair(s1, s2)); ret && !q.empty(); q.pop_front()) { + s1 = q.front().first; + s2 = q.front().second; + + // Representatives of the equivalence classes of s1/s2. + MappedId rep1 = Util::FindSet(&eq_classes, s1); + MappedId rep2 = Util::FindSet(&eq_classes, s2); + + if (rep1 != rep2) { + eq_classes.Union(rep1, rep2); + arc_pairs.clear(); + + // Copy outgoing arcs starting at s1 into the hashtable. + if (Util::kDeadState != s1) { + ArcIterator > arc_iter(fst1, Util::UnMapState(s1)); + for (; !arc_iter.Done(); arc_iter.Next()) { + const Arc &arc = arc_iter.Value(); + if (arc.weight != Weight::Zero()) { // Zero-weight arcs + // are treated as + // non-exisitent. + arc_pairs[arc.ilabel].first = Util::MapState(arc.nextstate, FST1); + } + } + } + // Copy outgoing arcs starting at s2 into the hashtable. + if (Util::kDeadState != s2) { + ArcIterator > arc_iter(fst2, Util::UnMapState(s2)); + for (; !arc_iter.Done(); arc_iter.Next()) { + const Arc &arc = arc_iter.Value(); + if (arc.weight != Weight::Zero()) { // Zero-weight arcs + // are treated as + // non-existent. + arc_pairs[arc.ilabel].second = Util::MapState(arc.nextstate, FST2); + } + } + } + // Iterate through the hashtable and process pairs of target + // states. + for (typename Label2StatePairMap::const_iterator + arc_iter = arc_pairs.begin(); + arc_iter != arc_pairs.end(); + ++arc_iter) { + const pair &p = arc_iter->second; + if (Util::IsFinal(fst1, p.first) != Util::IsFinal(fst2, p.second)) { + // Detected inconsistency: return false. + ret = false; + break; + } + q.push_back(p); + } + } + } + + if (fst1.Properties(kError, false) || fst2.Properties(kError, false)) { + if (error) *error = true; + return false; + } + + return ret; +} + +} // namespace fst + +#endif // FST_LIB_EQUIVALENT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/expanded-fst.h b/extlibs/openfstwin-1.3.1/include/fst/expanded-fst.h new file mode 100755 index 00000000000..b44b81cc675 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/expanded-fst.h @@ -0,0 +1,189 @@ +// expanded-fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Generic FST augmented with state count - interface class definition. +// + +#ifndef FST_LIB_EXPANDED_FST_H__ +#define FST_LIB_EXPANDED_FST_H__ + +#include +#include + +#include + + +namespace fst { + +// A generic FST plus state count. +template +class ExpandedFst : public Fst { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + virtual StateId NumStates() const = 0; // State count + + // Get a copy of this ExpandedFst. See Fst<>::Copy() for further doc. + virtual ExpandedFst *Copy(bool safe = false) const = 0; + + // Read an ExpandedFst from an input stream; return NULL on error. + static ExpandedFst *Read(istream &strm, const FstReadOptions &opts) { + FstReadOptions ropts(opts); + FstHeader hdr; + if (ropts.header) + hdr = *opts.header; + else { + if (!hdr.Read(strm, opts.source)) + return 0; + ropts.header = &hdr; + } + if (!(hdr.Properties() & kExpanded)) { + LOG(ERROR) << "ExpandedFst::Read: Not an ExpandedFst: " << ropts.source; + return 0; + } + FstRegister *registr = FstRegister::GetRegister(); + const typename FstRegister::Reader reader = + registr->GetReader(hdr.FstType()); + if (!reader) { + LOG(ERROR) << "ExpandedFst::Read: Unknown FST type \"" << hdr.FstType() + << "\" (arc type = \"" << A::Type() + << "\"): " << ropts.source; + return 0; + } + Fst *fst = reader(strm, ropts); + if (!fst) return 0; + return static_cast *>(fst); + } + + // Read an ExpandedFst from a file; return NULL on error. + // Empty filename reads from standard input. + static ExpandedFst *Read(const string &filename) { + if (!filename.empty()) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "ExpandedFst::Read: Can't open file: " << filename; + return 0; + } + return Read(strm, FstReadOptions(filename)); + } else { + return Read(std::cin, FstReadOptions("standard input")); + } + } +}; + + +namespace internal { + +// ExpandedFst case - abstract methods. +template inline +typename A::Weight Final(const ExpandedFst &fst, typename A::StateId s) { + return fst.Final(s); +} + +template inline +ssize_t NumArcs(const ExpandedFst &fst, typename A::StateId s) { + return fst.NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const ExpandedFst &fst, typename A::StateId s) { + return fst.NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const ExpandedFst &fst, typename A::StateId s) { + return fst.NumOutputEpsilons(s); +} + +} // namespace internal + + +// A useful alias when using StdArc. +typedef ExpandedFst StdExpandedFst; + + +// This is a helper class template useful for attaching an ExpandedFst +// interface to its implementation, handling reference counting. It +// delegates to ImplToFst the handling of the Fst interface methods. +template < class I, class F = ExpandedFst > +class ImplToExpandedFst : public ImplToFst { + public: + typedef typename I::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + using ImplToFst::GetImpl; + + virtual StateId NumStates() const { return GetImpl()->NumStates(); } + + protected: + ImplToExpandedFst() : ImplToFst() {} + + ImplToExpandedFst(I *impl) : ImplToFst(impl) {} + + ImplToExpandedFst(const ImplToExpandedFst &fst) + : ImplToFst(fst) {} + + ImplToExpandedFst(const ImplToExpandedFst &fst, bool safe) + : ImplToFst(fst, safe) {} + + // Read FST implementation from a file; return NULL on error. + // Empty filename reads from standard input. + static I *Read(const string &filename) { + if (!filename.empty()) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "ExpandedFst::Read: Can't open file: " << filename; + return 0; + } + return I::Read(strm, FstReadOptions(filename)); + } else { + return I::Read(std::cin, FstReadOptions("standard input")); + } + } + + private: + // Disallow + ImplToExpandedFst &operator=(const ImplToExpandedFst &fst); + + ImplToExpandedFst &operator=(const Fst &fst) { + FSTERROR() << "ImplToExpandedFst: Assignment operator disallowed"; + GetImpl()->SetProperties(kError, kError); + return *this; + } +}; + +// Function to return the number of states in an FST, counting them +// if necessary. +template +typename Arc::StateId CountStates(const Fst &fst) { + if (fst.Properties(kExpanded, false)) { + const ExpandedFst *efst = static_cast *>(&fst); + return efst->NumStates(); + } else { + typename Arc::StateId nstates = 0; + for (StateIterator< Fst > siter(fst); !siter.Done(); siter.Next()) + ++nstates; + return nstates; + } +} + +} // namespace fst + +#endif // FST_LIB_EXPANDED_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/expectation-weight.h b/extlibs/openfstwin-1.3.1/include/fst/expectation-weight.h new file mode 100755 index 00000000000..5226cad0608 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/expectation-weight.h @@ -0,0 +1,142 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: krr@google.com (Kasturi Rangan Raghavan) +// Inspiration: shumash@google.com (Masha Maria Shugrina) +// \file +// Expectation semiring as described by Jason Eisner: +// See: doi=10.1.1.22.9398 +// Multiplex semiring operations and identities: +// One: +// Zero: +// Plus: + = < (a1 + a2) , (b1 + b2) > +// Times: * = < (a1 * a2) , [(a1 * b2) + (a2 * b1)] > +// Division: Undefined (currently) +// +// Usually used to store the pair so that +// ShortestDistance[Fst > >] +// == < PosteriorProbability, Expected_Value[V] > + +#ifndef FST_LIB_EXPECTATION_WEIGHT_H_ +#define FST_LIB_EXPECTATION_WEIGHT_H_ + +#include + +#include + + +namespace fst { + +// X1 is usually a probability weight like LogWeight +// X2 is usually a random variable or vector +// see SignedLogWeight or SparsePowerWeight +// +// If X1 is distinct from X2, it is required that there is an external +// product between X1 and X2 and if both semriring are commutative, or +// left or right semirings, then result must have those properties. +template +class ExpectationWeight : public PairWeight { + public: + using PairWeight::Value1; + using PairWeight::Value2; + + using PairWeight::Reverse; + using PairWeight::Quantize; + using PairWeight::Member; + + typedef X1 W1; + typedef X2 W2; + + typedef ExpectationWeight ReverseWeight; + + ExpectationWeight() : PairWeight(Zero()) { } + + ExpectationWeight(const ExpectationWeight& w) + : PairWeight (w) { } + + ExpectationWeight(const PairWeight& w) + : PairWeight (w) { } + + ExpectationWeight(const X1& x1, const X2& x2) + : PairWeight(x1, x2) { } + + static const ExpectationWeight &Zero() { + static const ExpectationWeight zero(X1::Zero(), X2::Zero()); + return zero; + } + + static const ExpectationWeight &One() { + static const ExpectationWeight one(X1::One(), X2::Zero()); + return one; + } + + static const ExpectationWeight &NoWeight() { + static const ExpectationWeight no_weight(X1::NoWeight(), + X2::NoWeight()); + return no_weight; + } + + static const string &Type() { + static const string type = "expectation_" + X1::Type() + "_" + X2::Type(); + return type; + } + + PairWeight Quantize(float delta = kDelta) const { + return PairWeight::Quantize(); + } + + ReverseWeight Reverse() const { + return PairWeight::Reverse(); + } + + bool Member() const { + return PairWeight::Member(); + } + + static uint64 Properties() { + uint64 props1 = W1::Properties(); + uint64 props2 = W2::Properties(); + return props1 & props2 & (kLeftSemiring | kRightSemiring | + kCommutative | kIdempotent); + } +}; + +template +inline ExpectationWeight Plus(const ExpectationWeight &w, + const ExpectationWeight &v) { + return ExpectationWeight(Plus(w.Value1(), v.Value1()), + Plus(w.Value2(), v.Value2())); +} + + +template +inline ExpectationWeight Times(const ExpectationWeight &w, + const ExpectationWeight &v) { + return ExpectationWeight(Times(w.Value1(), v.Value1()), + Plus(Times(w.Value1(), v.Value2()), + Times(w.Value2(), v.Value1()))); +} + +template +inline ExpectationWeight Divide(const ExpectationWeight &w, + const ExpectationWeight &v, + DivideType typ = DIVIDE_ANY) { + FSTERROR() << "ExpectationWeight::Divide: not implemented"; + return ExpectationWeight::NoWeight(); +} + +} // namespace fst + +#endif // FST_LIB_EXPECTATION_WEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h new file mode 100755 index 00000000000..0bc775d2d7e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h @@ -0,0 +1,305 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Authors: allauzen@google.com (Cyril Allauzen) +// ttai@google.com (Terry Tai) +// jpr@google.com (Jake Ratkiewicz) + + +#ifndef FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ +#define FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ + +#ifndef WINDOWS //ChangedPD + #include +#endif +#include +#include +using std::vector; + +#include +#include + +namespace fst { + +// Construct a reader that provides FSTs from a file (stream) either on a +// line-by-line basis or on a per-stream basis. Note that the freshly +// constructed reader is already set to the first input. +// +// Sample Usage: +// for (StringReader reader(...); !reader.Done(); reader.Next()) { +// Fst *fst = reader.GetVectorFst(); +// } +template +class StringReader { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename StringCompiler::TokenType TokenType; + + enum EntryType { LINE = 1, FILE = 2 }; + + StringReader(istream &istrm, + const string &source, + EntryType entry_type, + TokenType token_type, + bool allow_negative_labels, + const SymbolTable *syms = 0, + Label unknown_label = kNoStateId) + : nline_(0), strm_(istrm), source_(source), entry_type_(entry_type), + token_type_(token_type), symbols_(syms), done_(false), + compiler_(token_type, syms, unknown_label, allow_negative_labels) { + Next(); // Initialize the reader to the first input. + } + + bool Done() { + return done_; + } + + void Next() { + VLOG(1) << "Processing source " << source_ << " at line " << nline_; + if (!strm_) { // We're done if we have no more input. + done_ = true; + return; + } + if (entry_type_ == LINE) { + getline(strm_, content_); + ++nline_; + } else { + content_.clear(); + string line; + while (getline(strm_, line)) { + ++nline_; + content_.append(line); + content_.append("\n"); + } + } + if (!strm_ && content_.empty()) // We're also done if we read off all the + done_ = true; // whitespace at the end of a file. + } + + VectorFst *GetVectorFst(bool keep_symbols = false) { + VectorFst *fst = new VectorFst; + if (keep_symbols) { + fst->SetInputSymbols(symbols_); + fst->SetOutputSymbols(symbols_); + } + if (compiler_(content_, fst)) { + return fst; + } else { + delete fst; + return NULL; + } + } + + CompactFst > *GetCompactFst(bool keep_symbols = false) { + CompactFst > *fst; + if (keep_symbols) { + VectorFst tmp; + tmp.SetInputSymbols(symbols_); + tmp.SetOutputSymbols(symbols_); + fst = new CompactFst >(tmp); + } else { + fst = new CompactFst >; + } + if (compiler_(content_, fst)) { + return fst; + } else { + delete fst; + return NULL; + } + } + + private: + size_t nline_; + istream &strm_; + string source_; + EntryType entry_type_; + TokenType token_type_; + const SymbolTable *symbols_; + bool done_; + StringCompiler compiler_; + string content_; // The actual content of the input stream's next FST. + + DISALLOW_COPY_AND_ASSIGN(StringReader); +}; + +// Compute the minimal length required to encode each line number as a decimal +// number. +int KeySize(const char *filename); + +template +void FarCompileStrings(const vector &in_fnames, + const string &out_fname, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix) { + typename StringReader::EntryType entry_type; + if (fet == FET_LINE) { + entry_type = StringReader::LINE; + } else if (fet == FET_FILE) { + entry_type = StringReader::FILE; + } else { + FSTERROR() << "FarCompileStrings: unknown entry type"; + return; + } + + typename StringCompiler::TokenType token_type; + if (tt == FTT_SYMBOL) { + token_type = StringCompiler::SYMBOL; + } else if (tt == FTT_BYTE) { + token_type = StringCompiler::BYTE; + } else if (tt == FTT_UTF8) { + token_type = StringCompiler::UTF8; + } else { + FSTERROR() << "FarCompileStrings: unknown token type"; + return; + } + + bool compact; + if (fst_type.empty() || (fst_type == "vector")) { + compact = false; + } else if (fst_type == "compact") { + compact = true; + } else { + FSTERROR() << "FarCompileStrings: unknown fst type: " + << fst_type; + return; + } + + const SymbolTable *syms = 0; + typename Arc::Label unknown_label = kNoLabel; + if (!symbols_fname.empty()) { + syms = SymbolTable::ReadText(symbols_fname, + allow_negative_labels); + if (!syms) { + FSTERROR() << "FarCompileStrings: error reading symbol table: " + << symbols_fname; + return; + } + if (!unknown_symbol.empty()) { + unknown_label = syms->Find(unknown_symbol); + if (unknown_label == kNoLabel) { + FSTERROR() << "FarCompileStrings: unknown label \"" << unknown_label + << "\" missing from symbol table: " << symbols_fname; + return; + } + } + } + + FarWriter *far_writer = + FarWriter::Create(out_fname, far_type); + if (!far_writer) return; + + vector inputs; + if (file_list_input) { + for (int i = 1; i < in_fnames.size(); ++i) { + istream *istrm = in_fnames.empty() ? &std::cin : + new ifstream(in_fnames[i].c_str()); + string str; + while (getline(*istrm, str)) + inputs.push_back(str); + if (!in_fnames.empty()) + delete istrm; + } + } else { + inputs = in_fnames; + } + + for (int i = 0, n = 0; i < inputs.size(); ++i) { + if (generate_keys == 0 && inputs[i].empty()) { + FSTERROR() << "FarCompileStrings: generate_keys cannot be set to 0" + << " when reading from stdin"; + delete far_writer; + delete syms; + return; + } + int key_size = generate_keys ? generate_keys : + (entry_type == StringReader::FILE ? 1 : + KeySize(inputs[i].c_str())); + istream *istrm = inputs[i].empty() ? &std::cin : + new ifstream(inputs[i].c_str()); + + bool keep_syms = keep_symbols; + for (StringReader reader( + *istrm, inputs[i].empty() ? "stdin" : inputs[i], + entry_type, token_type, allow_negative_labels, + syms, unknown_label); + !reader.Done(); + reader.Next()) { + ++n; + const Fst *fst; + if (compact) + fst = reader.GetCompactFst(keep_syms); + else + fst = reader.GetVectorFst(keep_syms); + if (initial_symbols) + keep_syms = false; + if (!fst) { + FSTERROR() << "FarCompileStrings: compiling string number " << n + << " in file " << inputs[i] << " failed with token_type = " + << (tt == FTT_BYTE ? "byte" : + (tt == FTT_UTF8 ? "utf8" : + (tt == FTT_SYMBOL ? "symbol" : "unknown"))) + << " and entry_type = " + << (fet == FET_LINE ? "line" : + (fet == FET_FILE ? "file" : "unknown")); + delete far_writer; + delete syms; + if (!inputs[i].empty()) delete istrm; + return; + } + ostringstream keybuf; + keybuf.width(key_size); + keybuf.fill('0'); + keybuf << n; + string key; + if (generate_keys > 0) { + key = keybuf.str(); + } else { + char* filename = new char[inputs[i].size() + 1]; + strcpy(filename, inputs[i].c_str()); + key = basename(filename); + if (entry_type != StringReader::FILE) { + key += "-"; + key += keybuf.str(); + } + delete[] filename; + } + far_writer->Add(key_prefix + key + key_suffix, *fst); + delete fst; + } + if (generate_keys == 0) + n = 0; + if (!inputs[i].empty()) + delete istrm; + } + + delete far_writer; +} + +} // namespace fst + + +#endif // FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h.bak new file mode 100755 index 00000000000..61aa4d72cd1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/compile-strings.h.bak @@ -0,0 +1,303 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Authors: allauzen@google.com (Cyril Allauzen) +// ttai@google.com (Terry Tai) +// jpr@google.com (Jake Ratkiewicz) + + +#ifndef FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ +#define FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ + +#include +#include +#include +using std::vector; + +#include +#include + +namespace fst { + +// Construct a reader that provides FSTs from a file (stream) either on a +// line-by-line basis or on a per-stream basis. Note that the freshly +// constructed reader is already set to the first input. +// +// Sample Usage: +// for (StringReader reader(...); !reader.Done(); reader.Next()) { +// Fst *fst = reader.GetVectorFst(); +// } +template +class StringReader { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename StringCompiler::TokenType TokenType; + + enum EntryType { LINE = 1, FILE = 2 }; + + StringReader(istream &istrm, + const string &source, + EntryType entry_type, + TokenType token_type, + bool allow_negative_labels, + const SymbolTable *syms = 0, + Label unknown_label = kNoStateId) + : nline_(0), strm_(istrm), source_(source), entry_type_(entry_type), + token_type_(token_type), symbols_(syms), done_(false), + compiler_(token_type, syms, unknown_label, allow_negative_labels) { + Next(); // Initialize the reader to the first input. + } + + bool Done() { + return done_; + } + + void Next() { + VLOG(1) << "Processing source " << source_ << " at line " << nline_; + if (!strm_) { // We're done if we have no more input. + done_ = true; + return; + } + if (entry_type_ == LINE) { + getline(strm_, content_); + ++nline_; + } else { + content_.clear(); + string line; + while (getline(strm_, line)) { + ++nline_; + content_.append(line); + content_.append("\n"); + } + } + if (!strm_ && content_.empty()) // We're also done if we read off all the + done_ = true; // whitespace at the end of a file. + } + + VectorFst *GetVectorFst(bool keep_symbols = false) { + VectorFst *fst = new VectorFst; + if (keep_symbols) { + fst->SetInputSymbols(symbols_); + fst->SetOutputSymbols(symbols_); + } + if (compiler_(content_, fst)) { + return fst; + } else { + delete fst; + return NULL; + } + } + + CompactFst > *GetCompactFst(bool keep_symbols = false) { + CompactFst > *fst; + if (keep_symbols) { + VectorFst tmp; + tmp.SetInputSymbols(symbols_); + tmp.SetOutputSymbols(symbols_); + fst = new CompactFst >(tmp); + } else { + fst = new CompactFst >; + } + if (compiler_(content_, fst)) { + return fst; + } else { + delete fst; + return NULL; + } + } + + private: + size_t nline_; + istream &strm_; + string source_; + EntryType entry_type_; + TokenType token_type_; + const SymbolTable *symbols_; + bool done_; + StringCompiler compiler_; + string content_; // The actual content of the input stream's next FST. + + DISALLOW_COPY_AND_ASSIGN(StringReader); +}; + +// Compute the minimal length required to encode each line number as a decimal +// number. +int KeySize(const char *filename); + +template +void FarCompileStrings(const vector &in_fnames, + const string &out_fname, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix) { + typename StringReader::EntryType entry_type; + if (fet == FET_LINE) { + entry_type = StringReader::LINE; + } else if (fet == FET_FILE) { + entry_type = StringReader::FILE; + } else { + FSTERROR() << "FarCompileStrings: unknown entry type"; + return; + } + + typename StringCompiler::TokenType token_type; + if (tt == FTT_SYMBOL) { + token_type = StringCompiler::SYMBOL; + } else if (tt == FTT_BYTE) { + token_type = StringCompiler::BYTE; + } else if (tt == FTT_UTF8) { + token_type = StringCompiler::UTF8; + } else { + FSTERROR() << "FarCompileStrings: unknown token type"; + return; + } + + bool compact; + if (fst_type.empty() || (fst_type == "vector")) { + compact = false; + } else if (fst_type == "compact") { + compact = true; + } else { + FSTERROR() << "FarCompileStrings: unknown fst type: " + << fst_type; + return; + } + + const SymbolTable *syms = 0; + typename Arc::Label unknown_label = kNoLabel; + if (!symbols_fname.empty()) { + syms = SymbolTable::ReadText(symbols_fname, + allow_negative_labels); + if (!syms) { + FSTERROR() << "FarCompileStrings: error reading symbol table: " + << symbols_fname; + return; + } + if (!unknown_symbol.empty()) { + unknown_label = syms->Find(unknown_symbol); + if (unknown_label == kNoLabel) { + FSTERROR() << "FarCompileStrings: unknown label \"" << unknown_label + << "\" missing from symbol table: " << symbols_fname; + return; + } + } + } + + FarWriter *far_writer = + FarWriter::Create(out_fname, far_type); + if (!far_writer) return; + + vector inputs; + if (file_list_input) { + for (int i = 1; i < in_fnames.size(); ++i) { + istream *istrm = in_fnames.empty() ? &std::cin : + new ifstream(in_fnames[i].c_str()); + string str; + while (getline(*istrm, str)) + inputs.push_back(str); + if (!in_fnames.empty()) + delete istrm; + } + } else { + inputs = in_fnames; + } + + for (int i = 0, n = 0; i < inputs.size(); ++i) { + if (generate_keys == 0 && inputs[i].empty()) { + FSTERROR() << "FarCompileStrings: generate_keys cannot be set to 0" + << " when reading from stdin"; + delete far_writer; + delete syms; + return; + } + int key_size = generate_keys ? generate_keys : + (entry_type == StringReader::FILE ? 1 : + KeySize(inputs[i].c_str())); + istream *istrm = inputs[i].empty() ? &std::cin : + new ifstream(inputs[i].c_str()); + + bool keep_syms = keep_symbols; + for (StringReader reader( + *istrm, inputs[i].empty() ? "stdin" : inputs[i], + entry_type, token_type, allow_negative_labels, + syms, unknown_label); + !reader.Done(); + reader.Next()) { + ++n; + const Fst *fst; + if (compact) + fst = reader.GetCompactFst(keep_syms); + else + fst = reader.GetVectorFst(keep_syms); + if (initial_symbols) + keep_syms = false; + if (!fst) { + FSTERROR() << "FarCompileStrings: compiling string number " << n + << " in file " << inputs[i] << " failed with token_type = " + << (tt == FTT_BYTE ? "byte" : + (tt == FTT_UTF8 ? "utf8" : + (tt == FTT_SYMBOL ? "symbol" : "unknown"))) + << " and entry_type = " + << (fet == FET_LINE ? "line" : + (fet == FET_FILE ? "file" : "unknown")); + delete far_writer; + delete syms; + if (!inputs[i].empty()) delete istrm; + return; + } + ostringstream keybuf; + keybuf.width(key_size); + keybuf.fill('0'); + keybuf << n; + string key; + if (generate_keys > 0) { + key = keybuf.str(); + } else { + char* filename = new char[inputs[i].size() + 1]; + strcpy(filename, inputs[i].c_str()); + key = basename(filename); + if (entry_type != StringReader::FILE) { + key += "-"; + key += keybuf.str(); + } + delete[] filename; + } + far_writer->Add(key_prefix + key + key_suffix, *fst); + delete fst; + } + if (generate_keys == 0) + n = 0; + if (!inputs[i].empty()) + delete istrm; + } + + delete far_writer; +} + +} // namespace fst + + +#endif // FST_EXTENSIONS_FAR_COMPILE_STRINGS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h new file mode 100755 index 00000000000..f6de9dc650f --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h @@ -0,0 +1,89 @@ +// create-main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// Modified: jpr@google.com (Jake Ratkiewicz) to use new dispatch +// +// \file +// Creates a finite-state archive from component FSTs. Includes +// helper function for farcreate.cc that templates the main on the arc +// type to support multiple and extensible arc types. +// + +#ifndef FST_EXTENSIONS_FAR_CREATE_H__ +#define FST_EXTENSIONS_FAR_CREATE_H__ + +#ifndef WINDOWS //ChangedPD + #include +#endif +#include +#include +using std::vector; + +#include + +namespace fst { + +template +void FarCreate(const vector &in_fnames, + const string &out_fname, + const int32 generate_keys, + const bool file_list_input, + const FarType &far_type, + const string &key_prefix, + const string &key_suffix) { + FarWriter *far_writer = + FarWriter::Create(out_fname, far_type); + if (!far_writer) return; + + vector inputs; + if (file_list_input) { + for (int i = 1; i < in_fnames.size(); ++i) { + ifstream istrm(in_fnames[i].c_str()); + string str; + while (getline(istrm, str)) + inputs.push_back(str); + } + } else { + inputs = in_fnames; + } + + for (int i = 0; i < inputs.size(); ++i) { + Fst *ifst = Fst::Read(inputs[i]); + if (!ifst) return; + string key; + if (generate_keys > 0) { + ostringstream keybuf; + keybuf.width(generate_keys); + keybuf.fill('0'); + keybuf << i + 1; + key = keybuf.str(); + } else { + char* filename = new char[inputs[i].size() + 1]; + strcpy(filename, inputs[i].c_str()); + key = basename(filename); + delete[] filename; + } + + far_writer->Add(key_prefix + key + key_suffix, *ifst); + delete ifst; + } + + delete far_writer; +} + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_CREATE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h.bak new file mode 100755 index 00000000000..edb31e7b085 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/create.h.bak @@ -0,0 +1,87 @@ +// create-main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// Modified: jpr@google.com (Jake Ratkiewicz) to use new dispatch +// +// \file +// Creates a finite-state archive from component FSTs. Includes +// helper function for farcreate.cc that templates the main on the arc +// type to support multiple and extensible arc types. +// + +#ifndef FST_EXTENSIONS_FAR_CREATE_H__ +#define FST_EXTENSIONS_FAR_CREATE_H__ + +#include +#include +#include +using std::vector; + +#include + +namespace fst { + +template +void FarCreate(const vector &in_fnames, + const string &out_fname, + const int32 generate_keys, + const bool file_list_input, + const FarType &far_type, + const string &key_prefix, + const string &key_suffix) { + FarWriter *far_writer = + FarWriter::Create(out_fname, far_type); + if (!far_writer) return; + + vector inputs; + if (file_list_input) { + for (int i = 1; i < in_fnames.size(); ++i) { + ifstream istrm(in_fnames[i].c_str()); + string str; + while (getline(istrm, str)) + inputs.push_back(str); + } + } else { + inputs = in_fnames; + } + + for (int i = 0; i < inputs.size(); ++i) { + Fst *ifst = Fst::Read(inputs[i]); + if (!ifst) return; + string key; + if (generate_keys > 0) { + ostringstream keybuf; + keybuf.width(generate_keys); + keybuf.fill('0'); + keybuf << i + 1; + key = keybuf.str(); + } else { + char* filename = new char[inputs[i].size() + 1]; + strcpy(filename, inputs[i].c_str()); + key = basename(filename); + delete[] filename; + } + + far_writer->Add(key_prefix + key + key_suffix, *ifst); + delete ifst; + } + + delete far_writer; +} + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_CREATE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/equal.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/equal.h new file mode 100755 index 00000000000..be82e2d2c6e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/equal.h @@ -0,0 +1,99 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) + +#ifndef FST_EXTENSIONS_FAR_EQUAL_H_ +#define FST_EXTENSIONS_FAR_EQUAL_H_ + +#include + +#include +#include + +namespace fst { + +template +bool FarEqual(const string &filename1, + const string &filename2, + float delta = kDelta, + const string &begin_key = string(), + const string &end_key = string()) { + + FarReader *reader1 = FarReader::Open(filename1); + FarReader *reader2 = FarReader::Open(filename2); + if (!reader1 || !reader2) { + delete reader1; + delete reader2; + VLOG(1) << "FarEqual: cannot open input Far file(s)"; + return false; + } + + if (!begin_key.empty()) { + bool find_begin1 = reader1->Find(begin_key); + bool find_begin2 = reader2->Find(begin_key); + if (!find_begin1 || !find_begin2) { + bool ret = !find_begin1 && !find_begin2; + if (!ret) { + VLOG(1) << "FarEqual: key \"" << begin_key << "\" missing from " + << (find_begin1 ? "second" : "first") << " archive."; + } + delete reader1; + delete reader2; + return ret; + } + } + + for(; !reader1->Done() && !reader2->Done(); + reader1->Next(), reader2->Next()) { + const string key1 = reader1->GetKey(); + const string key2 = reader2->GetKey(); + if (!end_key.empty() && end_key < key1 && end_key < key2) { + delete reader1; + delete reader2; + return true; + } + if (key1 != key2) { + VLOG(1) << "FarEqual: mismatched keys \"" + << key1 << "\" <> \"" << key2 << "\"."; + delete reader1; + delete reader2; + return false; + } + if (!Equal(reader1->GetFst(), reader2->GetFst(), delta)) { + VLOG(1) << "FarEqual: Fsts for key \"" << key1 << "\" are not equal."; + delete reader1; + delete reader2; + return false; + } + } + + if (!reader1->Done() || !reader2->Done()) { + VLOG(1) << "FarEqual: key \"" + << (reader1->Done() ? reader2->GetKey() : reader1->GetKey()) + << "\" missing form " << (reader2->Done() ? "first" : "second") + << " archive."; + delete reader1; + delete reader2; + return false; + } + + delete reader1; + delete reader2; + return true; +} + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_EQUAL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/extract.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/extract.h new file mode 100755 index 00000000000..022ca60a6fa --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/extract.h @@ -0,0 +1,85 @@ +// extract-main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// Modified: jpr@google.com (Jake Ratkiewicz) to use the new arc-dispatch + +// \file +// Extracts component FSTs from an finite-state archive. +// + +#ifndef FST_EXTENSIONS_FAR_EXTRACT_H__ +#define FST_EXTENSIONS_FAR_EXTRACT_H__ + +#include +#include +using std::vector; + +#include + +namespace fst { + +template +void FarExtract(const vector &ifilenames, + const int32 &generate_filenames, + const string &begin_key, + const string &end_key, + const string &filename_prefix, + const string &filename_suffix) { + FarReader *far_reader = FarReader::Open(ifilenames); + if (!far_reader) return; + + if (!begin_key.empty()) + far_reader->Find(begin_key); + + string okey; + int nrep = 0; + for (int i = 1; !far_reader->Done(); far_reader->Next(), ++i) { + string key = far_reader->GetKey(); + if (!end_key.empty() && end_key < key) + break; + const Fst &fst = far_reader->GetFst(); + + if (key == okey) + ++nrep; + else + nrep = 0; + + okey = key; + + string ofilename; + if (generate_filenames) { + ostringstream tmp; + tmp.width(generate_filenames); + tmp.fill('0'); + tmp << i; + ofilename = tmp.str(); + } else { + if (nrep > 0) { + ostringstream tmp; + tmp << '.' << nrep; + key += tmp.str(); + } + ofilename = key; + } + fst.Write(filename_prefix + ofilename + filename_suffix); + } + + return; +} + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_EXTRACT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/far.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/far.h new file mode 100755 index 00000000000..428950d7987 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/far.h @@ -0,0 +1,492 @@ +// far.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Finite-State Transducer (FST) archive classes. +// + +#ifndef FST_EXTENSIONS_FAR_FAR_H__ +#define FST_EXTENSIONS_FAR_FAR_H__ + +#include +#include +#include +#include + +namespace fst { + +enum FarEntryType { FET_LINE, FET_FILE }; +enum FarTokenType { FTT_SYMBOL, FTT_BYTE, FTT_UTF8 }; + +inline bool IsFst(const string &filename) { + ifstream strm(filename.c_str()); + if (!strm) + return false; + return IsFstHeader(strm, filename); +} + +// FST archive header class +class FarHeader { + public: + const string &FarType() const { return fartype_; } + const string &ArcType() const { return arctype_; } + + bool Read(const string &filename) { + FstHeader fsthdr; + if (filename.empty()) { + // Header reading unsupported on stdin. Assumes STList and StdArc. + fartype_ = "stlist"; + arctype_ = "standard"; + return true; + } else if (IsSTTable(filename)) { // Check if STTable + ReadSTTableHeader(filename, &fsthdr); + fartype_ = "sttable"; + arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType(); + return true; + } else if (IsSTList(filename)) { // Check if STList + ReadSTListHeader(filename, &fsthdr); + fartype_ = "sttable"; + arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType(); + return true; + } else if (IsFst(filename)) { // Check if Fst + ifstream istrm(filename.c_str()); + fsthdr.Read(istrm, filename); + fartype_ = "fst"; + arctype_ = fsthdr.ArcType().empty() ? "unknown" : fsthdr.ArcType(); + return true; + } + return false; + } + + private: + string fartype_; + string arctype_; +}; + +enum FarType { + FAR_DEFAULT = 0, + FAR_STTABLE = 1, + FAR_STLIST = 2, + FAR_FST = 3, +}; + +// This class creates an archive of FSTs. +template +class FarWriter { + public: + typedef A Arc; + + // Creates a new (empty) FST archive; returns NULL on error. + static FarWriter *Create(const string &filename, FarType type = FAR_DEFAULT); + + // Adds an FST to the end of an archive. Keys must be non-empty and + // in lexicographic order. FSTs must have a suitable write method. + virtual void Add(const string &key, const Fst &fst) = 0; + + virtual FarType Type() const = 0; + + virtual bool Error() const = 0; + + virtual ~FarWriter() {} + + protected: + FarWriter() {} + + private: + DISALLOW_COPY_AND_ASSIGN(FarWriter); +}; + + +// This class iterates through an existing archive of FSTs. +template +class FarReader { + public: + typedef A Arc; + + // Opens an existing FST archive in a single file; returns NULL on error. + // Sets current position to the beginning of the achive. + static FarReader *Open(const string &filename); + + // Opens an existing FST archive in multiple files; returns NULL on error. + // Sets current position to the beginning of the achive. + static FarReader *Open(const vector &filenames); + + // Resets current posision to beginning of archive. + virtual void Reset() = 0; + + // Sets current position to first entry >= key. Returns true if a match. + virtual bool Find(const string &key) = 0; + + // Current position at end of archive? + virtual bool Done() const = 0; + + // Move current position to next FST. + virtual void Next() = 0; + + // Returns key at the current position. This reference is invalidated if + // the current position in the archive is changed. + virtual const string &GetKey() const = 0; + + // Returns FST at the current position. This reference is invalidated if + // the current position in the archive is changed. + virtual const Fst &GetFst() const = 0; + + virtual FarType Type() const = 0; + + virtual bool Error() const = 0; + + virtual ~FarReader() {} + + protected: + FarReader() {} + + private: + DISALLOW_COPY_AND_ASSIGN(FarReader); +}; + + +template +class FstWriter { + public: + void operator()(ostream &strm, const Fst &fst) const { + fst.Write(strm, FstWriteOptions()); + } +}; + + +template +class STTableFarWriter : public FarWriter { + public: + typedef A Arc; + + static STTableFarWriter *Create(const string filename) { + STTableWriter, FstWriter > *writer = + STTableWriter, FstWriter >::Create(filename); + return new STTableFarWriter(writer); + } + + void Add(const string &key, const Fst &fst) { writer_->Add(key, fst); } + + FarType Type() const { return FAR_STTABLE; } + + bool Error() const { return writer_->Error(); } + + ~STTableFarWriter() { delete writer_; } + + private: + explicit STTableFarWriter(STTableWriter, FstWriter > *writer) + : writer_(writer) {} + + private: + STTableWriter, FstWriter > *writer_; + + DISALLOW_COPY_AND_ASSIGN(STTableFarWriter); +}; + + +template +class STListFarWriter : public FarWriter { + public: + typedef A Arc; + + static STListFarWriter *Create(const string filename) { + STListWriter, FstWriter > *writer = + STListWriter, FstWriter >::Create(filename); + return new STListFarWriter(writer); + } + + void Add(const string &key, const Fst &fst) { writer_->Add(key, fst); } + + FarType Type() const { return FAR_STLIST; } + + bool Error() const { return writer_->Error(); } + + ~STListFarWriter() { delete writer_; } + + private: + explicit STListFarWriter(STListWriter, FstWriter > *writer) + : writer_(writer) {} + + private: + STListWriter, FstWriter > *writer_; + + DISALLOW_COPY_AND_ASSIGN(STListFarWriter); +}; + + +template +FarWriter *FarWriter::Create(const string &filename, FarType type) { + switch(type) { + case FAR_DEFAULT: + if (filename.empty()) + return STListFarWriter::Create(filename); + case FAR_STTABLE: + return STTableFarWriter::Create(filename); + break; + case FAR_STLIST: + return STListFarWriter::Create(filename); + break; + default: + LOG(ERROR) << "FarWriter::Create: unknown far type"; + return 0; + } +} + + +template +class FstReader { + public: + Fst *operator()(istream &strm) const { + return Fst::Read(strm, FstReadOptions()); + } +}; + + +template +class STTableFarReader : public FarReader { + public: + typedef A Arc; + + static STTableFarReader *Open(const string &filename) { + STTableReader, FstReader > *reader = + STTableReader, FstReader >::Open(filename); + // TODO: error check + return new STTableFarReader(reader); + } + + static STTableFarReader *Open(const vector &filenames) { + STTableReader, FstReader > *reader = + STTableReader, FstReader >::Open(filenames); + // TODO: error check + return new STTableFarReader(reader); + } + + void Reset() { reader_->Reset(); } + + bool Find(const string &key) { return reader_->Find(key); } + + bool Done() const { return reader_->Done(); } + + void Next() { return reader_->Next(); } + + const string &GetKey() const { return reader_->GetKey(); } + + const Fst &GetFst() const { return reader_->GetEntry(); } + + FarType Type() const { return FAR_STTABLE; } + + bool Error() const { return reader_->Error(); } + + ~STTableFarReader() { delete reader_; } + + private: + explicit STTableFarReader(STTableReader, FstReader > *reader) + : reader_(reader) {} + + private: + STTableReader, FstReader > *reader_; + + DISALLOW_COPY_AND_ASSIGN(STTableFarReader); +}; + + +template +class STListFarReader : public FarReader { + public: + typedef A Arc; + + static STListFarReader *Open(const string &filename) { + STListReader, FstReader > *reader = + STListReader, FstReader >::Open(filename); + // TODO: error check + return new STListFarReader(reader); + } + + static STListFarReader *Open(const vector &filenames) { + STListReader, FstReader > *reader = + STListReader, FstReader >::Open(filenames); + // TODO: error check + return new STListFarReader(reader); + } + + void Reset() { reader_->Reset(); } + + bool Find(const string &key) { return reader_->Find(key); } + + bool Done() const { return reader_->Done(); } + + void Next() { return reader_->Next(); } + + const string &GetKey() const { return reader_->GetKey(); } + + const Fst &GetFst() const { return reader_->GetEntry(); } + + FarType Type() const { return FAR_STLIST; } + + bool Error() const { return reader_->Error(); } + + ~STListFarReader() { delete reader_; } + + private: + explicit STListFarReader(STListReader, FstReader > *reader) + : reader_(reader) {} + + private: + STListReader, FstReader > *reader_; + + DISALLOW_COPY_AND_ASSIGN(STListFarReader); +}; + +template +class FstFarReader : public FarReader { + public: + typedef A Arc; + + static FstFarReader *Open(const string &filename) { + vector filenames; + filenames.push_back(filename); + return new FstFarReader(filenames); + } + + static FstFarReader *Open(const vector &filenames) { + return new FstFarReader(filenames); + } + + FstFarReader(const vector &filenames) + : keys_(filenames), has_stdin_(false), pos_(0), fst_(0), error_(false) { + sort(keys_.begin(), keys_.end()); + streams_.resize(keys_.size(), 0); + for (size_t i = 0; i < keys_.size(); ++i) { + if (keys_[i].empty()) { + if (!has_stdin_) { + streams_[i] = &std::cin; + //sources_[i] = "stdin"; + has_stdin_ = true; + } else { + FSTERROR() << "FstFarReader::FstFarReader: stdin should only " + << "appear once in the input file list."; + error_ = true; + return; + } + } else { + streams_[i] = new ifstream( + keys_[i].c_str(), ifstream::in | ifstream::binary); + } + } + if (pos_ >= keys_.size()) return; + ReadFst(); + } + + void Reset() { + if (has_stdin_) { + FSTERROR() << "FstFarReader::Reset: operation not supported on stdin"; + error_ = true; + return; + } + pos_ = 0; + ReadFst(); + } + + bool Find(const string &key) { + if (has_stdin_) { + FSTERROR() << "FstFarReader::Find: operation not supported on stdin"; + error_ = true; + return false; + } + pos_ = 0;//TODO + ReadFst(); + return true; + } + + bool Done() const { return error_ || pos_ >= keys_.size(); } + + void Next() { + ++pos_; + ReadFst(); + } + + const string &GetKey() const { + return keys_[pos_]; + } + + const Fst &GetFst() const { + return *fst_; + } + + FarType Type() const { return FAR_FST; } + + bool Error() const { return error_; } + + ~FstFarReader() { + if (fst_) delete fst_; + for (size_t i = 0; i < keys_.size(); ++i) + delete streams_[i]; + } + + private: + void ReadFst() { + if (fst_) delete fst_; + if (pos_ >= keys_.size()) return; + streams_[pos_]->seekg(0); + fst_ = Fst::Read(*streams_[pos_], FstReadOptions()); + if (!fst_) { + FSTERROR() << "FstFarReader: error reading Fst from: " << keys_[pos_]; + error_ = true; + } + } + + private: + vector keys_; + vector streams_; + bool has_stdin_; + size_t pos_; + mutable Fst *fst_; + mutable bool error_; + + DISALLOW_COPY_AND_ASSIGN(FstFarReader); +}; + +template +FarReader *FarReader::Open(const string &filename) { + if (filename.empty()) + return STListFarReader::Open(filename); + else if (IsSTTable(filename)) + return STTableFarReader::Open(filename); + else if (IsSTList(filename)) + return STListFarReader::Open(filename); + else if (IsFst(filename)) + return FstFarReader::Open(filename); + return 0; +} + + +template +FarReader *FarReader::Open(const vector &filenames) { + if (!filenames.empty() && filenames[0].empty()) + return STListFarReader::Open(filenames); + else if (!filenames.empty() && IsSTTable(filenames[0])) + return STTableFarReader::Open(filenames); + else if (!filenames.empty() && IsSTList(filenames[0])) + return STListFarReader::Open(filenames); + else if (!filenames.empty() && IsFst(filenames[0])) + return FstFarReader::Open(filenames); + return 0; +} + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_FAR_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farlib.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farlib.h new file mode 100755 index 00000000000..91ba224e0fb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farlib.h @@ -0,0 +1,31 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// A finite-state archive (FAR) is used to store an indexable collection of +// FSTs in a single file. Utilities are provided to create FARs from FSTs, +// to iterate over FARs, and to extract specific FSTs from FARs. + +#ifndef FST_EXTENSIONS_FAR_FARLIB_H_ +#define FST_EXTENSIONS_FAR_FARLIB_H_ + +#include +#include +#include +#include +#include +#include + +#endif // FST_EXTENSIONS_FAR_FARLIB_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h new file mode 100755 index 00000000000..87771fce8c2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h @@ -0,0 +1,266 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Convenience file for including all of the FAR operations, +// or registering them for new arc types. + +#ifndef FST_EXTENSIONS_FAR_FARSCRIPT_H_ +#define FST_EXTENSIONS_FAR_FARSCRIPT_H_ + +#include +using std::vector; +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FarCompileStringsArgs { + const vector &in_fnames; + const string &out_fname; + const string &fst_type; + const FarType &far_type; + const int32 generate_keys; + const FarEntryType fet; + const FarTokenType tt; + const string &symbols_fname; + const string &unknown_symbol; + const bool keep_symbols; + const bool initial_symbols; + const bool allow_negative_labels; + const bool file_list_input; + const string &key_prefix; + const string &key_suffix; + + FarCompileStringsArgs(const vector &in_fnames, + const string &out_fname, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix) : + in_fnames(in_fnames), out_fname(out_fname), fst_type(fst_type), + far_type(far_type), generate_keys(generate_keys), fet(fet), + tt(tt), symbols_fname(symbols_fname), unknown_symbol(unknown_symbol), + keep_symbols(keep_symbols), initial_symbols(initial_symbols), + allow_negative_labels(allow_negative_labels), + file_list_input(file_list_input), key_prefix(key_prefix), + key_suffix(key_suffix) { } +}; + +template +void FarCompileStrings(FarCompileStringsArgs *args) { + fst::FarCompileStrings( + args->in_fnames, args->out_fname, args->fst_type, args->far_type, + args->generate_keys, args->fet, args->tt, args->symbols_fname, + args->unknown_symbol, args->keep_symbols, args->initial_symbols, + args->allow_negative_labels, args->file_list_input, + args->key_prefix, args->key_suffix); +} + +void OPENFSTDLL FarCompileStrings( //ChangedPD + const vector &in_fnames, + const string &out_fname, + const string &arc_type, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix); + + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FarCreateArgs { + const vector &in_fnames; + const string &out_fname; + const int32 generate_keys; + const bool file_list_input; + const FarType &far_type; + const string &key_prefix; + const string &key_suffix; + + FarCreateArgs( + const vector &in_fnames, const string &out_fname, + const int32 generate_keys, const bool file_list_input, + const FarType &far_type, const string &key_prefix, + const string &key_suffix) + : in_fnames(in_fnames), out_fname(out_fname), + generate_keys(generate_keys), file_list_input(file_list_input), + far_type(far_type), key_prefix(key_prefix), key_suffix(key_suffix) { } +}; + +template +void FarCreate(FarCreateArgs *args) { + fst::FarCreate(args->in_fnames, args->out_fname, args->generate_keys, + args->file_list_input, args->far_type, + args->key_prefix, args->key_suffix); +} + +void OPENFSTDLL FarCreate(const vector &in_fnames, //ChangedPD + const string &out_fname, + const string &arc_type, + const int32 generate_keys, + const bool file_list_input, + const FarType &far_type, + const string &key_prefix, + const string &key_suffix); + + +typedef args::Package FarEqualInnerArgs; +typedef args::WithReturnValue FarEqualArgs; + +template +void FarEqual(FarEqualArgs *args) { + args->retval = fst::FarEqual( + args->args.arg1, args->args.arg2, args->args.arg3, + args->args.arg4, args->args.arg5); +} + +bool FarEqual(const string &filename1, + const string &filename2, + const string &arc_type, + float delta = kDelta, + const string &begin_key = string(), + const string &end_key = string()); + + +typedef args::Package &, int32, + const string&, const string&, const string&, + const string&> FarExtractArgs; + +template +void FarExtract(FarExtractArgs *args) { + fst::FarExtract( + args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); +} + +void OPENFSTDLL FarExtract(const vector &ifilenames, //ChangedPD + const string &arc_type, + int32 generate_filenames, const string &begin_key, + const string &end_key, const string &filename_prefix, + const string &filename_suffix); + +typedef args::Package &, const string &, + const string &, const bool> FarInfoArgs; + +template +void FarInfo(FarInfoArgs *args) { + fst::FarInfo(args->arg1, args->arg2, args->arg3, args->arg4); +} + +void OPENFSTDLL FarInfo(const vector &filenames, //ChangedPD + const string &arc_type, + const string &begin_key, + const string &end_key, + const bool list_fsts); + +struct FarPrintStringsArgs { + const vector &ifilenames; + const FarEntryType entry_type; + const FarTokenType token_type; + const string &begin_key; + const string &end_key; + const bool print_key; + const string &symbols_fname; + const bool initial_symbols; + const int32 generate_filenames; + const string &filename_prefix; + const string &filename_suffix; + + FarPrintStringsArgs( + const vector &ifilenames, const FarEntryType entry_type, + const FarTokenType token_type, const string &begin_key, + const string &end_key, const bool print_key, + const string &symbols_fname, const bool initial_symbols, + const int32 generate_filenames, + const string &filename_prefix, const string &filename_suffix) : + ifilenames(ifilenames), entry_type(entry_type), token_type(token_type), + begin_key(begin_key), end_key(end_key), print_key(print_key), + symbols_fname(symbols_fname), initial_symbols(initial_symbols), + generate_filenames(generate_filenames), filename_prefix(filename_prefix), + filename_suffix(filename_suffix) { } +}; + +template +void FarPrintStrings(FarPrintStringsArgs *args) { + fst::FarPrintStrings( + args->ifilenames, args->entry_type, args->token_type, + args->begin_key, args->end_key, args->print_key, + args->symbols_fname, args->initial_symbols, args->generate_filenames, + args->filename_prefix, args->filename_suffix); +} + + +void OPENFSTDLL FarPrintStrings(const vector &ifilenames, //ChangedPD + const string &arc_type, + const FarEntryType entry_type, + const FarTokenType token_type, + const string &begin_key, + const string &end_key, + const bool print_key, + const string &symbols_fname, + const bool initial_symbols, + const int32 generate_filenames, + const string &filename_prefix, + const string &filename_suffix); + +} // namespace script +} // namespace fst + + +#define REGISTER_FST_FAR_OPERATIONS(ArcType) \ + REGISTER_FST_OPERATION(FarCompileStrings, ArcType, FarCompileStringsArgs); \ + REGISTER_FST_OPERATION(FarCreate, ArcType, FarCreateArgs); \ + REGISTER_FST_OPERATION(FarEqual, ArcType, FarEqualArgs); \ + REGISTER_FST_OPERATION(FarExtract, ArcType, FarExtractArgs); \ + REGISTER_FST_OPERATION(FarInfo, ArcType, FarInfoArgs); \ + REGISTER_FST_OPERATION(FarPrintStrings, ArcType, FarPrintStringsArgs) + +#endif // FST_EXTENSIONS_FAR_FARSCRIPT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h.bak new file mode 100755 index 00000000000..ba208176335 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/farscript.h.bak @@ -0,0 +1,266 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Convenience file for including all of the FAR operations, +// or registering them for new arc types. + +#ifndef FST_EXTENSIONS_FAR_FARSCRIPT_H_ +#define FST_EXTENSIONS_FAR_FARSCRIPT_H_ + +#include +using std::vector; +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FarCompileStringsArgs { + const vector &in_fnames; + const string &out_fname; + const string &fst_type; + const FarType &far_type; + const int32 generate_keys; + const FarEntryType fet; + const FarTokenType tt; + const string &symbols_fname; + const string &unknown_symbol; + const bool keep_symbols; + const bool initial_symbols; + const bool allow_negative_labels; + const bool file_list_input; + const string &key_prefix; + const string &key_suffix; + + FarCompileStringsArgs(const vector &in_fnames, + const string &out_fname, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix) : + in_fnames(in_fnames), out_fname(out_fname), fst_type(fst_type), + far_type(far_type), generate_keys(generate_keys), fet(fet), + tt(tt), symbols_fname(symbols_fname), unknown_symbol(unknown_symbol), + keep_symbols(keep_symbols), initial_symbols(initial_symbols), + allow_negative_labels(allow_negative_labels), + file_list_input(file_list_input), key_prefix(key_prefix), + key_suffix(key_suffix) { } +}; + +template +void FarCompileStrings(FarCompileStringsArgs *args) { + fst::FarCompileStrings( + args->in_fnames, args->out_fname, args->fst_type, args->far_type, + args->generate_keys, args->fet, args->tt, args->symbols_fname, + args->unknown_symbol, args->keep_symbols, args->initial_symbols, + args->allow_negative_labels, args->file_list_input, + args->key_prefix, args->key_suffix); +} + +void FarCompileStrings( + const vector &in_fnames, + const string &out_fname, + const string &arc_type, + const string &fst_type, + const FarType &far_type, + int32 generate_keys, + FarEntryType fet, + FarTokenType tt, + const string &symbols_fname, + const string &unknown_symbol, + bool keep_symbols, + bool initial_symbols, + bool allow_negative_labels, + bool file_list_input, + const string &key_prefix, + const string &key_suffix); + + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FarCreateArgs { + const vector &in_fnames; + const string &out_fname; + const int32 generate_keys; + const bool file_list_input; + const FarType &far_type; + const string &key_prefix; + const string &key_suffix; + + FarCreateArgs( + const vector &in_fnames, const string &out_fname, + const int32 generate_keys, const bool file_list_input, + const FarType &far_type, const string &key_prefix, + const string &key_suffix) + : in_fnames(in_fnames), out_fname(out_fname), + generate_keys(generate_keys), file_list_input(file_list_input), + far_type(far_type), key_prefix(key_prefix), key_suffix(key_suffix) { } +}; + +template +void FarCreate(FarCreateArgs *args) { + fst::FarCreate(args->in_fnames, args->out_fname, args->generate_keys, + args->file_list_input, args->far_type, + args->key_prefix, args->key_suffix); +} + +void FarCreate(const vector &in_fnames, + const string &out_fname, + const string &arc_type, + const int32 generate_keys, + const bool file_list_input, + const FarType &far_type, + const string &key_prefix, + const string &key_suffix); + + +typedef args::Package FarEqualInnerArgs; +typedef args::WithReturnValue FarEqualArgs; + +template +void FarEqual(FarEqualArgs *args) { + args->retval = fst::FarEqual( + args->args.arg1, args->args.arg2, args->args.arg3, + args->args.arg4, args->args.arg5); +} + +bool FarEqual(const string &filename1, + const string &filename2, + const string &arc_type, + float delta = kDelta, + const string &begin_key = string(), + const string &end_key = string()); + + +typedef args::Package &, int32, + const string&, const string&, const string&, + const string&> FarExtractArgs; + +template +void FarExtract(FarExtractArgs *args) { + fst::FarExtract( + args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); +} + +void FarExtract(const vector &ifilenames, + const string &arc_type, + int32 generate_filenames, const string &begin_key, + const string &end_key, const string &filename_prefix, + const string &filename_suffix); + +typedef args::Package &, const string &, + const string &, const bool> FarInfoArgs; + +template +void FarInfo(FarInfoArgs *args) { + fst::FarInfo(args->arg1, args->arg2, args->arg3, args->arg4); +} + +void FarInfo(const vector &filenames, + const string &arc_type, + const string &begin_key, + const string &end_key, + const bool list_fsts); + +struct FarPrintStringsArgs { + const vector &ifilenames; + const FarEntryType entry_type; + const FarTokenType token_type; + const string &begin_key; + const string &end_key; + const bool print_key; + const string &symbols_fname; + const bool initial_symbols; + const int32 generate_filenames; + const string &filename_prefix; + const string &filename_suffix; + + FarPrintStringsArgs( + const vector &ifilenames, const FarEntryType entry_type, + const FarTokenType token_type, const string &begin_key, + const string &end_key, const bool print_key, + const string &symbols_fname, const bool initial_symbols, + const int32 generate_filenames, + const string &filename_prefix, const string &filename_suffix) : + ifilenames(ifilenames), entry_type(entry_type), token_type(token_type), + begin_key(begin_key), end_key(end_key), print_key(print_key), + symbols_fname(symbols_fname), initial_symbols(initial_symbols), + generate_filenames(generate_filenames), filename_prefix(filename_prefix), + filename_suffix(filename_suffix) { } +}; + +template +void FarPrintStrings(FarPrintStringsArgs *args) { + fst::FarPrintStrings( + args->ifilenames, args->entry_type, args->token_type, + args->begin_key, args->end_key, args->print_key, + args->symbols_fname, args->initial_symbols, args->generate_filenames, + args->filename_prefix, args->filename_suffix); +} + + +void FarPrintStrings(const vector &ifilenames, + const string &arc_type, + const FarEntryType entry_type, + const FarTokenType token_type, + const string &begin_key, + const string &end_key, + const bool print_key, + const string &symbols_fname, + const bool initial_symbols, + const int32 generate_filenames, + const string &filename_prefix, + const string &filename_suffix); + +} // namespace script +} // namespace fst + + +#define REGISTER_FST_FAR_OPERATIONS(ArcType) \ + REGISTER_FST_OPERATION(FarCompileStrings, ArcType, FarCompileStringsArgs); \ + REGISTER_FST_OPERATION(FarCreate, ArcType, FarCreateArgs); \ + REGISTER_FST_OPERATION(FarEqual, ArcType, FarEqualArgs); \ + REGISTER_FST_OPERATION(FarExtract, ArcType, FarExtractArgs); \ + REGISTER_FST_OPERATION(FarInfo, ArcType, FarInfoArgs); \ + REGISTER_FST_OPERATION(FarPrintStrings, ArcType, FarPrintStringsArgs) + +#endif // FST_EXTENSIONS_FAR_FARSCRIPT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h new file mode 100755 index 00000000000..d1d429af739 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h @@ -0,0 +1,128 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// Modified: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_EXTENSIONS_FAR_INFO_H_ +#define FST_EXTENSIONS_FAR_INFO_H_ + +#include +#include +#include +#include +using std::vector; + +#include +#include // For FarTypeToString + +namespace fst { + +template +void CountStatesAndArcs(const Fst &fst, size_t *nstate, size_t *narc) { + StateIterator > siter(fst); + for (; !siter.Done(); siter.Next(), ++(*nstate)) { + ArcIterator > aiter(fst, siter.Value()); + for (; !aiter.Done(); aiter.Next(), ++(*narc)); + } +} + +struct KeyInfo { + string key; + string type; + size_t nstate; + size_t narc; + + KeyInfo(string k, string t, int64 ns = 0, int64 na = 0) + : key(k), type(t), nstate(ns), narc(na) {} +}; + +template +void FarInfo(const vector &filenames, const string &begin_key, + const string &end_key, const bool list_fsts) { + FarReader *far_reader = FarReader::Open(filenames); + if (!far_reader) return; + + if (!begin_key.empty()) + far_reader->Find(begin_key); + + vector *infos = list_fsts ? new vector() : 0; + size_t nfst = 0, nstate = 0, narc = 0; + set fst_types; + for (; !far_reader->Done(); far_reader->Next()) { + string key = far_reader->GetKey(); + if (!end_key.empty() && end_key < key) + break; + ++nfst; + const Fst &fst = far_reader->GetFst(); + fst_types.insert(fst.Type()); + if (infos) { + KeyInfo info(key, fst.Type()); + CountStatesAndArcs(fst, &info.nstate, &info.narc); + nstate += info.nstate; + nstate += info.narc; + infos->push_back(info); + } else { + CountStatesAndArcs(fst, &nstate, &narc); + } + } + + if (!infos) { + cout << std::left << setw(50) << "far type" + << FarTypeToString(far_reader->Type()) << endl; + cout << std::left << setw(50) << "arc type" << Arc::Type() << endl; + cout << std::left << setw(50) << "fst type"; + for (set::const_iterator iter = fst_types.begin(); + iter != fst_types.end(); + ++iter) { + if (iter != fst_types.begin()) + cout << ","; + cout << *iter; + } + cout << endl; + cout << std::left << setw(50) << "# of FSTs" << nfst << endl; + cout << std::left << setw(50) << "total # of states" << nstate << endl; + cout << std::left << setw(50) << "total # of arcs" << narc << endl; + + } else { + int wkey = 10, wtype = 10, wnstate = 16, wnarc = 16; + for (size_t i = 0; i < infos->size(); ++i) { + const KeyInfo &info = (*infos)[i]; + if (info.key.size() + 2 > wkey) + wkey = info.key.size() + 2; + if (info.type.size() + 2 > wtype) + wtype = info.type.size() + 2; + if (ceil(log10((double)info.nstate)) + 2 > wnstate) //ChangedPD + wnstate = ceil(log10((double)info.nstate)) + 2; //ChangedPD + if (ceil(log10((double)info.narc)) + 2 > wnarc) //ChangedPD + wnarc = ceil(log10((double)info.narc)) + 2; //ChangedPD + } + + cout << std::left << setw(wkey) << "key" << setw(wtype) << "type" + << std::right << setw(wnstate) << "# of states" + << setw(wnarc) << "# of arcs" << endl; + + for (size_t i = 0; i < infos->size(); ++i) { + const KeyInfo &info = (*infos)[i]; + cout << std::left << setw(wkey) << info.key << setw(wtype) << info.type + << std::right << setw(wnstate) << info.nstate + << setw(wnarc) << info.narc << endl; + } + } +} + +} // namespace fst + + +#endif // FST_EXTENSIONS_FAR_INFO_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h.bak new file mode 100755 index 00000000000..f01054692e7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/info.h.bak @@ -0,0 +1,128 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// Modified: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_EXTENSIONS_FAR_INFO_H_ +#define FST_EXTENSIONS_FAR_INFO_H_ + +#include +#include +#include +#include +using std::vector; + +#include +#include // For FarTypeToString + +namespace fst { + +template +void CountStatesAndArcs(const Fst &fst, size_t *nstate, size_t *narc) { + StateIterator > siter(fst); + for (; !siter.Done(); siter.Next(), ++(*nstate)) { + ArcIterator > aiter(fst, siter.Value()); + for (; !aiter.Done(); aiter.Next(), ++(*narc)); + } +} + +struct KeyInfo { + string key; + string type; + size_t nstate; + size_t narc; + + KeyInfo(string k, string t, int64 ns = 0, int64 na = 0) + : key(k), type(t), nstate(ns), narc(na) {} +}; + +template +void FarInfo(const vector &filenames, const string &begin_key, + const string &end_key, const bool list_fsts) { + FarReader *far_reader = FarReader::Open(filenames); + if (!far_reader) return; + + if (!begin_key.empty()) + far_reader->Find(begin_key); + + vector *infos = list_fsts ? new vector() : 0; + size_t nfst = 0, nstate = 0, narc = 0; + set fst_types; + for (; !far_reader->Done(); far_reader->Next()) { + string key = far_reader->GetKey(); + if (!end_key.empty() && end_key < key) + break; + ++nfst; + const Fst &fst = far_reader->GetFst(); + fst_types.insert(fst.Type()); + if (infos) { + KeyInfo info(key, fst.Type()); + CountStatesAndArcs(fst, &info.nstate, &info.narc); + nstate += info.nstate; + nstate += info.narc; + infos->push_back(info); + } else { + CountStatesAndArcs(fst, &nstate, &narc); + } + } + + if (!infos) { + cout << std::left << setw(50) << "far type" + << FarTypeToString(far_reader->Type()) << endl; + cout << std::left << setw(50) << "arc type" << Arc::Type() << endl; + cout << std::left << setw(50) << "fst type"; + for (set::const_iterator iter = fst_types.begin(); + iter != fst_types.end(); + ++iter) { + if (iter != fst_types.begin()) + cout << ","; + cout << *iter; + } + cout << endl; + cout << std::left << setw(50) << "# of FSTs" << nfst << endl; + cout << std::left << setw(50) << "total # of states" << nstate << endl; + cout << std::left << setw(50) << "total # of arcs" << narc << endl; + + } else { + int wkey = 10, wtype = 10, wnstate = 16, wnarc = 16; + for (size_t i = 0; i < infos->size(); ++i) { + const KeyInfo &info = (*infos)[i]; + if (info.key.size() + 2 > wkey) + wkey = info.key.size() + 2; + if (info.type.size() + 2 > wtype) + wtype = info.type.size() + 2; + if (ceil(log10(info.nstate)) + 2 > wnstate) + wnstate = ceil(log10(info.nstate)) + 2; + if (ceil(log10(info.narc)) + 2 > wnarc) + wnarc = ceil(log10(info.narc)) + 2; + } + + cout << std::left << setw(wkey) << "key" << setw(wtype) << "type" + << std::right << setw(wnstate) << "# of states" + << setw(wnarc) << "# of arcs" << endl; + + for (size_t i = 0; i < infos->size(); ++i) { + const KeyInfo &info = (*infos)[i]; + cout << std::left << setw(wkey) << info.key << setw(wtype) << info.type + << std::right << setw(wnstate) << info.nstate + << setw(wnarc) << info.narc << endl; + } + } +} + +} // namespace fst + + +#endif // FST_EXTENSIONS_FAR_INFO_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h new file mode 100755 index 00000000000..6702983f3e3 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h @@ -0,0 +1,48 @@ +// main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes and functions for registering and invoking Far main +// functions that support multiple and extensible arc types. + +#ifndef FST_EXTENSIONS_FAR_MAIN_H__ +#define FST_EXTENSIONS_FAR_MAIN_H__ + +#include + +namespace fst { + +FarEntryType OPENFSTDLL StringToFarEntryType(const string &s); //ChangedPD +FarTokenType OPENFSTDLL StringToFarTokenType(const string &s); //ChangedPD + +// Return the 'FarType' value corresponding to a far type name. +FarType OPENFSTDLL FarTypeFromString(const string &str); //ChangedPD + +// Return the textual name corresponding to a 'FarType;. +string OPENFSTDLL FarTypeToString(FarType type); //ChangedPD + +string OPENFSTDLL LoadArcTypeFromFar(const string& far_fname); //ChangedPD +string OPENFSTDLL LoadArcTypeFromFst(const string& far_fname); //ChangedPD + +#ifdef _MSC_VER //AddedPD + const char kFileSeperator = '\\'; + std::string OPENFSTDLL basename(const std::string &filename); +#endif + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_MAIN_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h.bak new file mode 100755 index 00000000000..00ccfef4537 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/main.h.bak @@ -0,0 +1,43 @@ +// main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes and functions for registering and invoking Far main +// functions that support multiple and extensible arc types. + +#ifndef FST_EXTENSIONS_FAR_MAIN_H__ +#define FST_EXTENSIONS_FAR_MAIN_H__ + +#include + +namespace fst { + +FarEntryType StringToFarEntryType(const string &s); +FarTokenType StringToFarTokenType(const string &s); + +// Return the 'FarType' value corresponding to a far type name. +FarType FarTypeFromString(const string &str); + +// Return the textual name corresponding to a 'FarType;. +string FarTypeToString(FarType type); + +string LoadArcTypeFromFar(const string& far_fname); +string LoadArcTypeFromFst(const string& far_fname); + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_MAIN_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/print-strings.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/print-strings.h new file mode 100755 index 00000000000..1051d2a0b94 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/print-strings.h @@ -0,0 +1,129 @@ +// printstrings-main.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// Modified by: jpr@google.com (Jake Ratkiewicz) +// +// \file +// Output as strings the string FSTs in a finite-state archive. + +#ifndef FST_EXTENSIONS_FAR_PRINT_STRINGS_H__ +#define FST_EXTENSIONS_FAR_PRINT_STRINGS_H__ + +#include +#include +using std::vector; + +#include +#include + +namespace fst { + +template +void FarPrintStrings( + const vector &ifilenames, const FarEntryType entry_type, + const FarTokenType far_token_type, const string &begin_key, + const string &end_key, const bool print_key, const string &symbols_fname, + const bool initial_symbols, const int32 generate_filenames, + const string &filename_prefix, const string &filename_suffix) { + + typename StringPrinter::TokenType token_type; + if (far_token_type == FTT_SYMBOL) { + token_type = StringPrinter::SYMBOL; + } else if (far_token_type == FTT_BYTE) { + token_type = StringPrinter::BYTE; + } else if (far_token_type == FTT_UTF8) { + token_type = StringPrinter::UTF8; + } else { + FSTERROR() << "FarPrintStrings: unknown token type"; + return; + } + + const SymbolTable *syms = 0; + if (!symbols_fname.empty()) { + // allow negative flag? + syms = SymbolTable::ReadText(symbols_fname, true); + if (!syms) { + FSTERROR() << "FarPrintStrings: error reading symbol table: " + << symbols_fname; + return; + } + } + + FarReader *far_reader = FarReader::Open(ifilenames); + if (!far_reader) return; + + if (!begin_key.empty()) + far_reader->Find(begin_key); + + string okey; + int nrep = 0; + for (int i = 1; !far_reader->Done(); far_reader->Next(), ++i) { + string key = far_reader->GetKey(); + if (!end_key.empty() && end_key < key) + break; + if (okey == key) + ++nrep; + else + nrep = 0; + okey = key; + + const Fst &fst = far_reader->GetFst(); + if (i == 1 && initial_symbols && syms == 0 && fst.InputSymbols() != 0) + syms = fst.InputSymbols()->Copy(); + string str; + VLOG(2) << "Handling key: " << key; + StringPrinter string_printer( + token_type, syms ? syms : fst.InputSymbols()); + string_printer(fst, &str); + + if (entry_type == FET_LINE) { + if (print_key) + cout << key << "\t"; + cout << str << endl; + } else if (entry_type == FET_FILE) { + stringstream sstrm; + if (generate_filenames) { + sstrm.fill('0'); + sstrm << std::right << setw(generate_filenames) << i; + } else { + sstrm << key; + if (nrep > 0) + sstrm << "." << nrep; + } + + string filename; + filename = filename_prefix + sstrm.str() + filename_suffix; + + ofstream ostrm(filename.c_str()); + if (!ostrm) { + FSTERROR() << "FarPrintStrings: Can't open file:" << filename; + delete syms; + delete far_reader; + return; + } + ostrm << str; + if (token_type == StringPrinter::SYMBOL) + ostrm << "\n"; + } + } + delete syms; +} + + + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_PRINT_STRINGS_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h new file mode 100755 index 00000000000..4b42ae417ca --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h @@ -0,0 +1,305 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// A generic (string,type) list file format. +// +// This is a stripped-down version of STTable that does +// not support the Find() operation but that does support +// reading/writting from standard in/out. + +#ifndef FST_EXTENSIONS_FAR_STLIST_H_ +#define FST_EXTENSIONS_FAR_STLIST_H_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +namespace fst { + +static const int32 kSTListMagicNumber = 5656924; +static const int32 kSTListFileVersion = 1; + +// String-type list writing class for object of type 'T' using functor 'W' +// to write an object of type 'T' from a stream. 'W' must conform to the +// following interface: +// +// struct Writer { +// void operator()(ostream &, const T &) const; +// }; +// +template +class STListWriter { + public: + typedef T EntryType; + typedef W EntryWriter; + + explicit STListWriter(const string filename) + : stream_( + filename.empty() ? &std::cout : + new ofstream(filename.c_str(), ofstream::out | ofstream::binary)), + error_(false) { + WriteType(*stream_, kSTListMagicNumber); + WriteType(*stream_, kSTListFileVersion); + if (!stream_) { + FSTERROR() << "STListWriter::STListWriter: error writing to file: " + << filename; + error_ = true; + } + } + + static STListWriter *Create(const string &filename) { + return new STListWriter(filename); + } + + void Add(const string &key, const T &t) { + if (key == "") { + FSTERROR() << "STListWriter::Add: key empty: " << key; + error_ = true; + } else if (key < last_key_) { + FSTERROR() << "STListWriter::Add: key disorder: " << key; + error_ = true; + } + if (error_) return; + last_key_ = key; + WriteType(*stream_, key); + entry_writer_(*stream_, t); + } + + bool Error() const { return error_; } + + ~STListWriter() { + WriteType(*stream_, string()); + if (stream_ != &std::cout) + delete stream_; + } + + private: + EntryWriter entry_writer_; // Write functor for 'EntryType' + ostream *stream_; // Output stream + string last_key_; // Last key + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STListWriter); +}; + + +// String-type list reading class for object of type 'T' using functor 'R' +// to read an object of type 'T' form a stream. 'R' must conform to the +// following interface: +// +// struct Reader { +// T *operator()(istream &) const; +// }; +// +template +class STListReader { + public: + typedef T EntryType; + typedef R EntryReader; + + explicit STListReader(const vector &filenames) + : sources_(filenames), entry_(0), error_(false) { + streams_.resize(filenames.size(), 0); + bool has_stdin = false; + for (size_t i = 0; i < filenames.size(); ++i) { + if (filenames[i].empty()) { + if (!has_stdin) { + streams_[i] = &std::cin; + sources_[i] = "stdin"; + has_stdin = true; + } else { + FSTERROR() << "STListReader::STListReader: stdin should only " + << "appear once in the input file list."; + error_ = true; + return; + } + } else { + streams_[i] = new ifstream( + filenames[i].c_str(), ifstream::in | ifstream::binary); + } + int32 magic_number = 0, file_version = 0; + ReadType(*streams_[i], &magic_number); + ReadType(*streams_[i], &file_version); + if (magic_number != kSTListMagicNumber) { + FSTERROR() << "STListReader::STTableReader: wrong file type: " + << filenames[i]; + error_ = true; + return; + } + if (file_version != kSTListFileVersion) { + FSTERROR() << "STListReader::STTableReader: wrong file version: " + << filenames[i]; + error_ = true; + return; + } + string key; + ReadType(*streams_[i], &key); + if (!key.empty()) + heap_.push(make_pair(key, i)); + if (!*streams_[i]) { + FSTERROR() << "STTableReader: error reading file: " << sources_[i]; + error_ = true; + return; + } + } + if (heap_.empty()) return; + size_t current = heap_.top().second; + entry_ = entry_reader_(*streams_[current]); + if (!entry_ || !*streams_[current]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << heap_.top().first << ", file: " << sources_[current]; + error_ = true; + } + } + + ~STListReader() { + for (size_t i = 0; i < streams_.size(); ++i) { + if (streams_[i] != &std::cin) + delete streams_[i]; + } + if (entry_) + delete entry_; + } + + static STListReader *Open(const string &filename) { + vector filenames; + filenames.push_back(filename); + return new STListReader(filenames); + } + + static STListReader *Open(const vector &filenames) { + return new STListReader(filenames); + } + + void Reset() { + FSTERROR() + << "STListReader::Reset: stlist does not support reset operation"; + error_ = true; + } + + bool Find(const string &key) { + FSTERROR() + << "STListReader::Find: stlist does not support find operation"; + error_ = true; + return false; + } + + bool Done() const { + return error_ || heap_.empty(); + } + + void Next() { + if (error_) return; + size_t current = heap_.top().second; + string key; + heap_.pop(); + ReadType(*(streams_[current]), &key); + if (!*streams_[current]) { + FSTERROR() << "STTableReader: error reading file: " + << sources_[current]; + error_ = true; + return; + } + if (!key.empty()) + heap_.push(make_pair(key, current)); + + if(!heap_.empty()) { + current = heap_.top().second; + if (entry_) + delete entry_; + entry_ = entry_reader_(*streams_[current]); + if (!entry_ || !*streams_[current]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << heap_.top().first << ", file: " << sources_[current]; + error_ = true; + } + } + } + + const string &GetKey() const { + return heap_.top().first; + } + + const EntryType &GetEntry() const { + return *entry_; + } + + bool Error() const { return error_; } + + private: + EntryReader entry_reader_; // Read functor for 'EntryType' + vector streams_; // Input streams + vector sources_; // and corresponding file names + priority_queue< + pair, vector >, + greater > > heap_; // (Key, stream id) heap + mutable EntryType *entry_; // Pointer to the currently read entry + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STListReader); +}; + + +// String-type list header reading function template on the entry header +// type 'H' having a member function: +// Read(istream &strm, const string &filename); +// Checks that 'filename' is an STTable and call the H::Read() on the last +// entry in the STTable. +// Does not support reading from stdin. +template +bool ReadSTListHeader(const string &filename, H *header) { + if (filename.empty()) { + LOG(ERROR) << "ReadSTListHeader: reading header not supported on stdin"; + return false; + } + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(strm, &magic_number); + ReadType(strm, &file_version); + if (magic_number != kSTListMagicNumber) { + LOG(ERROR) << "ReadSTTableHeader: wrong file type: " << filename; + return false; + } + if (file_version != kSTListFileVersion) { + LOG(ERROR) << "ReadSTTableHeader: wrong file version: " << filename; + return false; + } + string key; + ReadType(strm, &key); + header->Read(strm, filename + ":" + key); + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + return true; +} + +bool OPENFSTDLL IsSTList(const string &filename); //ChangedPD + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_STLIST_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h.bak new file mode 100755 index 00000000000..cc913d7cedb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/stlist.h.bak @@ -0,0 +1,305 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// A generic (string,type) list file format. +// +// This is a stripped-down version of STTable that does +// not support the Find() operation but that does support +// reading/writting from standard in/out. + +#ifndef FST_EXTENSIONS_FAR_STLIST_H_ +#define FST_EXTENSIONS_FAR_STLIST_H_ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +namespace fst { + +static const int32 kSTListMagicNumber = 5656924; +static const int32 kSTListFileVersion = 1; + +// String-type list writing class for object of type 'T' using functor 'W' +// to write an object of type 'T' from a stream. 'W' must conform to the +// following interface: +// +// struct Writer { +// void operator()(ostream &, const T &) const; +// }; +// +template +class STListWriter { + public: + typedef T EntryType; + typedef W EntryWriter; + + explicit STListWriter(const string filename) + : stream_( + filename.empty() ? &std::cout : + new ofstream(filename.c_str(), ofstream::out | ofstream::binary)), + error_(false) { + WriteType(*stream_, kSTListMagicNumber); + WriteType(*stream_, kSTListFileVersion); + if (!stream_) { + FSTERROR() << "STListWriter::STListWriter: error writing to file: " + << filename; + error_ = true; + } + } + + static STListWriter *Create(const string &filename) { + return new STListWriter(filename); + } + + void Add(const string &key, const T &t) { + if (key == "") { + FSTERROR() << "STListWriter::Add: key empty: " << key; + error_ = true; + } else if (key < last_key_) { + FSTERROR() << "STListWriter::Add: key disorder: " << key; + error_ = true; + } + if (error_) return; + last_key_ = key; + WriteType(*stream_, key); + entry_writer_(*stream_, t); + } + + bool Error() const { return error_; } + + ~STListWriter() { + WriteType(*stream_, string()); + if (stream_ != &std::cout) + delete stream_; + } + + private: + EntryWriter entry_writer_; // Write functor for 'EntryType' + ostream *stream_; // Output stream + string last_key_; // Last key + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STListWriter); +}; + + +// String-type list reading class for object of type 'T' using functor 'R' +// to read an object of type 'T' form a stream. 'R' must conform to the +// following interface: +// +// struct Reader { +// T *operator()(istream &) const; +// }; +// +template +class STListReader { + public: + typedef T EntryType; + typedef R EntryReader; + + explicit STListReader(const vector &filenames) + : sources_(filenames), entry_(0), error_(false) { + streams_.resize(filenames.size(), 0); + bool has_stdin = false; + for (size_t i = 0; i < filenames.size(); ++i) { + if (filenames[i].empty()) { + if (!has_stdin) { + streams_[i] = &std::cin; + sources_[i] = "stdin"; + has_stdin = true; + } else { + FSTERROR() << "STListReader::STListReader: stdin should only " + << "appear once in the input file list."; + error_ = true; + return; + } + } else { + streams_[i] = new ifstream( + filenames[i].c_str(), ifstream::in | ifstream::binary); + } + int32 magic_number = 0, file_version = 0; + ReadType(*streams_[i], &magic_number); + ReadType(*streams_[i], &file_version); + if (magic_number != kSTListMagicNumber) { + FSTERROR() << "STListReader::STTableReader: wrong file type: " + << filenames[i]; + error_ = true; + return; + } + if (file_version != kSTListFileVersion) { + FSTERROR() << "STListReader::STTableReader: wrong file version: " + << filenames[i]; + error_ = true; + return; + } + string key; + ReadType(*streams_[i], &key); + if (!key.empty()) + heap_.push(make_pair(key, i)); + if (!*streams_[i]) { + FSTERROR() << "STTableReader: error reading file: " << sources_[i]; + error_ = true; + return; + } + } + if (heap_.empty()) return; + size_t current = heap_.top().second; + entry_ = entry_reader_(*streams_[current]); + if (!entry_ || !*streams_[current]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << heap_.top().first << ", file: " << sources_[current]; + error_ = true; + } + } + + ~STListReader() { + for (size_t i = 0; i < streams_.size(); ++i) { + if (streams_[i] != &std::cin) + delete streams_[i]; + } + if (entry_) + delete entry_; + } + + static STListReader *Open(const string &filename) { + vector filenames; + filenames.push_back(filename); + return new STListReader(filenames); + } + + static STListReader *Open(const vector &filenames) { + return new STListReader(filenames); + } + + void Reset() { + FSTERROR() + << "STListReader::Reset: stlist does not support reset operation"; + error_ = true; + } + + bool Find(const string &key) { + FSTERROR() + << "STListReader::Find: stlist does not support find operation"; + error_ = true; + return false; + } + + bool Done() const { + return error_ || heap_.empty(); + } + + void Next() { + if (error_) return; + size_t current = heap_.top().second; + string key; + heap_.pop(); + ReadType(*(streams_[current]), &key); + if (!*streams_[current]) { + FSTERROR() << "STTableReader: error reading file: " + << sources_[current]; + error_ = true; + return; + } + if (!key.empty()) + heap_.push(make_pair(key, current)); + + if(!heap_.empty()) { + current = heap_.top().second; + if (entry_) + delete entry_; + entry_ = entry_reader_(*streams_[current]); + if (!entry_ || !*streams_[current]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << heap_.top().first << ", file: " << sources_[current]; + error_ = true; + } + } + } + + const string &GetKey() const { + return heap_.top().first; + } + + const EntryType &GetEntry() const { + return *entry_; + } + + bool Error() const { return error_; } + + private: + EntryReader entry_reader_; // Read functor for 'EntryType' + vector streams_; // Input streams + vector sources_; // and corresponding file names + priority_queue< + pair, vector >, + greater > > heap_; // (Key, stream id) heap + mutable EntryType *entry_; // Pointer to the currently read entry + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STListReader); +}; + + +// String-type list header reading function template on the entry header +// type 'H' having a member function: +// Read(istream &strm, const string &filename); +// Checks that 'filename' is an STTable and call the H::Read() on the last +// entry in the STTable. +// Does not support reading from stdin. +template +bool ReadSTListHeader(const string &filename, H *header) { + if (filename.empty()) { + LOG(ERROR) << "ReadSTListHeader: reading header not supported on stdin"; + return false; + } + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(strm, &magic_number); + ReadType(strm, &file_version); + if (magic_number != kSTListMagicNumber) { + LOG(ERROR) << "ReadSTTableHeader: wrong file type: " << filename; + return false; + } + if (file_version != kSTListFileVersion) { + LOG(ERROR) << "ReadSTTableHeader: wrong file version: " << filename; + return false; + } + string key; + ReadType(strm, &key); + header->Read(strm, filename + ":" + key); + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + return true; +} + +bool IsSTList(const string &filename); + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_STLIST_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h new file mode 100755 index 00000000000..5bf29fa20b6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h @@ -0,0 +1,371 @@ +// sttable.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// A generic string-to-type table file format +// +// This is not meant as a generalization of SSTable. This is more of +// a simple replacement for SSTable in order to provide an open-source +// implementation of the FAR format for the external version of the +// FST Library. + +#ifndef FST_EXTENSIONS_FAR_STTABLE_H_ +#define FST_EXTENSIONS_FAR_STTABLE_H_ + +#include +#include +#include +#include +#include + +namespace fst { + +static const int32 kSTTableMagicNumber = 2125656924; +static const int32 kSTTableFileVersion = 1; + +// String-to-type table writing class for object of type 'T' using functor 'W' +// to write an object of type 'T' from a stream. 'W' must conform to the +// following interface: +// +// struct Writer { +// void operator()(ostream &, const T &) const; +// }; +// +template +class STTableWriter { + public: + typedef T EntryType; + typedef W EntryWriter; + + explicit STTableWriter(const string &filename) + : stream_(filename.c_str(), ofstream::out | ofstream::binary), + error_(false) { + WriteType(stream_, kSTTableMagicNumber); + WriteType(stream_, kSTTableFileVersion); + if (!stream_) { + FSTERROR() << "STTableWriter::STTableWriter: error writing to file: " + << filename; + error_=true; + } + } + + static STTableWriter *Create(const string &filename) { + if (filename.empty()) { + LOG(ERROR) << "STTableWriter: writing to standard out unsupported."; + return 0; + } + return new STTableWriter(filename); + } + + void Add(const string &key, const T &t) { + if (key == "") { + FSTERROR() << "STTableWriter::Add: key empty: " << key; + error_ = true; + } else if (key < last_key_) { + FSTERROR() << "STTableWriter::Add: key disorder: " << key; + error_ = true; + } + if (error_) return; + last_key_ = key; + positions_.push_back(stream_.tellp()); + WriteType(stream_, key); + entry_writer_(stream_, t); + } + + bool Error() const { return error_; } + + ~STTableWriter() { + WriteType(stream_, positions_); + WriteType(stream_, static_cast(positions_.size())); + } + + private: + EntryWriter entry_writer_; // Write functor for 'EntryType' + ofstream stream_; // Output stream + vector positions_; // Position in file of each key-entry pair + string last_key_; // Last key + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STTableWriter); +}; + + +// String-to-type table reading class for object of type 'T' using functor 'R' +// to read an object of type 'T' form a stream. 'R' must conform to the +// following interface: +// +// struct Reader { +// T *operator()(istream &) const; +// }; +// +template +class STTableReader { + public: + typedef T EntryType; + typedef R EntryReader; + + explicit STTableReader(const vector &filenames) + : sources_(filenames), entry_(0), error_(false) { + compare_ = new Compare(&keys_); + keys_.resize(filenames.size()); + streams_.resize(filenames.size(), 0); + positions_.resize(filenames.size()); + for (size_t i = 0; i < filenames.size(); ++i) { + streams_[i] = new ifstream( + filenames[i].c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(*streams_[i], &magic_number); + ReadType(*streams_[i], &file_version); + if (magic_number != kSTTableMagicNumber) { + FSTERROR() << "STTableReader::STTableReader: wrong file type: " + << filenames[i]; + error_ = true; + return; + } + if (file_version != kSTTableFileVersion) { + FSTERROR() << "STTableReader::STTableReader: wrong file version: " + << filenames[i]; + error_ = true; + return; + } + int64 num_entries; + streams_[i]->seekg(-static_cast(sizeof(int64)), ios_base::end); + ReadType(*streams_[i], &num_entries); + streams_[i]->seekg(-static_cast(sizeof(int64)) * + (num_entries + 1), ios_base::end); + positions_[i].resize(num_entries); + for (size_t j = 0; (j < num_entries) && (*streams_[i]); ++j) + ReadType(*streams_[i], &(positions_[i][j])); + streams_[i]->seekg(positions_[i][0]); + if (!*streams_[i]) { + FSTERROR() << "STTableReader::STTableReader: error reading file: " + << filenames[i]; + error_ = true; + return; + } + + } + MakeHeap(); + } + + ~STTableReader() { + for (size_t i = 0; i < streams_.size(); ++i) + delete streams_[i]; + delete compare_; + if (entry_) + delete entry_; + } + + static STTableReader *Open(const string &filename) { + if (filename.empty()) { + LOG(ERROR) << "STTableReader: reading from standard in not supported"; + return 0; + } + vector filenames; + filenames.push_back(filename); + return new STTableReader(filenames); + } + + static STTableReader *Open(const vector &filenames) { + return new STTableReader(filenames); + } + + void Reset() { + if (error_) return; + for (size_t i = 0; i < streams_.size(); ++i) + streams_[i]->seekg(positions_[i].front()); + MakeHeap(); + } + + bool Find(const string &key) { + if (error_) return false; + for (size_t i = 0; i < streams_.size(); ++i) + LowerBound(i, key); + MakeHeap(); + return keys_[current_] == key; + } + + bool Done() const { return error_ || heap_.empty(); } + + void Next() { + if (error_) return; + if (streams_[current_]->tellg() <= positions_[current_].back()) { + ReadType(*(streams_[current_]), &(keys_[current_])); + if (!*streams_[current_]) { + FSTERROR() << "STTableReader: error reading file: " + << sources_[current_]; + error_ = true; + return; + } + push_heap(heap_.begin(), heap_.end(), *compare_); + } else { + heap_.pop_back(); + } + if (!heap_.empty()) + PopHeap(); + } + + const string &GetKey() const { + return keys_[current_]; + } + + const EntryType &GetEntry() const { + return *entry_; + } + + bool Error() const { return error_; } + + private: + // Comparison functor used to compare stream IDs in the heap + struct Compare { + Compare(const vector *keys) : keys_(keys) {} + + bool operator()(size_t i, size_t j) const { + return (*keys_)[i] > (*keys_)[j]; + }; + + private: + const vector *keys_; + }; + + // Position the stream with ID 'id' at the position corresponding + // to the lower bound for key 'find_key' + void LowerBound(size_t id, const string &find_key) { + ifstream *strm = streams_[id]; + const vector &positions = positions_[id]; + size_t low = 0, high = positions.size() - 1; + + while (low < high) { + size_t mid = (low + high)/2; + strm->seekg(positions[mid]); + string key; + ReadType(*strm, &key); + if (key > find_key) { + high = mid; + } else if (key < find_key) { + low = mid + 1; + } else { + for (size_t i = mid; i > low; --i) { + strm->seekg(positions[i - 1]); + ReadType(*strm, &key); + if (key != find_key) { + strm->seekg(positions[i]); + return; + } + } + strm->seekg(positions[low]); + return; + } + } + strm->seekg(positions[low]); + } + + // Add all streams to the heap + void MakeHeap() { + heap_.clear(); + for (size_t i = 0; i < streams_.size(); ++i) { + ReadType(*streams_[i], &(keys_[i])); + if (!*streams_[i]) { + FSTERROR() << "STTableReader: error reading file: " << sources_[i]; + error_ = true; + return; + } + heap_.push_back(i); + } + make_heap(heap_.begin(), heap_.end(), *compare_); + PopHeap(); + } + + // Position the stream with the lowest key at the top + // of the heap, set 'current_' to the ID of that stream + // and read the current entry from that stream + void PopHeap() { + pop_heap(heap_.begin(), heap_.end(), *compare_); + current_ = heap_.back(); + if (entry_) + delete entry_; + entry_ = entry_reader_(*streams_[current_]); + if (!entry_) + error_ = true; + if (!*streams_[current_]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << keys_[current_] << ", file: " << sources_[current_]; + error_ = true; + } + } + + + EntryReader entry_reader_; // Read functor for 'EntryType' + vector streams_; // Input streams + vector sources_; // and corresponding file names + vector > positions_; // Index of positions for each stream + vector keys_; // Lowest unread key for each stream + vector heap_; // Heap containing ID of streams with unread keys + int64 current_; // Id of current stream to be read + Compare *compare_; // Functor comparing stream IDs for the heap + mutable EntryType *entry_; // Pointer to the currently read entry + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STTableReader); +}; + + +// String-to-type table header reading function template on the entry header +// type 'H' having a member function: +// Read(istream &strm, const string &filename); +// Checks that 'filename' is an STTable and call the H::Read() on the last +// entry in the STTable. +template +bool ReadSTTableHeader(const string &filename, H *header) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(strm, &magic_number); + ReadType(strm, &file_version); + if (magic_number != kSTTableMagicNumber) { + LOG(ERROR) << "ReadSTTableHeader: wrong file type: " << filename; + return false; + } + if (file_version != kSTTableFileVersion) { + LOG(ERROR) << "ReadSTTableHeader: wrong file version: " << filename; + return false; + } + int64 i = -1; + strm.seekg(-static_cast(sizeof(int64)), ios_base::end); + ReadType(strm, &i); // Read number of entries + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + if (i == 0) return true; // No entry header to read + strm.seekg(-2 * static_cast(sizeof(int64)), ios_base::end); + ReadType(strm, &i); // Read position for last entry in file + strm.seekg(i); + string key; + ReadType(strm, &key); + header->Read(strm, filename + ":" + key); + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + return true; +} + +bool OPENFSTDLL IsSTTable(const string &filename); //ChangedPD + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_STTABLE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h.bak new file mode 100755 index 00000000000..3ce0a4b6709 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/far/sttable.h.bak @@ -0,0 +1,371 @@ +// sttable.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// A generic string-to-type table file format +// +// This is not meant as a generalization of SSTable. This is more of +// a simple replacement for SSTable in order to provide an open-source +// implementation of the FAR format for the external version of the +// FST Library. + +#ifndef FST_EXTENSIONS_FAR_STTABLE_H_ +#define FST_EXTENSIONS_FAR_STTABLE_H_ + +#include +#include +#include +#include +#include + +namespace fst { + +static const int32 kSTTableMagicNumber = 2125656924; +static const int32 kSTTableFileVersion = 1; + +// String-to-type table writing class for object of type 'T' using functor 'W' +// to write an object of type 'T' from a stream. 'W' must conform to the +// following interface: +// +// struct Writer { +// void operator()(ostream &, const T &) const; +// }; +// +template +class STTableWriter { + public: + typedef T EntryType; + typedef W EntryWriter; + + explicit STTableWriter(const string &filename) + : stream_(filename.c_str(), ofstream::out | ofstream::binary), + error_(false) { + WriteType(stream_, kSTTableMagicNumber); + WriteType(stream_, kSTTableFileVersion); + if (!stream_) { + FSTERROR() << "STTableWriter::STTableWriter: error writing to file: " + << filename; + error_=true; + } + } + + static STTableWriter *Create(const string &filename) { + if (filename.empty()) { + LOG(ERROR) << "STTableWriter: writing to standard out unsupported."; + return 0; + } + return new STTableWriter(filename); + } + + void Add(const string &key, const T &t) { + if (key == "") { + FSTERROR() << "STTableWriter::Add: key empty: " << key; + error_ = true; + } else if (key < last_key_) { + FSTERROR() << "STTableWriter::Add: key disorder: " << key; + error_ = true; + } + if (error_) return; + last_key_ = key; + positions_.push_back(stream_.tellp()); + WriteType(stream_, key); + entry_writer_(stream_, t); + } + + bool Error() const { return error_; } + + ~STTableWriter() { + WriteType(stream_, positions_); + WriteType(stream_, static_cast(positions_.size())); + } + + private: + EntryWriter entry_writer_; // Write functor for 'EntryType' + ofstream stream_; // Output stream + vector positions_; // Position in file of each key-entry pair + string last_key_; // Last key + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STTableWriter); +}; + + +// String-to-type table reading class for object of type 'T' using functor 'R' +// to read an object of type 'T' form a stream. 'R' must conform to the +// following interface: +// +// struct Reader { +// T *operator()(istream &) const; +// }; +// +template +class STTableReader { + public: + typedef T EntryType; + typedef R EntryReader; + + explicit STTableReader(const vector &filenames) + : sources_(filenames), entry_(0), error_(false) { + compare_ = new Compare(&keys_); + keys_.resize(filenames.size()); + streams_.resize(filenames.size(), 0); + positions_.resize(filenames.size()); + for (size_t i = 0; i < filenames.size(); ++i) { + streams_[i] = new ifstream( + filenames[i].c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(*streams_[i], &magic_number); + ReadType(*streams_[i], &file_version); + if (magic_number != kSTTableMagicNumber) { + FSTERROR() << "STTableReader::STTableReader: wrong file type: " + << filenames[i]; + error_ = true; + return; + } + if (file_version != kSTTableFileVersion) { + FSTERROR() << "STTableReader::STTableReader: wrong file version: " + << filenames[i]; + error_ = true; + return; + } + int64 num_entries; + streams_[i]->seekg(-static_cast(sizeof(int64)), ios_base::end); + ReadType(*streams_[i], &num_entries); + streams_[i]->seekg(-static_cast(sizeof(int64)) * + (num_entries + 1), ios_base::end); + positions_[i].resize(num_entries); + for (size_t j = 0; (j < num_entries) && (*streams_[i]); ++j) + ReadType(*streams_[i], &(positions_[i][j])); + streams_[i]->seekg(positions_[i][0]); + if (!*streams_[i]) { + FSTERROR() << "STTableReader::STTableReader: error reading file: " + << filenames[i]; + error_ = true; + return; + } + + } + MakeHeap(); + } + + ~STTableReader() { + for (size_t i = 0; i < streams_.size(); ++i) + delete streams_[i]; + delete compare_; + if (entry_) + delete entry_; + } + + static STTableReader *Open(const string &filename) { + if (filename.empty()) { + LOG(ERROR) << "STTableReader: reading from standard in not supported"; + return 0; + } + vector filenames; + filenames.push_back(filename); + return new STTableReader(filenames); + } + + static STTableReader *Open(const vector &filenames) { + return new STTableReader(filenames); + } + + void Reset() { + if (error_) return; + for (size_t i = 0; i < streams_.size(); ++i) + streams_[i]->seekg(positions_[i].front()); + MakeHeap(); + } + + bool Find(const string &key) { + if (error_) return false; + for (size_t i = 0; i < streams_.size(); ++i) + LowerBound(i, key); + MakeHeap(); + return keys_[current_] == key; + } + + bool Done() const { return error_ || heap_.empty(); } + + void Next() { + if (error_) return; + if (streams_[current_]->tellg() <= positions_[current_].back()) { + ReadType(*(streams_[current_]), &(keys_[current_])); + if (!*streams_[current_]) { + FSTERROR() << "STTableReader: error reading file: " + << sources_[current_]; + error_ = true; + return; + } + push_heap(heap_.begin(), heap_.end(), *compare_); + } else { + heap_.pop_back(); + } + if (!heap_.empty()) + PopHeap(); + } + + const string &GetKey() const { + return keys_[current_]; + } + + const EntryType &GetEntry() const { + return *entry_; + } + + bool Error() const { return error_; } + + private: + // Comparison functor used to compare stream IDs in the heap + struct Compare { + Compare(const vector *keys) : keys_(keys) {} + + bool operator()(size_t i, size_t j) const { + return (*keys_)[i] > (*keys_)[j]; + }; + + private: + const vector *keys_; + }; + + // Position the stream with ID 'id' at the position corresponding + // to the lower bound for key 'find_key' + void LowerBound(size_t id, const string &find_key) { + ifstream *strm = streams_[id]; + const vector &positions = positions_[id]; + size_t low = 0, high = positions.size() - 1; + + while (low < high) { + size_t mid = (low + high)/2; + strm->seekg(positions[mid]); + string key; + ReadType(*strm, &key); + if (key > find_key) { + high = mid; + } else if (key < find_key) { + low = mid + 1; + } else { + for (size_t i = mid; i > low; --i) { + strm->seekg(positions[i - 1]); + ReadType(*strm, &key); + if (key != find_key) { + strm->seekg(positions[i]); + return; + } + } + strm->seekg(positions[low]); + return; + } + } + strm->seekg(positions[low]); + } + + // Add all streams to the heap + void MakeHeap() { + heap_.clear(); + for (size_t i = 0; i < streams_.size(); ++i) { + ReadType(*streams_[i], &(keys_[i])); + if (!*streams_[i]) { + FSTERROR() << "STTableReader: error reading file: " << sources_[i]; + error_ = true; + return; + } + heap_.push_back(i); + } + make_heap(heap_.begin(), heap_.end(), *compare_); + PopHeap(); + } + + // Position the stream with the lowest key at the top + // of the heap, set 'current_' to the ID of that stream + // and read the current entry from that stream + void PopHeap() { + pop_heap(heap_.begin(), heap_.end(), *compare_); + current_ = heap_.back(); + if (entry_) + delete entry_; + entry_ = entry_reader_(*streams_[current_]); + if (!entry_) + error_ = true; + if (!*streams_[current_]) { + FSTERROR() << "STTableReader: error reading entry for key: " + << keys_[current_] << ", file: " << sources_[current_]; + error_ = true; + } + } + + + EntryReader entry_reader_; // Read functor for 'EntryType' + vector streams_; // Input streams + vector sources_; // and corresponding file names + vector > positions_; // Index of positions for each stream + vector keys_; // Lowest unread key for each stream + vector heap_; // Heap containing ID of streams with unread keys + int64 current_; // Id of current stream to be read + Compare *compare_; // Functor comparing stream IDs for the heap + mutable EntryType *entry_; // Pointer to the currently read entry + bool error_; + + DISALLOW_COPY_AND_ASSIGN(STTableReader); +}; + + +// String-to-type table header reading function template on the entry header +// type 'H' having a member function: +// Read(istream &strm, const string &filename); +// Checks that 'filename' is an STTable and call the H::Read() on the last +// entry in the STTable. +template +bool ReadSTTableHeader(const string &filename, H *header) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + int32 magic_number = 0, file_version = 0; + ReadType(strm, &magic_number); + ReadType(strm, &file_version); + if (magic_number != kSTTableMagicNumber) { + LOG(ERROR) << "ReadSTTableHeader: wrong file type: " << filename; + return false; + } + if (file_version != kSTTableFileVersion) { + LOG(ERROR) << "ReadSTTableHeader: wrong file version: " << filename; + return false; + } + int64 i = -1; + strm.seekg(-static_cast(sizeof(int64)), ios_base::end); + ReadType(strm, &i); // Read number of entries + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + if (i == 0) return true; // No entry header to read + strm.seekg(-2 * static_cast(sizeof(int64)), ios_base::end); + ReadType(strm, &i); // Read position for last entry in file + strm.seekg(i); + string key; + ReadType(strm, &key); + header->Read(strm, filename + ":" + key); + if (!strm) { + LOG(ERROR) << "ReadSTTableHeader: error reading file: " << filename; + return false; + } + return true; +} + +bool IsSTTable(const string &filename); + +} // namespace fst + +#endif // FST_EXTENSIONS_FAR_STTABLE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/collection.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/collection.h new file mode 100755 index 00000000000..26be50481c2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/collection.h @@ -0,0 +1,122 @@ +// collection.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to store a collection of sets with elements of type T. + +#ifndef FST_EXTENSIONS_PDT_COLLECTION_H__ +#define FST_EXTENSIONS_PDT_COLLECTION_H__ + +#include +#include +using std::vector; + +#include + +namespace fst { + +// Stores a collection of non-empty sets with elements of type T. A +// default constructor, equality ==, a total order <, and an STL-style +// hash class must be defined on the elements. Provides signed +// integer ID (of type I) of each unique set. The IDs are allocated +// starting from 0 in order. +template +class Collection { + public: + struct Node { // Trie node + I node_id; // Root is kNoNodeId; + T element; + + Node() : node_id(kNoNodeId), element(T()) {} + Node(I i, const T &t) : node_id(i), element(t) {} + + bool operator==(const Node& n) const { + return n.node_id == node_id && n.element == element; + } + }; + + struct NodeHash { + size_t operator()(const Node &n) const { + return n.node_id + hash_(n.element) * kPrime; + } + }; + + typedef CompactHashBiTable NodeTable; + + class SetIterator { + public: + SetIterator(I id, Node node, NodeTable *node_table) + :id_(id), node_(node), node_table_(node_table) {} + + bool Done() const { return id_ == kNoNodeId; } + + const T &Element() const { return node_.element; } + + void Next() { + id_ = node_.node_id; + if (id_ != kNoNodeId) + node_ = node_table_->FindEntry(id_); + } + + private: + I id_; // Iterator set node id + Node node_; // Iterator set node + NodeTable *node_table_; + }; + + Collection() {} + + // Lookups integer ID from set. If it doesn't exist, then adds it. + // Set elements should be in strict order (and therefore unique). + I FindId(const vector &set) { + I node_id = kNoNodeId; + for (ssize_t i = set.size() - 1; i >= 0; --i) { + Node node(node_id, set[i]); + node_id = node_table_.FindId(node); + } + return node_id; + } + + // Finds set given integer ID. Returns true if ID corresponds + // to set. Use iterators below to traverse result. + SetIterator FindSet(I id) { + if (id < 0 && id >= node_table_.Size()) { + return SetIterator(kNoNodeId, Node(kNoNodeId, T()), &node_table_); + } else { + return SetIterator(id, node_table_.FindEntry(id), &node_table_); + } + } + + private: + static const I kNoNodeId; + static const size_t kPrime; + static std::tr1::hash hash_; + + NodeTable node_table_; + + DISALLOW_COPY_AND_ASSIGN(Collection); +}; + +template const I Collection::kNoNodeId = -1; + +template const size_t Collection::kPrime = 7853; + +template std::tr1::hash Collection::hash_; + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_COLLECTION_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/compose.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/compose.h new file mode 100755 index 00000000000..364d76fcbb2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/compose.h @@ -0,0 +1,146 @@ +// compose.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Compose a PDT and an FST. + +#ifndef FST_EXTENSIONS_PDT_COMPOSE_H__ +#define FST_EXTENSIONS_PDT_COMPOSE_H__ + +#include + +namespace fst { + +// Class to setup composition options for PDT composition. +// Default is for the PDT as the first composition argument. +template +class PdtComposeOptions : public +ComposeFstOptions > >, + MultiEpsFilter > > > > > { + public: + typedef typename Arc::Label Label; + typedef MultiEpsMatcher< Matcher > > PdtMatcher; + typedef MultiEpsFilter > PdtFilter; + typedef ComposeFstOptions COptions; + using COptions::matcher1; + using COptions::matcher2; + using COptions::filter; + + PdtComposeOptions(const Fst &ifst1, + const vector > &parens, + const Fst &ifst2) { + matcher1 = new PdtMatcher(ifst1, MATCH_OUTPUT, kMultiEpsList); + matcher2 = new PdtMatcher(ifst2, MATCH_INPUT, kMultiEpsLoop); + + // Treat parens as multi-epsilons when composing. + for (size_t i = 0; i < parens.size(); ++i) { + matcher1->AddMultiEpsLabel(parens[i].first); + matcher1->AddMultiEpsLabel(parens[i].second); + matcher2->AddMultiEpsLabel(parens[i].first); + matcher2->AddMultiEpsLabel(parens[i].second); + } + + filter = new PdtFilter(ifst1, ifst2, matcher1, matcher2, true); + } +}; + +// Class to setup composition options for PDT with FST composition. +// Specialization is for the FST as the first composition argument. +template +class PdtComposeOptions : public +ComposeFstOptions > >, + MultiEpsFilter > > > > > { + public: + typedef typename Arc::Label Label; + typedef MultiEpsMatcher< Matcher > > PdtMatcher; + typedef MultiEpsFilter > PdtFilter; + typedef ComposeFstOptions COptions; + using COptions::matcher1; + using COptions::matcher2; + using COptions::filter; + + PdtComposeOptions(const Fst &ifst1, + const Fst &ifst2, + const vector > &parens) { + matcher1 = new PdtMatcher(ifst1, MATCH_OUTPUT, kMultiEpsLoop); + matcher2 = new PdtMatcher(ifst2, MATCH_INPUT, kMultiEpsList); + + // Treat parens as multi-epsilons when composing. + for (size_t i = 0; i < parens.size(); ++i) { + matcher1->AddMultiEpsLabel(parens[i].first); + matcher1->AddMultiEpsLabel(parens[i].second); + matcher2->AddMultiEpsLabel(parens[i].first); + matcher2->AddMultiEpsLabel(parens[i].second); + } + + filter = new PdtFilter(ifst1, ifst2, matcher1, matcher2, true); + } +}; + + +// Composes pushdown transducer (PDT) encoded as an FST (1st arg) and +// an FST (2nd arg) with the result also a PDT encoded as an Fst. (3rd arg). +// In the PDTs, some transitions are labeled with open or close +// parentheses. To be interpreted as a PDT, the parens must balance on +// a path (see PdtExpand()). The open-close parenthesis label pairs +// are passed in 'parens'. +template +void Compose(const Fst &ifst1, + const vector > &parens, + const Fst &ifst2, + MutableFst *ofst, + const ComposeOptions &opts = ComposeOptions()) { + + PdtComposeOptions copts(ifst1, parens, ifst2); + copts.gc_limit = 0; + *ofst = ComposeFst(ifst1, ifst2, copts); + if (opts.connect) + Connect(ofst); +} + + +// Composes an FST (1st arg) and pushdown transducer (PDT) encoded as +// an FST (2nd arg) with the result also a PDT encoded as an Fst (3rd arg). +// In the PDTs, some transitions are labeled with open or close +// parentheses. To be interpreted as a PDT, the parens must balance on +// a path (see ExpandFst()). The open-close parenthesis label pairs +// are passed in 'parens'. +template +void Compose(const Fst &ifst1, + const Fst &ifst2, + const vector > &parens, + MutableFst *ofst, + const ComposeOptions &opts = ComposeOptions()) { + + PdtComposeOptions copts(ifst1, ifst2, parens); + copts.gc_limit = 0; + *ofst = ComposeFst(ifst1, ifst2, copts); + if (opts.connect) + Connect(ofst); +} + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_COMPOSE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/expand.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/expand.h new file mode 100755 index 00000000000..f464403e78b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/expand.h @@ -0,0 +1,975 @@ +// expand.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Expand a PDT to an FST. + +#ifndef FST_EXTENSIONS_PDT_EXPAND_H__ +#define FST_EXTENSIONS_PDT_EXPAND_H__ + +#include +using std::vector; + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace fst { + +template +struct ExpandFstOptions : public CacheOptions { + bool keep_parentheses; + PdtStack *stack; + PdtStateTable *state_table; + + ExpandFstOptions( + const CacheOptions &opts = CacheOptions(), + bool kp = false, + PdtStack *s = 0, + PdtStateTable *st = 0) + : CacheOptions(opts), keep_parentheses(kp), stack(s), state_table(st) {} +}; + +// Properties for an expanded PDT. +inline uint64 ExpandProperties(uint64 inprops) { + return inprops & (kAcceptor | kAcyclic | kInitialAcyclic | kUnweighted); +} + + +// Implementation class for ExpandFst +template +class ExpandFstImpl + : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef StateId StackId; + typedef PdtStateTuple StateTuple; + + ExpandFstImpl(const Fst &fst, + const vector > &parens, + const ExpandFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()), + stack_(opts.stack ? opts.stack: new PdtStack(parens)), + state_table_(opts.state_table ? opts.state_table : + new PdtStateTable()), + own_stack_(opts.stack == 0), own_state_table_(opts.state_table == 0), + keep_parentheses_(opts.keep_parentheses) { + SetType("expand"); + + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(ExpandProperties(props), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + ExpandFstImpl(const ExpandFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + stack_(new PdtStack(*impl.stack_)), + state_table_(new PdtStateTable()), + own_stack_(true), own_state_table_(true), + keep_parentheses_(impl.keep_parentheses_) { + SetType("expand"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~ExpandFstImpl() { + delete fst_; + if (own_stack_) + delete stack_; + if (own_state_table_) + delete state_table_; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + StateTuple tuple(s, 0); + StateId start = state_table_->FindState(tuple); + SetStart(start); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + const StateTuple &tuple = state_table_->Tuple(s); + Weight w = fst_->Final(tuple.state_id); + if (w != Weight::Zero() && tuple.stack_id == 0) + SetFinal(s, w); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) { + ExpandState(s); + } + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + ExpandState(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + ExpandState(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + ExpandState(s); + CacheImpl::InitArcIterator(s, data); + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void ExpandState(StateId s) { + StateTuple tuple = state_table_->Tuple(s); + for (ArcIterator< Fst > aiter(*fst_, tuple.state_id); + !aiter.Done(); aiter.Next()) { + Arc arc = aiter.Value(); + StackId stack_id = stack_->Find(tuple.stack_id, arc.ilabel); + if (stack_id == -1) { + // Non-matching close parenthesis + continue; + } else if ((stack_id != tuple.stack_id) && !keep_parentheses_) { + // Stack push/pop + arc.ilabel = arc.olabel = 0; + } + + StateTuple ntuple(arc.nextstate, stack_id); + arc.nextstate = state_table_->FindState(ntuple); + PushArc(s, arc); + } + SetArcs(s); + } + + const PdtStack &GetStack() const { return *stack_; } + + const PdtStateTable &GetStateTable() const { + return *state_table_; + } + + private: + const Fst *fst_; + + PdtStack *stack_; + PdtStateTable *state_table_; + bool own_stack_; + bool own_state_table_; + bool keep_parentheses_; + + void operator=(const ExpandFstImpl &); // disallow +}; + +// Expands a pushdown transducer (PDT) encoded as an FST into an FST. +// This version is a delayed Fst. In the PDT, some transitions are +// labeled with open or close parentheses. To be interpreted as a PDT, +// the parens must balance on a path. The open-close parenthesis label +// pairs are passed in 'parens'. The expansion enforces the +// parenthesis constraints. The PDT must be expandable as an FST. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class ExpandFst : public ImplToFst< ExpandFstImpl > { + public: + friend class ArcIterator< ExpandFst >; + friend class StateIterator< ExpandFst >; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef StateId StackId; + typedef CacheState State; + typedef ExpandFstImpl Impl; + + ExpandFst(const Fst &fst, + const vector > &parens) + : ImplToFst(new Impl(fst, parens, ExpandFstOptions())) {} + + ExpandFst(const Fst &fst, + const vector > &parens, + const ExpandFstOptions &opts) + : ImplToFst(new Impl(fst, parens, opts)) {} + + // See Fst<>::Copy() for doc. + ExpandFst(const ExpandFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ExpandFst. See Fst<>::Copy() for further doc. + virtual ExpandFst *Copy(bool safe = false) const { + return new ExpandFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + const PdtStack &GetStack() const { + return GetImpl()->GetStack(); + } + + const PdtStateTable &GetStateTable() const { + return GetImpl()->GetStateTable(); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ExpandFst &fst); // Disallow +}; + + +// Specialization for ExpandFst. +template +class StateIterator< ExpandFst > + : public CacheStateIterator< ExpandFst > { + public: + explicit StateIterator(const ExpandFst &fst) + : CacheStateIterator< ExpandFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for ExpandFst. +template +class ArcIterator< ExpandFst > + : public CacheArcIterator< ExpandFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const ExpandFst &fst, StateId s) + : CacheArcIterator< ExpandFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->ExpandState(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void ExpandFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< ExpandFst >(*this); +} + +// +// PrunedExpand Class +// + +// Prunes the delayed expansion of a pushdown transducer (PDT) encoded +// as an FST into an FST. In the PDT, some transitions are labeled +// with open or close parentheses. To be interpreted as a PDT, the +// parens must balance on a path. The open-close parenthesis label +// pairs are passed in 'parens'. The expansion enforces the +// parenthesis constraints. +// +// The algorithm works by visiting the delayed ExpandFst using a +// shortest-stack first queue discipline and relies on the +// shortest-distance information computed using a reverse +// shortest-path call to perform the pruning. +// +// The algorithm maintains the same state ordering between the ExpandFst +// being visited 'efst_' and the result of pruning written into the +// MutableFst 'ofst_' to improve readability of the code. +// +template +class PrunedExpand { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef StateId StackId; + typedef PdtStack Stack; + typedef PdtStateTable StateTable; + typedef typename PdtBalanceData::SetIterator SetIterator; + + // Constructor taking as input a PDT specified by 'ifst' and 'parens'. + // 'keep_parentheses' specifies whether parentheses are replaced by + // epsilons or not during the expansion. 'opts' is the cache options + // used to instantiate the underlying ExpandFst. + PrunedExpand(const Fst &ifst, + const vector > &parens, + bool keep_parentheses = false, + const CacheOptions &opts = CacheOptions()) + : ifst_(ifst.Copy()), + keep_parentheses_(keep_parentheses), + stack_(parens), + efst_(ifst, parens, + ExpandFstOptions(opts, true, &stack_, &state_table_)), + queue_(state_table_, stack_, stack_length_, distance_, fdistance_) { + Reverse(*ifst_, parens, &rfst_); + VectorFst path; + reverse_shortest_path_ = new SP( + rfst_, parens, + PdtShortestPathOptions >(true, false)); + reverse_shortest_path_->ShortestPath(&path); + balance_data_ = reverse_shortest_path_->GetBalanceData()->Reverse( + rfst_.NumStates(), 10, -1); + + InitCloseParenMultimap(parens); + } + + ~PrunedExpand() { + delete ifst_; + delete reverse_shortest_path_; + delete balance_data_; + } + + // Expands and prunes with weight threshold 'threshold' the input PDT. + // Writes the result in 'ofst'. + void Expand(MutableFst *ofst, const Weight &threshold); + + private: + static const uint8 kEnqueued; + static const uint8 kExpanded; + static const uint8 kSourceState; + + // Comparison functor used by the queue: + // 1. states corresponding to shortest stack first, + // 2. among stacks of the same length, reverse lexicographic order is used, + // 3. among states with the same stack, shortest-first order is used. + class StackCompare { + public: + StackCompare(const StateTable &st, + const Stack &s, const vector &sl, + const vector &d, const vector &fd) + : state_table_(st), stack_(s), stack_length_(sl), + distance_(d), fdistance_(fd) {} + + bool operator()(StateId s1, StateId s2) const { + StackId si1 = state_table_.Tuple(s1).stack_id; + StackId si2 = state_table_.Tuple(s2).stack_id; + if (stack_length_[si1] < stack_length_[si2]) + return true; + if (stack_length_[si1] > stack_length_[si2]) + return false; + // If stack id equal, use A* + if (si1 == si2) { + Weight w1 = (s1 < distance_.size()) && (s1 < fdistance_.size()) ? + Times(distance_[s1], fdistance_[s1]) : Weight::Zero(); + Weight w2 = (s2 < distance_.size()) && (s2 < fdistance_.size()) ? + Times(distance_[s2], fdistance_[s2]) : Weight::Zero(); + return less_(w1, w2); + } + // If lenghts are equal, use reverse lexico. + for (; si1 != si2; si1 = stack_.Pop(si1), si2 = stack_.Pop(si2)) { + if (stack_.Top(si1) < stack_.Top(si2)) return true; + if (stack_.Top(si1) > stack_.Top(si2)) return false; + } + return false; + } + + private: + const StateTable &state_table_; + const Stack &stack_; + const vector &stack_length_; + const vector &distance_; + const vector &fdistance_; + NaturalLess less_; + }; + + class ShortestStackFirstQueue + : public ShortestFirstQueue { + public: + ShortestStackFirstQueue( + const PdtStateTable &st, + const Stack &s, + const vector &sl, + const vector &d, const vector &fd) + : ShortestFirstQueue( + StackCompare(st, s, sl, d, fd)) {} + }; + + + void InitCloseParenMultimap(const vector > &parens); + Weight DistanceToDest(StateId state, StateId source) const; + uint8 Flags(StateId s) const; + void SetFlags(StateId s, uint8 flags, uint8 mask); + Weight Distance(StateId s) const; + void SetDistance(StateId s, Weight w); + Weight FinalDistance(StateId s) const; + void SetFinalDistance(StateId s, Weight w); + StateId SourceState(StateId s) const; + void SetSourceState(StateId s, StateId p); + void AddStateAndEnqueue(StateId s); + void Relax(StateId s, const A &arc, Weight w); + bool PruneArc(StateId s, const A &arc); + void ProcStart(); + void ProcFinal(StateId s); + bool ProcNonParen(StateId s, const A &arc, bool add_arc); + bool ProcOpenParen(StateId s, const A &arc, StackId si, StackId nsi); + bool ProcCloseParen(StateId s, const A &arc); + void ProcDestStates(StateId s, StackId si); + + Fst *ifst_; // Input PDT + VectorFst rfst_; // Reversed PDT + bool keep_parentheses_; // Keep parentheses in ofst? + StateTable state_table_; // State table for efst_ + Stack stack_; // Stack trie + ExpandFst efst_; // Expanded PDT + vector stack_length_; // Length of stack for given stack id + vector distance_; // Distance from initial state in efst_/ofst + vector fdistance_; // Distance to final states in efst_/ofst + ShortestStackFirstQueue queue_; // Queue used to visit efst_ + vector flags_; // Status flags for states in efst_/ofst + vector sources_; // PDT source state for each expanded state + + typedef PdtShortestPath > SP; + typedef typename SP::CloseParenMultimap ParenMultimap; + SP *reverse_shortest_path_; // Shortest path for rfst_ + PdtBalanceData *balance_data_; // Not owned by shortest_path_ + ParenMultimap close_paren_multimap_; // Maps open paren arcs to + // balancing close paren arcs. + + MutableFst *ofst_; // Output fst + Weight limit_; // Weight limit + + typedef unordered_map DestMap; + DestMap dest_map_; + StackId current_stack_id_; + // 'current_stack_id_' is the stack id of the states currently at the top + // of queue, i.e., the states currently being popped and processed. + // 'dest_map_' maps a state 's' in 'ifst_' that is the source + // of a close parentheses matching the top of 'current_stack_id_; to + // the shortest-distance from '(s, current_stack_id_)' to the final + // states in 'efst_'. + ssize_t current_paren_id_; // Paren id at top of current stack + ssize_t cached_stack_id_; + StateId cached_source_; + slist > cached_dest_list_; + // 'cached_dest_list_' contains the set of pair of destination + // states and weight to final states for source state + // 'cached_source_' and paren id 'cached_paren_id': the set of + // source state of a close parenthesis with paren id + // 'cached_paren_id' balancing an incoming open parenthesis with + // paren id 'cached_paren_id' in state 'cached_source_'. + + NaturalLess less_; +}; + +template const uint8 PrunedExpand::kEnqueued = 0x01; +template const uint8 PrunedExpand::kExpanded = 0x02; +template const uint8 PrunedExpand::kSourceState = 0x04; + + +// Initializes close paren multimap, mapping pairs (s,paren_id) to +// all the arcs out of s labeled with close parenthese for paren_id. +template +void PrunedExpand::InitCloseParenMultimap( + const vector > &parens) { + unordered_map paren_id_map; + for (Label i = 0; i < parens.size(); ++i) { + const pair &p = parens[i]; + paren_id_map[p.first] = i; + paren_id_map[p.second] = i; + } + + for (StateIterator > siter(*ifst_); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + for (ArcIterator > aiter(*ifst_, s); + !aiter.Done(); aiter.Next()) { + const Arc &arc = aiter.Value(); + typename unordered_map::const_iterator pit + = paren_id_map.find(arc.ilabel); + if (pit == paren_id_map.end()) continue; + if (arc.ilabel == parens[pit->second].second) { // Close paren + ParenState paren_state(pit->second, s); + close_paren_multimap_.insert(make_pair(paren_state, arc)); + } + } + } +} + + +// Returns the weight of the shortest balanced path from 'source' to 'dest' +// in 'ifst_', 'dest' must be the source state of a close paren arc. +template +typename A::Weight PrunedExpand::DistanceToDest(StateId source, + StateId dest) const { + typename SP::SearchState s(source + 1, dest + 1); + VLOG(2) << "D(" << source << ", " << dest << ") =" + << reverse_shortest_path_->GetShortestPathData().Distance(s); + return reverse_shortest_path_->GetShortestPathData().Distance(s); +} + +// Returns the flags for state 's' in 'ofst_'. +template +uint8 PrunedExpand::Flags(StateId s) const { + return s < flags_.size() ? flags_[s] : 0; +} + +// Modifies the flags for state 's' in 'ofst_'. +template +void PrunedExpand::SetFlags(StateId s, uint8 flags, uint8 mask) { + while (flags_.size() <= s) flags_.push_back(0); + flags_[s] &= ~mask; + flags_[s] |= flags & mask; +} + + +// Returns the shortest distance from the initial state to 's' in 'ofst_'. +template +typename A::Weight PrunedExpand::Distance(StateId s) const { + return s < distance_.size() ? distance_[s] : Weight::Zero(); +} + +// Sets the shortest distance from the initial state to 's' in 'ofst_' to 'w'. +template +void PrunedExpand::SetDistance(StateId s, Weight w) { + while (distance_.size() <= s ) distance_.push_back(Weight::Zero()); + distance_[s] = w; +} + + +// Returns the shortest distance from 's' to the final states in 'ofst_'. +template +typename A::Weight PrunedExpand::FinalDistance(StateId s) const { + return s < fdistance_.size() ? fdistance_[s] : Weight::Zero(); +} + +// Sets the shortest distance from 's' to the final states in 'ofst_' to 'w'. +template +void PrunedExpand::SetFinalDistance(StateId s, Weight w) { + while (fdistance_.size() <= s) fdistance_.push_back(Weight::Zero()); + fdistance_[s] = w; +} + +// Returns the PDT "source" state of state 's' in 'ofst_'. +template +typename A::StateId PrunedExpand::SourceState(StateId s) const { + return s < sources_.size() ? sources_[s] : kNoStateId; +} + +// Sets the PDT "source" state of state 's' in 'ofst_' to state 'p' in 'ifst_'. +template +void PrunedExpand::SetSourceState(StateId s, StateId p) { + while (sources_.size() <= s) sources_.push_back(kNoStateId); + sources_[s] = p; +} + +// Adds state 's' of 'efst_' to 'ofst_' and inserts it in the queue, +// modifying the flags for 's' accordingly. +template +void PrunedExpand::AddStateAndEnqueue(StateId s) { + if (!(Flags(s) & (kEnqueued | kExpanded))) { + while (ofst_->NumStates() <= s) ofst_->AddState(); + queue_.Enqueue(s); + SetFlags(s, kEnqueued, kEnqueued); + } else if (Flags(s) & kEnqueued) { + queue_.Update(s); + } + // TODO(allauzen): Check everything is fine when kExpanded? +} + +// Relaxes arc 'arc' out of state 's' in 'ofst_': +// * if the distance to 's' times the weight of 'arc' is smaller than +// the currently stored distance for 'arc.nextstate', +// updates 'Distance(arc.nextstate)' with new estimate; +// * if 'fd' is less than the currently stored distance from 'arc.nextstate' +// to the final state, updates with new estimate. +template +void PrunedExpand::Relax(StateId s, const A &arc, Weight fd) { + Weight nd = Times(Distance(s), arc.weight); + if (less_(nd, Distance(arc.nextstate))) { + SetDistance(arc.nextstate, nd); + SetSourceState(arc.nextstate, SourceState(s)); + } + if (less_(fd, FinalDistance(arc.nextstate))) + SetFinalDistance(arc.nextstate, fd); + VLOG(2) << "Relax: " << s << ", d[s] = " << Distance(s) << ", to " + << arc.nextstate << ", d[ns] = " << Distance(arc.nextstate) + << ", nd = " << nd; +} + +// Returns 'true' if the arc 'arc' out of state 's' in 'efst_' needs to +// be pruned. +template +bool PrunedExpand::PruneArc(StateId s, const A &arc) { + VLOG(2) << "Prune ?"; + Weight fd = Weight::Zero(); + + if ((cached_source_ != SourceState(s)) || + (cached_stack_id_ != current_stack_id_)) { + cached_source_ = SourceState(s); + cached_stack_id_ = current_stack_id_; + cached_dest_list_.clear(); + if (cached_source_ != ifst_->Start()) { + for (SetIterator set_iter = + balance_data_->Find(current_paren_id_, cached_source_); + !set_iter.Done(); set_iter.Next()) { + StateId dest = set_iter.Element(); + typename DestMap::const_iterator iter = dest_map_.find(dest); + cached_dest_list_.push_front(*iter); + } + } else { + // TODO(allauzen): queue discipline should prevent this never + // from happening; replace by a check. + cached_dest_list_.push_front( + make_pair(rfst_.Start() -1, Weight::One())); + } + } + + for (typename slist >::const_iterator iter = + cached_dest_list_.begin(); + iter != cached_dest_list_.end(); + ++iter) { + fd = Plus(fd, + Times(DistanceToDest(state_table_.Tuple(arc.nextstate).state_id, + iter->first), + iter->second)); + } + Relax(s, arc, fd); + Weight w = Times(Distance(s), Times(arc.weight, fd)); + return less_(limit_, w); +} + +// Adds start state of 'efst_' to 'ofst_', enqueues it and initializes +// the distance data structures. +template +void PrunedExpand::ProcStart() { + StateId s = efst_.Start(); + AddStateAndEnqueue(s); + ofst_->SetStart(s); + SetSourceState(s, ifst_->Start()); + + current_stack_id_ = 0; + current_paren_id_ = -1; + stack_length_.push_back(0); + dest_map_[rfst_.Start() - 1] = Weight::One(); // not needed + + cached_source_ = ifst_->Start(); + cached_stack_id_ = 0; + cached_dest_list_.push_front( + make_pair(rfst_.Start() -1, Weight::One())); + + PdtStateTuple tuple(rfst_.Start() - 1, 0); + SetFinalDistance(state_table_.FindState(tuple), Weight::One()); + SetDistance(s, Weight::One()); + SetFinalDistance(s, DistanceToDest(ifst_->Start(), rfst_.Start() - 1)); + VLOG(2) << DistanceToDest(ifst_->Start(), rfst_.Start() - 1); +} + +// Makes 's' final in 'ofst_' if shortest accepting path ending in 's' +// is below threshold. +template +void PrunedExpand::ProcFinal(StateId s) { + Weight final = efst_.Final(s); + if ((final == Weight::Zero()) || less_(limit_, Times(Distance(s), final))) + return; + ofst_->SetFinal(s, final); +} + +// Returns true when arc (or meta-arc) 'arc' out of 's' in 'efst_' is +// below the threshold. When 'add_arc' is true, 'arc' is added to 'ofst_'. +template +bool PrunedExpand::ProcNonParen(StateId s, const A &arc, bool add_arc) { + VLOG(2) << "ProcNonParen: " << s << " to " << arc.nextstate + << ", " << arc.ilabel << ":" << arc.olabel << " / " << arc.weight + << ", add_arc = " << (add_arc ? "true" : "false"); + if (PruneArc(s, arc)) return false; + if(add_arc) ofst_->AddArc(s, arc); + AddStateAndEnqueue(arc.nextstate); + return true; +} + +// Processes an open paren arc 'arc' out of state 's' in 'ofst_'. +// When 'arc' is labeled with an open paren, +// 1. considers each (shortest) balanced path starting in 's' by +// taking 'arc' and ending by a close paren balancing the open +// paren of 'arc' as a meta-arc, processes and prunes each meta-arc +// as a non-paren arc, inserting its destination to the queue; +// 2. if at least one of these meta-arcs has not been pruned, +// adds the destination of 'arc' to 'ofst_' as a new source state +// for the stack id 'nsi' and inserts it in the queue. +template +bool PrunedExpand::ProcOpenParen(StateId s, const A &arc, StackId si, + StackId nsi) { + // Update the stack lenght when needed: |nsi| = |si| + 1. + while (stack_length_.size() <= nsi) stack_length_.push_back(-1); + if (stack_length_[nsi] == -1) + stack_length_[nsi] = stack_length_[si] + 1; + + StateId ns = arc.nextstate; + VLOG(2) << "Open paren: " << s << "(" << state_table_.Tuple(s).state_id + << ") to " << ns << "(" << state_table_.Tuple(ns).state_id << ")"; + bool proc_arc = false; + Weight fd = Weight::Zero(); + ssize_t paren_id = stack_.ParenId(arc.ilabel); + slist sources; + for (SetIterator set_iter = + balance_data_->Find(paren_id, state_table_.Tuple(ns).state_id); + !set_iter.Done(); set_iter.Next()) { + sources.push_front(set_iter.Element()); + } + for (typename slist::const_iterator sources_iter = sources.begin(); + sources_iter != sources.end(); + ++ sources_iter) { + StateId source = *sources_iter; + VLOG(2) << "Close paren source: " << source; + ParenState paren_state(paren_id, source); + for (typename ParenMultimap::const_iterator iter = + close_paren_multimap_.find(paren_state); + iter != close_paren_multimap_.end() && paren_state == iter->first; + ++iter) { + Arc meta_arc = iter->second; + PdtStateTuple tuple(meta_arc.nextstate, si); + meta_arc.nextstate = state_table_.FindState(tuple); + VLOG(2) << state_table_.Tuple(ns).state_id << ", " << source; + VLOG(2) << "Meta arc weight = " << arc.weight << " Times " + << DistanceToDest(state_table_.Tuple(ns).state_id, source) + << " Times " << meta_arc.weight; + meta_arc.weight = Times( + arc.weight, + Times(DistanceToDest(state_table_.Tuple(ns).state_id, source), + meta_arc.weight)); + proc_arc |= ProcNonParen(s, meta_arc, false); + fd = Plus(fd, Times( + Times( + DistanceToDest(state_table_.Tuple(ns).state_id, source), + iter->second.weight), + FinalDistance(meta_arc.nextstate))); + } + } + if (proc_arc) { + VLOG(2) << "Proc open paren " << s << " to " << arc.nextstate; + ofst_->AddArc( + s, keep_parentheses_ ? arc : Arc(0, 0, arc.weight, arc.nextstate)); + AddStateAndEnqueue(arc.nextstate); + Weight nd = Times(Distance(s), arc.weight); + if(less_(nd, Distance(arc.nextstate))) + SetDistance(arc.nextstate, nd); + // FinalDistance not necessary for source state since pruning + // decided using the meta-arcs above. But this is a problem with + // A*, hence: + if (less_(fd, FinalDistance(arc.nextstate))) + SetFinalDistance(arc.nextstate, fd); + SetFlags(arc.nextstate, kSourceState, kSourceState); + } + return proc_arc; +} + +// Checks that shortest path through close paren arc in 'efst_' is +// below threshold, if so adds it to 'ofst_'. +template +bool PrunedExpand::ProcCloseParen(StateId s, const A &arc) { + Weight w = Times(Distance(s), + Times(arc.weight, FinalDistance(arc.nextstate))); + if (less_(limit_, w)) + return false; + ofst_->AddArc( + s, keep_parentheses_ ? arc : Arc(0, 0, arc.weight, arc.nextstate)); + return true; +} + +// When 's' in 'ofst_' is a source state for stack id 'si', identifies +// all the corresponding possible destination states, that is, all the +// states in 'ifst_' that have an outgoing close paren arc balancing +// the incoming open paren taken to get to 's', and for each such +// state 't', computes the shortest distance from (t, si) to the final +// states in 'ofst_'. Stores this information in 'dest_map_'. +template +void PrunedExpand::ProcDestStates(StateId s, StackId si) { + if (!(Flags(s) & kSourceState)) return; + if (si != current_stack_id_) { + dest_map_.clear(); + current_stack_id_ = si; + current_paren_id_ = stack_.Top(current_stack_id_); + VLOG(2) << "StackID " << si << " dequeued for first time"; + } + // TODO(allauzen): clean up source state business; rename current function to + // ProcSourceState. + SetSourceState(s, state_table_.Tuple(s).state_id); + + ssize_t paren_id = stack_.Top(si); + for (SetIterator set_iter = + balance_data_->Find(paren_id, state_table_.Tuple(s).state_id); + !set_iter.Done(); set_iter.Next()) { + StateId dest_state = set_iter.Element(); + if (dest_map_.find(dest_state) != dest_map_.end()) + continue; + Weight dest_weight = Weight::Zero(); + ParenState paren_state(paren_id, dest_state); + for (typename ParenMultimap::const_iterator iter = + close_paren_multimap_.find(paren_state); + iter != close_paren_multimap_.end() && paren_state == iter->first; + ++iter) { + const Arc &arc = iter->second; + PdtStateTuple tuple(arc.nextstate, stack_.Pop(si)); + dest_weight = Plus(dest_weight, + Times(arc.weight, + FinalDistance(state_table_.FindState(tuple)))); + } + dest_map_[dest_state] = dest_weight; + VLOG(2) << "State " << dest_state << " is a dest state for stack id " + << si << " with weight " << dest_weight; + } +} + +// Expands and prunes with weight threshold 'threshold' the input PDT. +// Writes the result in 'ofst'. +template +void PrunedExpand::Expand( + MutableFst *ofst, const typename A::Weight &threshold) { + ofst_ = ofst; + ofst_->DeleteStates(); + ofst_->SetInputSymbols(ifst_->InputSymbols()); + ofst_->SetOutputSymbols(ifst_->OutputSymbols()); + + limit_ = Times(DistanceToDest(ifst_->Start(), rfst_.Start() - 1), threshold); + flags_.clear(); + + ProcStart(); + + while (!queue_.Empty()) { + StateId s = queue_.Head(); + queue_.Dequeue(); + SetFlags(s, kExpanded, kExpanded | kEnqueued); + VLOG(2) << s << " dequeued!"; + + ProcFinal(s); + StackId stack_id = state_table_.Tuple(s).stack_id; + ProcDestStates(s, stack_id); + + for (ArcIterator > aiter(efst_, s); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + StackId nextstack_id = state_table_.Tuple(arc.nextstate).stack_id; + if (stack_id == nextstack_id) + ProcNonParen(s, arc, true); + else if (stack_id == stack_.Pop(nextstack_id)) + ProcOpenParen(s, arc, stack_id, nextstack_id); + else + ProcCloseParen(s, arc); + } + VLOG(2) << "d[" << s << "] = " << Distance(s) + << ", fd[" << s << "] = " << FinalDistance(s); + } +} + +// +// Expand() Functions +// + +template +struct ExpandOptions { + bool connect; + bool keep_parentheses; + typename Arc::Weight weight_threshold; + + ExpandOptions(bool c = true, bool k = false, + typename Arc::Weight w = Arc::Weight::Zero()) + : connect(c), keep_parentheses(k), weight_threshold(w) {} +}; + +// Expands a pushdown transducer (PDT) encoded as an FST into an FST. +// This version writes the expanded PDT result to a MutableFst. +// In the PDT, some transitions are labeled with open or close +// parentheses. To be interpreted as a PDT, the parens must balance on +// a path. The open-close parenthesis label pairs are passed in +// 'parens'. The expansion enforces the parenthesis constraints. The +// PDT must be expandable as an FST. +template +void Expand( + const Fst &ifst, + const vector > &parens, + MutableFst *ofst, + const ExpandOptions &opts) { + typedef typename Arc::Label Label; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename ExpandFst::StackId StackId; + + ExpandFstOptions eopts; + eopts.gc_limit = 0; + if (opts.weight_threshold == Weight::Zero()) { + eopts.keep_parentheses = opts.keep_parentheses; + *ofst = ExpandFst(ifst, parens, eopts); + } else { + PrunedExpand pruned_expand(ifst, parens, opts.keep_parentheses); + pruned_expand.Expand(ofst, opts.weight_threshold); + } + + if (opts.connect) + Connect(ofst); +} + +// Expands a pushdown transducer (PDT) encoded as an FST into an FST. +// This version writes the expanded PDT result to a MutableFst. +// In the PDT, some transitions are labeled with open or close +// parentheses. To be interpreted as a PDT, the parens must balance on +// a path. The open-close parenthesis label pairs are passed in +// 'parens'. The expansion enforces the parenthesis constraints. The +// PDT must be expandable as an FST. +template +void Expand( + const Fst &ifst, + const vector > &parens, + MutableFst *ofst, + bool connect = true, bool keep_parentheses = false) { + Expand(ifst, parens, ofst, ExpandOptions(connect, keep_parentheses)); +} + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_EXPAND_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h new file mode 100755 index 00000000000..0b9a031ea79 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h @@ -0,0 +1,175 @@ +// info.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Prints information about a PDT. + +#ifndef FST_EXTENSIONS_PDT_INFO_H__ +#define FST_EXTENSIONS_PDT_INFO_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +using std::vector; + +#include +#include + +namespace fst { + +// Compute various information about PDTs, helper class for pdtinfo.cc. +template class PdtInfo { +public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + PdtInfo(const Fst &fst, + const vector > &parens); + + const string& FstType() const { return fst_type_; } + const string& ArcType() const { return A::Type(); } + + int64 NumStates() const { return nstates_; } + int64 NumArcs() const { return narcs_; } + int64 NumOpenParens() const { return nopen_parens_; } + int64 NumCloseParens() const { return nclose_parens_; } + int64 NumUniqueOpenParens() const { return nuniq_open_parens_; } + int64 NumUniqueCloseParens() const { return nuniq_close_parens_; } + int64 NumOpenParenStates() const { return nopen_paren_states_; } + int64 NumCloseParenStates() const { return nclose_paren_states_; } + + private: + string fst_type_; + int64 nstates_; + int64 narcs_; + int64 nopen_parens_; + int64 nclose_parens_; + int64 nuniq_open_parens_; + int64 nuniq_close_parens_; + int64 nopen_paren_states_; + int64 nclose_paren_states_; + + DISALLOW_COPY_AND_ASSIGN(PdtInfo); +}; + +template +PdtInfo::PdtInfo(const Fst &fst, + const vector > &parens) + : fst_type_(fst.Type()), + nstates_(0), + narcs_(0), + nopen_parens_(0), + nclose_parens_(0), + nuniq_open_parens_(0), + nuniq_close_parens_(0), + nopen_paren_states_(0), + nclose_paren_states_(0) { + unordered_map paren_map; + unordered_set > siter(fst); + !siter.Done(); + siter.Next()) { + ++nstates_; + StateId s = siter.Value(); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + ++narcs_; + typename unordered_map::const_iterator pit + = paren_map.find(arc.ilabel); + if (pit != paren_map.end()) { + Label open_paren = parens[pit->second].first; + Label close_paren = parens[pit->second].second; + if (arc.ilabel == open_paren) { + ++nopen_parens_; + if (!paren_set.count(open_paren)) { + ++nuniq_open_parens_; + paren_set.insert(open_paren); + } + if (!open_paren_state_set.count(arc.nextstate)) { + ++nopen_paren_states_; + open_paren_state_set.insert(arc.nextstate); + } + } else { + ++nclose_parens_; + if (!paren_set.count(close_paren)) { + ++nuniq_close_parens_; + paren_set.insert(close_paren); + } + if (!close_paren_state_set.count(s)) { + ++nclose_paren_states_; + close_paren_state_set.insert(s); + } + + } + } + } + } +} + + +template +void PrintPdtInfo(const PdtInfo &pdtinfo) { + ios_base::fmtflags old = cout.setf(ios::left); + cout.width(50); + cout << "fst type" << pdtinfo.FstType().c_str() << endl; + cout.width(50); + cout << "arc type" << pdtinfo.ArcType().c_str() << endl; + cout.width(50); + cout << "# of states" << pdtinfo.NumStates() << endl; + cout.width(50); + cout << "# of arcs" << pdtinfo.NumArcs() << endl; + cout.width(50); + cout << "# of open parentheses" << pdtinfo.NumOpenParens() << endl; + cout.width(50); + cout << "# of close parentheses" << pdtinfo.NumCloseParens() << endl; + cout.width(50); + cout << "# of unique open parentheses" + << pdtinfo.NumUniqueOpenParens() << endl; + cout.width(50); + cout << "# of unique close parentheses" + << pdtinfo.NumUniqueCloseParens() << endl; + cout.width(50); + cout << "# of open parenthesis dest. states" + << pdtinfo.NumOpenParenStates() << endl; + cout.width(50); + cout << "# of close parenthesis source states" + << pdtinfo.NumCloseParenStates() << endl; + cout.setf(old); +} + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_INFO_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h.bak new file mode 100755 index 00000000000..bcadcace390 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/info.h.bak @@ -0,0 +1,175 @@ +// info.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Prints information about a PDT. + +#ifndef FST_EXTENSIONS_PDT_INFO_H__ +#define FST_EXTENSIONS_PDT_INFO_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +using std::vector; + +#include +#include + +namespace fst { + +// Compute various information about PDTs, helper class for pdtinfo.cc. +template class PdtInfo { +public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + PdtInfo(const Fst &fst, + const vector > &parens); + + const string& FstType() const { return fst_type_; } + const string& ArcType() const { return A::Type(); } + + int64 NumStates() const { return nstates_; } + int64 NumArcs() const { return narcs_; } + int64 NumOpenParens() const { return nopen_parens_; } + int64 NumCloseParens() const { return nclose_parens_; } + int64 NumUniqueOpenParens() const { return nuniq_open_parens_; } + int64 NumUniqueCloseParens() const { return nuniq_close_parens_; } + int64 NumOpenParenStates() const { return nopen_paren_states_; } + int64 NumCloseParenStates() const { return nclose_paren_states_; } + + private: + string fst_type_; + int64 nstates_; + int64 narcs_; + int64 nopen_parens_; + int64 nclose_parens_; + int64 nuniq_open_parens_; + int64 nuniq_close_parens_; + int64 nopen_paren_states_; + int64 nclose_paren_states_; + + DISALLOW_COPY_AND_ASSIGN(PdtInfo); +}; + +template +PdtInfo::PdtInfo(const Fst &fst, + const vector > &parens) + : fst_type_(fst.Type()), + nstates_(0), + narcs_(0), + nopen_parens_(0), + nclose_parens_(0), + nuniq_open_parens_(0), + nuniq_close_parens_(0), + nopen_paren_states_(0), + nclose_paren_states_(0) { + unordered_map paren_map; + unordered_set > siter(fst); + !siter.Done(); + siter.Next()) { + ++nstates_; + StateId s = siter.Value(); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + ++narcs_; + typename unordered_map::const_iterator pit + = paren_map.find(arc.ilabel); + if (pit != paren_map.end()) { + Label open_paren = parens[pit->second].first; + Label close_paren = parens[pit->second].second; + if (arc.ilabel == open_paren) { + ++nopen_parens_; + if (!paren_set.count(open_paren)) { + ++nuniq_open_parens_; + paren_set.insert(open_paren); + } + if (!open_paren_state_set.count(arc.nextstate)) { + ++nopen_paren_states_; + open_paren_state_set.insert(arc.nextstate); + } + } else { + ++nclose_parens_; + if (!paren_set.count(close_paren)) { + ++nuniq_close_parens_; + paren_set.insert(close_paren); + } + if (!close_paren_state_set.count(s)) { + ++nclose_paren_states_; + close_paren_state_set.insert(s); + } + + } + } + } + } +} + + +template +void PrintPdtInfo(const PdtInfo &pdtinfo) { + ios_base::fmtflags old = cout.setf(ios::left); + cout.width(50); + cout << "fst type" << pdtinfo.FstType().c_str() << endl; + cout.width(50); + cout << "arc type" << pdtinfo.ArcType().c_str() << endl; + cout.width(50); + cout << "# of states" << pdtinfo.NumStates() << endl; + cout.width(50); + cout << "# of arcs" << pdtinfo.NumArcs() << endl; + cout.width(50); + cout << "# of open parentheses" << pdtinfo.NumOpenParens() << endl; + cout.width(50); + cout << "# of close parentheses" << pdtinfo.NumCloseParens() << endl; + cout.width(50); + cout << "# of unique open parentheses" + << pdtinfo.NumUniqueOpenParens() << endl; + cout.width(50); + cout << "# of unique close parentheses" + << pdtinfo.NumUniqueCloseParens() << endl; + cout.width(50); + cout << "# of open parenthesis dest. states" + << pdtinfo.NumOpenParenStates() << endl; + cout.width(50); + cout << "# of close parenthesis source states" + << pdtinfo.NumCloseParenStates() << endl; + cout.setf(old); +} + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_INFO_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h new file mode 100755 index 00000000000..ca48e4e7a35 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h @@ -0,0 +1,496 @@ +// paren.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// Common classes for PDT parentheses + +// \file + +#ifndef FST_EXTENSIONS_PDT_PAREN_H_ +#define FST_EXTENSIONS_PDT_PAREN_H_ + +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include + +#include +#include +#include +#include + + +namespace fst { + +// +// ParenState: Pair of an open (close) parenthesis and +// its destination (source) state. +// + +template +class ParenState { + public: + typedef typename A::Label Label; + typedef typename A::StateId StateId; + + struct Hash { + size_t operator()(const ParenState &p) const { + return p.paren_id + p.state_id * kPrime; + } + }; + + Label paren_id; // ID of open (close) paren + StateId state_id; // destination (source) state of open (close) paren + + ParenState() : paren_id(kNoLabel), state_id(kNoStateId) {} + + ParenState(Label p, StateId s) : paren_id(p), state_id(s) {} + + bool operator==(const ParenState &p) const { + if (&p == this) + return true; + return p.paren_id == this->paren_id && p.state_id == this->state_id; + } + + bool operator!=(const ParenState &p) const { return !(p == *this); } + + bool operator<(const ParenState &p) const { + return paren_id < this->paren.id || + (p.paren_id == this->paren.id && p.state_id < this->state_id); + } + + private: + static const size_t kPrime; +}; + +template +const size_t ParenState::kPrime = 7853; + + +// Creates an FST-style iterator from STL map and iterator. +template +class MapIterator { + public: + typedef typename M::const_iterator StlIterator; + typedef typename M::value_type PairType; + typedef typename PairType::second_type ValueType; + + MapIterator(const M &m, StlIterator iter) + : map_(m), begin_(iter), iter_(iter) {} + + bool Done() const { + return iter_ == map_.end() || iter_->first != begin_->first; + } + + ValueType Value() const { return iter_->second; } + void Next() { ++iter_; } + void Reset() { iter_ = begin_; } + + private: + const M &map_; + StlIterator begin_; + StlIterator iter_; +}; + +// +// PdtParenReachable: Provides various parenthesis reachability information +// on a PDT. +// + +template +class PdtParenReachable { + public: + typedef typename A::StateId StateId; + typedef typename A::Label Label; + public: + // Maps from state ID to reachable paren IDs from (to) that state. + typedef unordered_multimap ParenMultiMap; + + // Maps from paren ID and state ID to reachable state set ID + typedef unordered_map, ssize_t, + typename ParenState::Hash> StateSetMap; + + // Maps from paren ID and state ID to arcs exiting that state with that + // Label. + typedef unordered_multimap, A, + typename ParenState::Hash> ParenArcMultiMap; + + typedef MapIterator ParenIterator; + + typedef MapIterator ParenArcIterator; + + typedef typename Collection::SetIterator SetIterator; + + // Computes close (open) parenthesis reachabilty information for + // a PDT with bounded stack. + PdtParenReachable(const Fst &fst, + const vector > &parens, bool close) + : fst_(fst), + parens_(parens), + close_(close) { + for (Label i = 0; i < parens.size(); ++i) { + const pair &p = parens[i]; + paren_id_map_[p.first] = i; + paren_id_map_[p.second] = i; + } + + if (close_) { + StateId start = fst.Start(); + if (start == kNoStateId) + return; + DFSearch(start, start); + } else { + FSTERROR() << "PdtParenReachable: open paren info not implemented"; + } + } + + // Given a state ID, returns an iterator over paren IDs + // for close (open) parens reachable from that state along balanced + // paths. + ParenIterator FindParens(StateId s) const { + return ParenIterator(paren_multimap_, paren_multimap_.find(s)); + } + + // Given a paren ID and a state ID s, returns an iterator over + // states that can be reached along balanced paths from (to) s that + // have have close (open) parentheses matching the paren ID exiting + // (entering) those states. + SetIterator FindStates(Label paren_id, StateId s) const { + ParenState paren_state(paren_id, s); + typename StateSetMap::const_iterator id_it = set_map_.find(paren_state); + if (id_it == set_map_.end()) { + return state_sets_.FindSet(-1); + } else { + return state_sets_.FindSet(id_it->second); + } + } + + // Given a paren Id and a state ID s, return an iterator over + // arcs that exit (enter) s and are labeled with a close (open) + // parenthesis matching the paren ID. + ParenArcIterator FindParenArcs(Label paren_id, StateId s) const { + ParenState paren_state(paren_id, s); + return ParenArcIterator(paren_arc_multimap_, + paren_arc_multimap_.find(paren_state)); + } + + private: + // DFS that gathers paren and state set information. + // Bool returns false when cycle detected. + bool DFSearch(StateId s, StateId start); + + // Unions state sets together gathered by the DFS. + void ComputeStateSet(StateId s); + + // Gather state set(s) from state 'nexts'. + void UpdateStateSet(StateId nexts, set &fst_; + const vector > &parens_; // Paren ID -> Labels + bool close_; // Close/open paren info? + unordered_map paren_id_map_; // Paren labels -> ID + ParenMultiMap paren_multimap_; // Paren reachability + ParenArcMultiMap paren_arc_multimap_; // Paren Arcs + vector state_color_; // DFS state + mutable Collection state_sets_; // Reachable states -> ID + StateSetMap set_map_; // ID -> Reachable states + DISALLOW_COPY_AND_ASSIGN(PdtParenReachable); +}; + +// DFS that gathers paren and state set information. +template +bool PdtParenReachable::DFSearch(StateId s, StateId start) { + if (s >= state_color_.size()) + state_color_.resize(s + 1, kDfsWhite); + + if (state_color_[s] == kDfsBlack) + return true; + + if (state_color_[s] == kDfsGrey) + return false; + + state_color_[s] = kDfsGrey; + + for (ArcIterator > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + + typename unordered_map::const_iterator pit + = paren_id_map_.find(arc.ilabel); + if (pit != paren_id_map_.end()) { // paren? + Label paren_id = pit->second; + if (arc.ilabel == parens_[paren_id].first) { // open paren + DFSearch(arc.nextstate, arc.nextstate); + for (SetIterator set_iter = FindStates(paren_id, arc.nextstate); + !set_iter.Done(); set_iter.Next()) { + for (ParenArcIterator paren_arc_iter = + FindParenArcs(paren_id, set_iter.Element()); + !paren_arc_iter.Done(); + paren_arc_iter.Next()) { + const A &cparc = paren_arc_iter.Value(); + DFSearch(cparc.nextstate, start); + } + } + } + } else { // non-paren + if(!DFSearch(arc.nextstate, start)) { + FSTERROR() << "PdtReachable: Underlying cyclicity not supported"; + return true; + } + } + } + ComputeStateSet(s); + state_color_[s] = kDfsBlack; + return true; +} + +// Unions state sets together gathered by the DFS. +template +void PdtParenReachable::ComputeStateSet(StateId s) { + set > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + + typename unordered_map::const_iterator pit + = paren_id_map_.find(arc.ilabel); + if (pit != paren_id_map_.end()) { // paren? + Label paren_id = pit->second; + if (arc.ilabel == parens_[paren_id].first) { // open paren + for (SetIterator set_iter = + FindStates(paren_id, arc.nextstate); + !set_iter.Done(); set_iter.Next()) { + for (ParenArcIterator paren_arc_iter = + FindParenArcs(paren_id, set_iter.Element()); + !paren_arc_iter.Done(); + paren_arc_iter.Next()) { + const A &cparc = paren_arc_iter.Value(); + UpdateStateSet(cparc.nextstate, &paren_set, &state_sets); + } + } + } else { // close paren + paren_set.insert(paren_id); + state_sets[paren_id].insert(s); + ParenState paren_state(paren_id, s); + paren_arc_multimap_.insert(make_pair(paren_state, arc)); + } + } else { // non-paren + UpdateStateSet(arc.nextstate, &paren_set, &state_sets); + } + } + + vector state_set; + for (typename set paren_state(paren_id, s); + set_map_[paren_state] = state_sets_.FindId(state_set); + } +} + +// Gather state set(s) from state 'nexts'. +template +void PdtParenReachable::UpdateStateSet( + StateId nexts, set::Hash> OpenParenSet; + + // Maps from open paren destination state to parenthesis ID. + typedef unordered_multimap OpenParenMap; + + // Maps from open paren state to source states of matching close parens + typedef unordered_multimap, StateId, + typename ParenState::Hash> CloseParenMap; + + // Maps from open paren state to close source set ID + typedef unordered_map, ssize_t, + typename ParenState::Hash> CloseSourceMap; + + typedef typename Collection::SetIterator SetIterator; + + PdtBalanceData() {} + + void Clear() { + open_paren_map_.clear(); + close_paren_map_.clear(); + } + + // Adds an open parenthesis with destination state 'open_dest'. + void OpenInsert(Label paren_id, StateId open_dest) { + ParenState key(paren_id, open_dest); + if (!open_paren_set_.count(key)) { + open_paren_set_.insert(key); + open_paren_map_.insert(make_pair(open_dest, paren_id)); + } + } + + // Adds a matching closing parenthesis with source state + // 'close_source' that balances an open_parenthesis with destination + // state 'open_dest' if OpenInsert() previously called + // (o.w. CloseInsert() does nothing). + void CloseInsert(Label paren_id, StateId open_dest, StateId close_source) { + ParenState key(paren_id, open_dest); + if (open_paren_set_.count(key)) + close_paren_map_.insert(make_pair(key, close_source)); + } + + // Find close paren source states matching an open parenthesis. + // Methods that follow, iterate through those matching states. + // Should be called only after FinishInsert(open_dest). + SetIterator Find(Label paren_id, StateId open_dest) { + ParenState close_key(paren_id, open_dest); + typename CloseSourceMap::const_iterator id_it = + close_source_map_.find(close_key); + if (id_it == close_source_map_.end()) { + return close_source_sets_.FindSet(-1); + } else { + return close_source_sets_.FindSet(id_it->second); + } + } + + // Call when all open and close parenthesis insertions wrt open + // parentheses entering 'open_dest' are finished. Must be called + // before Find(open_dest). Stores close paren source state sets + // efficiently. + void FinishInsert(StateId open_dest) { + vector close_sources; + for (typename OpenParenMap::iterator oit = open_paren_map_.find(open_dest); + oit != open_paren_map_.end() && oit->first == open_dest;) { + Label paren_id = oit->second; + close_sources.clear(); + ParenState okey(paren_id, open_dest); + open_paren_set_.erase(open_paren_set_.find(okey)); + for (typename CloseParenMap::iterator cit = close_paren_map_.find(okey); + cit != close_paren_map_.end() && cit->first == okey;) { + close_sources.push_back(cit->second); + close_paren_map_.erase(cit++); + } + sort(close_sources.begin(), close_sources.end()); + typename vector::iterator unique_end = + unique(close_sources.begin(), close_sources.end()); + close_sources.resize(unique_end - close_sources.begin()); + + if (!close_sources.empty()) + close_source_map_[okey] = close_source_sets_.FindId(close_sources); + open_paren_map_.erase(oit++); + } + } + + // Return a new balance data object representing the reversed balance + // information. + PdtBalanceData *Reverse(StateId num_states, + StateId num_split, + StateId state_id_shift) const; + + private: + OpenParenSet open_paren_set_; // open par. at dest? + + OpenParenMap open_paren_map_; // open parens per state + ParenState open_dest_; // cur open dest. state + typename OpenParenMap::const_iterator open_iter_; // cur open parens/state + + CloseParenMap close_paren_map_; // close states/open + // paren and state + + CloseSourceMap close_source_map_; // paren, state to set ID + mutable Collection close_source_sets_; +}; + +// Return a new balance data object representing the reversed balance +// information. +template +PdtBalanceData *PdtBalanceData::Reverse( + StateId num_states, + StateId num_split, + StateId state_id_shift) const { + PdtBalanceData *bd = new PdtBalanceData; + unordered_set close_sources; + StateId split_size = num_states / num_split; + + for (StateId i = 0; i < num_states; i+= split_size) { + close_sources.clear(); + + for (typename CloseSourceMap::const_iterator + sit = close_source_map_.begin(); + sit != close_source_map_.end(); + ++sit) { + ParenState okey = sit->first; + StateId open_dest = okey.state_id; + Label paren_id = okey.paren_id; + for (SetIterator set_iter = close_source_sets_.FindSet(sit->second); + !set_iter.Done(); set_iter.Next()) { + StateId close_source = set_iter.Element(); + if ((close_source < i) || (close_source >= i + split_size)) + continue; + close_sources.insert(close_source + state_id_shift); + bd->OpenInsert(paren_id, close_source + state_id_shift); + bd->CloseInsert(paren_id, close_source + state_id_shift, + open_dest + state_id_shift); + } + } + + for (typename unordered_set::const_iterator it + = close_sources.begin(); + it != close_sources.end(); + ++it) { + bd->FinishInsert(*it); + } + + } + return bd; +} + + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_PAREN_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h.bak new file mode 100755 index 00000000000..41ef9417f66 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/paren.h.bak @@ -0,0 +1,496 @@ +// paren.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// Common classes for PDT parentheses + +// \file + +#ifndef FST_EXTENSIONS_PDT_PAREN_H_ +#define FST_EXTENSIONS_PDT_PAREN_H_ + +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include + +#include +#include +#include +#include + + +namespace fst { + +// +// ParenState: Pair of an open (close) parenthesis and +// its destination (source) state. +// + +template +class ParenState { + public: + typedef typename A::Label Label; + typedef typename A::StateId StateId; + + struct Hash { + size_t operator()(const ParenState &p) const { + return p.paren_id + p.state_id * kPrime; + } + }; + + Label paren_id; // ID of open (close) paren + StateId state_id; // destination (source) state of open (close) paren + + ParenState() : paren_id(kNoLabel), state_id(kNoStateId) {} + + ParenState(Label p, StateId s) : paren_id(p), state_id(s) {} + + bool operator==(const ParenState &p) const { + if (&p == this) + return true; + return p.paren_id == this->paren_id && p.state_id == this->state_id; + } + + bool operator!=(const ParenState &p) const { return !(p == *this); } + + bool operator<(const ParenState &p) const { + return paren_id < this->paren.id || + (p.paren_id == this->paren.id && p.state_id < this->state_id); + } + + private: + static const size_t kPrime; +}; + +template +const size_t ParenState::kPrime = 7853; + + +// Creates an FST-style iterator from STL map and iterator. +template +class MapIterator { + public: + typedef typename M::const_iterator StlIterator; + typedef typename M::value_type PairType; + typedef typename PairType::second_type ValueType; + + MapIterator(const M &m, StlIterator iter) + : map_(m), begin_(iter), iter_(iter) {} + + bool Done() const { + return iter_ == map_.end() || iter_->first != begin_->first; + } + + ValueType Value() const { return iter_->second; } + void Next() { ++iter_; } + void Reset() { iter_ = begin_; } + + private: + const M &map_; + StlIterator begin_; + StlIterator iter_; +}; + +// +// PdtParenReachable: Provides various parenthesis reachability information +// on a PDT. +// + +template +class PdtParenReachable { + public: + typedef typename A::StateId StateId; + typedef typename A::Label Label; + public: + // Maps from state ID to reachable paren IDs from (to) that state. + typedef unordered_multimap ParenMultiMap; + + // Maps from paren ID and state ID to reachable state set ID + typedef unordered_map, ssize_t, + typename ParenState::Hash> StateSetMap; + + // Maps from paren ID and state ID to arcs exiting that state with that + // Label. + typedef unordered_multimap, A, + typename ParenState::Hash> ParenArcMultiMap; + + typedef MapIterator ParenIterator; + + typedef MapIterator ParenArcIterator; + + typedef typename Collection::SetIterator SetIterator; + + // Computes close (open) parenthesis reachabilty information for + // a PDT with bounded stack. + PdtParenReachable(const Fst &fst, + const vector > &parens, bool close) + : fst_(fst), + parens_(parens), + close_(close) { + for (Label i = 0; i < parens.size(); ++i) { + const pair &p = parens[i]; + paren_id_map_[p.first] = i; + paren_id_map_[p.second] = i; + } + + if (close_) { + StateId start = fst.Start(); + if (start == kNoStateId) + return; + DFSearch(start, start); + } else { + FSTERROR() << "PdtParenReachable: open paren info not implemented"; + } + } + + // Given a state ID, returns an iterator over paren IDs + // for close (open) parens reachable from that state along balanced + // paths. + ParenIterator FindParens(StateId s) const { + return ParenIterator(paren_multimap_, paren_multimap_.find(s)); + } + + // Given a paren ID and a state ID s, returns an iterator over + // states that can be reached along balanced paths from (to) s that + // have have close (open) parentheses matching the paren ID exiting + // (entering) those states. + SetIterator FindStates(Label paren_id, StateId s) const { + ParenState paren_state(paren_id, s); + typename StateSetMap::const_iterator id_it = set_map_.find(paren_state); + if (id_it == set_map_.end()) { + return state_sets_.FindSet(-1); + } else { + return state_sets_.FindSet(id_it->second); + } + } + + // Given a paren Id and a state ID s, return an iterator over + // arcs that exit (enter) s and are labeled with a close (open) + // parenthesis matching the paren ID. + ParenArcIterator FindParenArcs(Label paren_id, StateId s) const { + ParenState paren_state(paren_id, s); + return ParenArcIterator(paren_arc_multimap_, + paren_arc_multimap_.find(paren_state)); + } + + private: + // DFS that gathers paren and state set information. + // Bool returns false when cycle detected. + bool DFSearch(StateId s, StateId start); + + // Unions state sets together gathered by the DFS. + void ComputeStateSet(StateId s); + + // Gather state set(s) from state 'nexts'. + void UpdateStateSet(StateId nexts, set &fst_; + const vector > &parens_; // Paren ID -> Labels + bool close_; // Close/open paren info? + unordered_map paren_id_map_; // Paren labels -> ID + ParenMultiMap paren_multimap_; // Paren reachability + ParenArcMultiMap paren_arc_multimap_; // Paren Arcs + vector state_color_; // DFS state + mutable Collection state_sets_; // Reachable states -> ID + StateSetMap set_map_; // ID -> Reachable states + DISALLOW_COPY_AND_ASSIGN(PdtParenReachable); +}; + +// DFS that gathers paren and state set information. +template +bool PdtParenReachable::DFSearch(StateId s, StateId start) { + if (s >= state_color_.size()) + state_color_.resize(s + 1, kDfsWhite); + + if (state_color_[s] == kDfsBlack) + return true; + + if (state_color_[s] == kDfsGrey) + return false; + + state_color_[s] = kDfsGrey; + + for (ArcIterator > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + + typename unordered_map::const_iterator pit + = paren_id_map_.find(arc.ilabel); + if (pit != paren_id_map_.end()) { // paren? + Label paren_id = pit->second; + if (arc.ilabel == parens_[paren_id].first) { // open paren + DFSearch(arc.nextstate, arc.nextstate); + for (SetIterator set_iter = FindStates(paren_id, arc.nextstate); + !set_iter.Done(); set_iter.Next()) { + for (ParenArcIterator paren_arc_iter = + FindParenArcs(paren_id, set_iter.Element()); + !paren_arc_iter.Done(); + paren_arc_iter.Next()) { + const A &cparc = paren_arc_iter.Value(); + DFSearch(cparc.nextstate, start); + } + } + } + } else { // non-paren + if(!DFSearch(arc.nextstate, start)) { + FSTERROR() << "PdtReachable: Underlying cyclicity not supported"; + return true; + } + } + } + ComputeStateSet(s); + state_color_[s] = kDfsBlack; + return true; +} + +// Unions state sets together gathered by the DFS. +template +void PdtParenReachable::ComputeStateSet(StateId s) { + set > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + + typename unordered_map::const_iterator pit + = paren_id_map_.find(arc.ilabel); + if (pit != paren_id_map_.end()) { // paren? + Label paren_id = pit->second; + if (arc.ilabel == parens_[paren_id].first) { // open paren + for (SetIterator set_iter = + FindStates(paren_id, arc.nextstate); + !set_iter.Done(); set_iter.Next()) { + for (ParenArcIterator paren_arc_iter = + FindParenArcs(paren_id, set_iter.Element()); + !paren_arc_iter.Done(); + paren_arc_iter.Next()) { + const A &cparc = paren_arc_iter.Value(); + UpdateStateSet(cparc.nextstate, &paren_set, &state_sets); + } + } + } else { // close paren + paren_set.insert(paren_id); + state_sets[paren_id].insert(s); + ParenState paren_state(paren_id, s); + paren_arc_multimap_.insert(make_pair(paren_state, arc)); + } + } else { // non-paren + UpdateStateSet(arc.nextstate, &paren_set, &state_sets); + } + } + + vector state_set; + for (typename set paren_state(paren_id, s); + set_map_[paren_state] = state_sets_.FindId(state_set); + } +} + +// Gather state set(s) from state 'nexts'. +template +void PdtParenReachable::UpdateStateSet( + StateId nexts, set::Hash> OpenParenSet; + + // Maps from open paren destination state to parenthesis ID. + typedef unordered_multimap OpenParenMap; + + // Maps from open paren state to source states of matching close parens + typedef unordered_multimap, StateId, + typename ParenState::Hash> CloseParenMap; + + // Maps from open paren state to close source set ID + typedef unordered_map, ssize_t, + typename ParenState::Hash> CloseSourceMap; + + typedef typename Collection::SetIterator SetIterator; + + PdtBalanceData() {} + + void Clear() { + open_paren_map_.clear(); + close_paren_map_.clear(); + } + + // Adds an open parenthesis with destination state 'open_dest'. + void OpenInsert(Label paren_id, StateId open_dest) { + ParenState key(paren_id, open_dest); + if (!open_paren_set_.count(key)) { + open_paren_set_.insert(key); + open_paren_map_.insert(make_pair(open_dest, paren_id)); + } + } + + // Adds a matching closing parenthesis with source state + // 'close_source' that balances an open_parenthesis with destination + // state 'open_dest' if OpenInsert() previously called + // (o.w. CloseInsert() does nothing). + void CloseInsert(Label paren_id, StateId open_dest, StateId close_source) { + ParenState key(paren_id, open_dest); + if (open_paren_set_.count(key)) + close_paren_map_.insert(make_pair(key, close_source)); + } + + // Find close paren source states matching an open parenthesis. + // Methods that follow, iterate through those matching states. + // Should be called only after FinishInsert(open_dest). + SetIterator Find(Label paren_id, StateId open_dest) { + ParenState close_key(paren_id, open_dest); + typename CloseSourceMap::const_iterator id_it = + close_source_map_.find(close_key); + if (id_it == close_source_map_.end()) { + return close_source_sets_.FindSet(-1); + } else { + return close_source_sets_.FindSet(id_it->second); + } + } + + // Call when all open and close parenthesis insertions wrt open + // parentheses entering 'open_dest' are finished. Must be called + // before Find(open_dest). Stores close paren source state sets + // efficiently. + void FinishInsert(StateId open_dest) { + vector close_sources; + for (typename OpenParenMap::iterator oit = open_paren_map_.find(open_dest); + oit != open_paren_map_.end() && oit->first == open_dest;) { + Label paren_id = oit->second; + close_sources.clear(); + ParenState okey(paren_id, open_dest); + open_paren_set_.erase(open_paren_set_.find(okey)); + for (typename CloseParenMap::iterator cit = close_paren_map_.find(okey); + cit != close_paren_map_.end() && cit->first == okey;) { + close_sources.push_back(cit->second); + close_paren_map_.erase(cit++); + } + sort(close_sources.begin(), close_sources.end()); + typename vector::iterator unique_end = + unique(close_sources.begin(), close_sources.end()); + close_sources.resize(unique_end - close_sources.begin()); + + if (!close_sources.empty()) + close_source_map_[okey] = close_source_sets_.FindId(close_sources); + open_paren_map_.erase(oit++); + } + } + + // Return a new balance data object representing the reversed balance + // information. + PdtBalanceData *Reverse(StateId num_states, + StateId num_split, + StateId state_id_shift) const; + + private: + OpenParenSet open_paren_set_; // open par. at dest? + + OpenParenMap open_paren_map_; // open parens per state + ParenState open_dest_; // cur open dest. state + typename OpenParenMap::const_iterator open_iter_; // cur open parens/state + + CloseParenMap close_paren_map_; // close states/open + // paren and state + + CloseSourceMap close_source_map_; // paren, state to set ID + mutable Collection close_source_sets_; +}; + +// Return a new balance data object representing the reversed balance +// information. +template +PdtBalanceData *PdtBalanceData::Reverse( + StateId num_states, + StateId num_split, + StateId state_id_shift) const { + PdtBalanceData *bd = new PdtBalanceData; + unordered_set close_sources; + StateId split_size = num_states / num_split; + + for (StateId i = 0; i < num_states; i+= split_size) { + close_sources.clear(); + + for (typename CloseSourceMap::const_iterator + sit = close_source_map_.begin(); + sit != close_source_map_.end(); + ++sit) { + ParenState okey = sit->first; + StateId open_dest = okey.state_id; + Label paren_id = okey.paren_id; + for (SetIterator set_iter = close_source_sets_.FindSet(sit->second); + !set_iter.Done(); set_iter.Next()) { + StateId close_source = set_iter.Element(); + if ((close_source < i) || (close_source >= i + split_size)) + continue; + close_sources.insert(close_source + state_id_shift); + bd->OpenInsert(paren_id, close_source + state_id_shift); + bd->CloseInsert(paren_id, close_source + state_id_shift, + open_dest + state_id_shift); + } + } + + for (typename unordered_set::const_iterator it + = close_sources.begin(); + it != close_sources.end(); + ++it) { + bd->FinishInsert(*it); + } + + } + return bd; +} + + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_PAREN_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h new file mode 100755 index 00000000000..1bae4d2c4d6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h @@ -0,0 +1,212 @@ +// pdt.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Common classes for PDT expansion/traversal. + +#ifndef FST_EXTENSIONS_PDT_PDT_H__ +#define FST_EXTENSIONS_PDT_PDT_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include + +#include +#include + +namespace fst { + +// Provides bijection between parenthesis stacks and signed integral +// stack IDs. Each stack ID is unique to each distinct stack. The +// open-close parenthesis label pairs are passed in 'parens'. +template +class PdtStack { + public: + typedef K StackId; + typedef L Label; + + // The stacks are stored in a tree. The nodes are stored in vector + // 'nodes_'. Each node represents the top of some stack and is + // ID'ed by its position in the vector. Its parent node represents + // the stack with the top 'popped' and its children are stored in + // 'child_map_' accessed by stack_id and label. The paren_id is + // the position in 'parens' of the parenthesis for that node. + struct StackNode { + StackId parent_id; + size_t paren_id; + + StackNode(StackId p, size_t i) : parent_id(p), paren_id(i) {} + }; + + PdtStack(const vector > &parens) + : parens_(parens), min_paren_(kNoLabel), max_paren_(kNoLabel) { + for (size_t i = 0; i < parens.size(); ++i) { + const pair &p = parens[i]; + paren_map_[p.first] = i; + paren_map_[p.second] = i; + + if (min_paren_ == kNoLabel || p.first < min_paren_) + min_paren_ = p.first; + if (p.second < min_paren_) + min_paren_ = p.second; + + if (max_paren_ == kNoLabel || p.first > max_paren_) + max_paren_ = p.first; + if (p.second > max_paren_) + max_paren_ = p.second; + } + nodes_.push_back(StackNode(-1, -1)); // Tree root. + } + + // Returns stack ID given the current stack ID (0 if empty) and + // label read. 'Pushes' onto a stack if the label is an open + // parenthesis, returning the new stack ID. 'Pops' the stack if the + // label is a close parenthesis that matches the top of the stack, + // returning the parent stack ID. Returns -1 if label is an + // unmatched close parenthesis. Otherwise, returns the current stack + // ID. + StackId Find(StackId stack_id, Label label) { + if (min_paren_ == kNoLabel || label < min_paren_ || label > max_paren_) + return stack_id; // Non-paren. + + typename unordered_map::const_iterator pit + = paren_map_.find(label); + if (pit == paren_map_.end()) // Non-paren. + return stack_id; + ssize_t paren_id = pit->second; + + if (label == parens_[paren_id].first) { // Open paren. + StackId &child_id = child_map_[make_pair(stack_id, label)]; + if (child_id == 0) { // Child not found, push label. + child_id = nodes_.size(); + nodes_.push_back(StackNode(stack_id, paren_id)); + } + return child_id; + } + + const StackNode &node = nodes_[stack_id]; + if (paren_id == node.paren_id) // Matching close paren. + return node.parent_id; + + return -1; // Non-matching close paren. + } + + // Returns the stack ID obtained by "popping" the label at the top + // of the current stack ID. + StackId Pop(StackId stack_id) const { + return nodes_[stack_id].parent_id; + } + + // Returns the paren ID at the top of the stack for 'stack_id' + ssize_t Top(StackId stack_id) const { + return nodes_[stack_id].paren_id; + } + + ssize_t ParenId(Label label) const { + typename unordered_map::const_iterator pit + = paren_map_.find(label); + if (pit == paren_map_.end()) // Non-paren. + return -1; + return pit->second; + } + + private: + struct ChildHash { + size_t operator()(const pair &p) const { + return p.first + p.second * kPrime; + } + }; + + static const size_t kPrime; + + vector > parens_; + vector nodes_; + unordered_map paren_map_; + unordered_map, + StackId, ChildHash> child_map_; // Child of stack node wrt label + Label min_paren_; // For faster paren. check + Label max_paren_; // For faster paren. check +}; + +template +const size_t PdtStack::kPrime = 7853; + + +// State tuple for PDT expansion +template +struct PdtStateTuple { + typedef S StateId; + typedef K StackId; + + StateId state_id; + StackId stack_id; + + PdtStateTuple() + : state_id(kNoStateId), stack_id(-1) {} + + PdtStateTuple(StateId fs, StackId ss) + : state_id(fs), stack_id(ss) {} +}; + +// Equality of PDT state tuples. +template +inline bool operator==(const PdtStateTuple& x, + const PdtStateTuple& y) { + if (&x == &y) + return true; + return x.state_id == y.state_id && x.stack_id == y.stack_id; +} + + +// Hash function object for PDT state tuples +template +class PdtStateHash { + public: + size_t operator()(const T &tuple) const { + return tuple.state_id + tuple.stack_id * kPrime; + } + + private: + static const size_t kPrime; +}; + +template +const size_t PdtStateHash::kPrime = 7853; + + +// Tuple to PDT state bijection. +template +class PdtStateTable + : public CompactHashStateTable, + PdtStateHash > > { + public: + typedef S StateId; + typedef K StackId; + + PdtStateTable() {} + + PdtStateTable(const PdtStateTable &table) {} + + private: + void operator=(const PdtStateTable &table); // disallow +}; + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_PDT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h.bak new file mode 100755 index 00000000000..6649f55b6c2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdt.h.bak @@ -0,0 +1,212 @@ +// pdt.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Common classes for PDT expansion/traversal. + +#ifndef FST_EXTENSIONS_PDT_PDT_H__ +#define FST_EXTENSIONS_PDT_PDT_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include + +#include +#include + +namespace fst { + +// Provides bijection between parenthesis stacks and signed integral +// stack IDs. Each stack ID is unique to each distinct stack. The +// open-close parenthesis label pairs are passed in 'parens'. +template +class PdtStack { + public: + typedef K StackId; + typedef L Label; + + // The stacks are stored in a tree. The nodes are stored in vector + // 'nodes_'. Each node represents the top of some stack and is + // ID'ed by its position in the vector. Its parent node represents + // the stack with the top 'popped' and its children are stored in + // 'child_map_' accessed by stack_id and label. The paren_id is + // the position in 'parens' of the parenthesis for that node. + struct StackNode { + StackId parent_id; + size_t paren_id; + + StackNode(StackId p, size_t i) : parent_id(p), paren_id(i) {} + }; + + PdtStack(const vector > &parens) + : parens_(parens), min_paren_(kNoLabel), max_paren_(kNoLabel) { + for (size_t i = 0; i < parens.size(); ++i) { + const pair &p = parens[i]; + paren_map_[p.first] = i; + paren_map_[p.second] = i; + + if (min_paren_ == kNoLabel || p.first < min_paren_) + min_paren_ = p.first; + if (p.second < min_paren_) + min_paren_ = p.second; + + if (max_paren_ == kNoLabel || p.first > max_paren_) + max_paren_ = p.first; + if (p.second > max_paren_) + max_paren_ = p.second; + } + nodes_.push_back(StackNode(-1, -1)); // Tree root. + } + + // Returns stack ID given the current stack ID (0 if empty) and + // label read. 'Pushes' onto a stack if the label is an open + // parenthesis, returning the new stack ID. 'Pops' the stack if the + // label is a close parenthesis that matches the top of the stack, + // returning the parent stack ID. Returns -1 if label is an + // unmatched close parenthesis. Otherwise, returns the current stack + // ID. + StackId Find(StackId stack_id, Label label) { + if (min_paren_ == kNoLabel || label < min_paren_ || label > max_paren_) + return stack_id; // Non-paren. + + typename unordered_map::const_iterator pit + = paren_map_.find(label); + if (pit == paren_map_.end()) // Non-paren. + return stack_id; + ssize_t paren_id = pit->second; + + if (label == parens_[paren_id].first) { // Open paren. + StackId &child_id = child_map_[make_pair(stack_id, label)]; + if (child_id == 0) { // Child not found, push label. + child_id = nodes_.size(); + nodes_.push_back(StackNode(stack_id, paren_id)); + } + return child_id; + } + + const StackNode &node = nodes_[stack_id]; + if (paren_id == node.paren_id) // Matching close paren. + return node.parent_id; + + return -1; // Non-matching close paren. + } + + // Returns the stack ID obtained by "popping" the label at the top + // of the current stack ID. + StackId Pop(StackId stack_id) const { + return nodes_[stack_id].parent_id; + } + + // Returns the paren ID at the top of the stack for 'stack_id' + ssize_t Top(StackId stack_id) const { + return nodes_[stack_id].paren_id; + } + + ssize_t ParenId(Label label) const { + typename unordered_map::const_iterator pit + = paren_map_.find(label); + if (pit == paren_map_.end()) // Non-paren. + return -1; + return pit->second; + } + + private: + struct ChildHash { + size_t operator()(const pair &p) const { + return p.first + p.second * kPrime; + } + }; + + static const size_t kPrime; + + vector > parens_; + vector nodes_; + unordered_map paren_map_; + unordered_map, + StackId, ChildHash> child_map_; // Child of stack node wrt label + Label min_paren_; // For faster paren. check + Label max_paren_; // For faster paren. check +}; + +template +const size_t PdtStack::kPrime = 7853; + + +// State tuple for PDT expansion +template +struct PdtStateTuple { + typedef S StateId; + typedef K StackId; + + StateId state_id; + StackId stack_id; + + PdtStateTuple() + : state_id(kNoStateId), stack_id(-1) {} + + PdtStateTuple(StateId fs, StackId ss) + : state_id(fs), stack_id(ss) {} +}; + +// Equality of PDT state tuples. +template +inline bool operator==(const PdtStateTuple& x, + const PdtStateTuple& y) { + if (&x == &y) + return true; + return x.state_id == y.state_id && x.stack_id == y.stack_id; +} + + +// Hash function object for PDT state tuples +template +class PdtStateHash { + public: + size_t operator()(const T &tuple) const { + return tuple.state_id + tuple.stack_id * kPrime; + } + + private: + static const size_t kPrime; +}; + +template +const size_t PdtStateHash::kPrime = 7853; + + +// Tuple to PDT state bijection. +template +class PdtStateTable + : public CompactHashStateTable, + PdtStateHash > > { + public: + typedef S StateId; + typedef K StackId; + + PdtStateTable() {} + + PdtStateTable(const PdtStateTable &table) {} + + private: + void operator=(const PdtStateTable &table); // disallow +}; + +} // namespace fst + +#endif // FST_EXTENSIONS_PDT_PDT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtlib.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtlib.h new file mode 100755 index 00000000000..71c8123b196 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtlib.h @@ -0,0 +1,30 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// This is an experimental push-down transducer(PDT) library. A PDT is +// encoded as an FST, where some transitions are labeled with open or close +// parentheses. To be interpreted as a PDT, the parentheses must balance on a +// path. + +#ifndef FST_EXTENSIONS_PDT_PDTLIB_H_ +#define FST_EXTENSIONS_PDT_PDTLIB_H_ + +#include +#include +#include +#include + +#endif // FST_EXTENSIONS_PDT_PDTLIB_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h new file mode 100755 index 00000000000..db7cd9bc00d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h @@ -0,0 +1,284 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) +// Convenience file for including all PDT operations at once, and/or +// registering them for new arc types. + +#ifndef FST_EXTENSIONS_PDT_PDTSCRIPT_H_ +#define FST_EXTENSIONS_PDT_PDTSCRIPT_H_ + +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include // for ComposeOptions +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace fst { +namespace script { + +// PDT COMPOSE + +typedef args::Package >&, + MutableFstClass *, + const ComposeOptions &, + bool> PdtComposeArgs; + +template +void PdtCompose(PdtComposeArgs *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg4->GetMutableFst(); + + vector > parens( + args->arg3.size()); + + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg3[i].first; + parens[i].second = args->arg3[i].second; + } + + if (args->arg6) { + Compose(ifst1, parens, ifst2, ofst, args->arg5); + } else { + Compose(ifst1, ifst2, parens, ofst, args->arg5); + } +} + +void OPENFSTDLL PdtCompose(const FstClass & ifst1, //ChangedPD + const FstClass & ifst2, + const vector > &parens, + MutableFstClass *ofst, + const ComposeOptions &copts, + bool left_pdt); + +// PDT EXPAND + +struct PdtExpandOptions { + bool connect; + bool keep_parentheses; + WeightClass weight_threshold; + + PdtExpandOptions(bool c = true, bool k = false, + WeightClass w = WeightClass::Zero()) + : connect(c), keep_parentheses(k), weight_threshold(w) {} +}; + +typedef args::Package >&, + MutableFstClass *, PdtExpandOptions> PdtExpandArgs; + +template +void PdtExpand(PdtExpandArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + Expand(fst, parens, ofst, + ExpandOptions( + args->arg4.connect, args->arg4.keep_parentheses, + *(args->arg4.weight_threshold.GetWeight()))); +} + +void OPENFSTDLL PdtExpand(const FstClass &ifst, //ChangedPD + const vector > &parens, + MutableFstClass *ofst, const PdtExpandOptions &opts); + +void OPENFSTDLL PdtExpand(const FstClass &ifst, //ChangedPD + const vector > &parens, + MutableFstClass *ofst, bool connect); + +// PDT REPLACE + +typedef args::Package > &, + MutableFstClass *, + vector > *, + const int64 &> PdtReplaceArgs; +template +void PdtReplace(PdtReplaceArgs *args) { + vector *> > tuples( + args->arg1.size()); + for (size_t i = 0; i < tuples.size(); ++i) { + tuples[i].first = args->arg1[i].first; + tuples[i].second = (args->arg1[i].second)->GetFst(); + } + MutableFst *ofst = args->arg2->GetMutableFst(); + vector > parens( + args->arg3->size()); + + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg3->at(i).first; + parens[i].second = args->arg3->at(i).second; + } + Replace(tuples, ofst, &parens, args->arg4); + + // now copy parens back + args->arg3->resize(parens.size()); + for (size_t i = 0; i < parens.size(); ++i) { + (*args->arg3)[i].first = parens[i].first; + (*args->arg3)[i].second = parens[i].second; + } +} + +void OPENFSTDLL PdtReplace(const vector > &fst_tuples, //ChangedPD + MutableFstClass *ofst, + vector > *parens, + const int64 &root); + +// PDT REVERSE + +typedef args::Package >&, + MutableFstClass *> PdtReverseArgs; + +template +void PdtReverse(PdtReverseArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + Reverse(fst, parens, ofst); +} + +void OPENFSTDLL PdtReverse(const FstClass &ifst, //ChangedPD + const vector > &parens, + MutableFstClass *ofst); + + +// PDT SHORTESTPATH + +struct PdtShortestPathOptions { + QueueType queue_type; + bool keep_parentheses; + bool path_gc; + + PdtShortestPathOptions(QueueType qt = FIFO_QUEUE, + bool kp = false, bool gc = true) + : queue_type(qt), keep_parentheses(kp), path_gc(gc) {} +}; + +typedef args::Package >&, + MutableFstClass *, + const PdtShortestPathOptions &> PdtShortestPathArgs; + +template +void PdtShortestPath(PdtShortestPathArgs *args) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + const PdtShortestPathOptions &opts = args->arg4; + + + vector > parens(args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + + switch (opts.queue_type) { + default: + FSTERROR() << "Unknown queue type: " << opts.queue_type; + case FIFO_QUEUE: { + typedef FifoQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + case LIFO_QUEUE: { + typedef LifoQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + case STATE_ORDER_QUEUE: { + typedef StateOrderQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + } +} + +void OPENFSTDLL PdtShortestPath(const FstClass &ifst, //ChangedPD + const vector > &parens, + MutableFstClass *ofst, + const PdtShortestPathOptions &opts = + PdtShortestPathOptions()); + +// PRINT INFO + +typedef args::Package > &> PrintPdtInfoArgs; + +template +void PrintPdtInfo(PrintPdtInfoArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + PdtInfo pdtinfo(fst, parens); + PrintPdtInfo(pdtinfo); +} + +void OPENFSTDLL PrintPdtInfo(const FstClass &ifst, //ChangedPD + const vector > &parens); + +} // namespace script +} // namespace fst + + +#define REGISTER_FST_PDT_OPERATIONS(ArcType) \ + REGISTER_FST_OPERATION(PdtCompose, ArcType, PdtComposeArgs); \ + REGISTER_FST_OPERATION(PdtExpand, ArcType, PdtExpandArgs); \ + REGISTER_FST_OPERATION(PdtReplace, ArcType, PdtReplaceArgs); \ + REGISTER_FST_OPERATION(PdtReverse, ArcType, PdtReverseArgs); \ + REGISTER_FST_OPERATION(PdtShortestPath, ArcType, PdtShortestPathArgs); \ + REGISTER_FST_OPERATION(PrintPdtInfo, ArcType, PrintPdtInfoArgs) +#endif // FST_EXTENSIONS_PDT_PDTSCRIPT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h.bak b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h.bak new file mode 100755 index 00000000000..c2a1cf494d6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/pdtscript.h.bak @@ -0,0 +1,284 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) +// Convenience file for including all PDT operations at once, and/or +// registering them for new arc types. + +#ifndef FST_EXTENSIONS_PDT_PDTSCRIPT_H_ +#define FST_EXTENSIONS_PDT_PDTSCRIPT_H_ + +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include // for ComposeOptions +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +namespace fst { +namespace script { + +// PDT COMPOSE + +typedef args::Package >&, + MutableFstClass *, + const ComposeOptions &, + bool> PdtComposeArgs; + +template +void PdtCompose(PdtComposeArgs *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg4->GetMutableFst(); + + vector > parens( + args->arg3.size()); + + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg3[i].first; + parens[i].second = args->arg3[i].second; + } + + if (args->arg6) { + Compose(ifst1, parens, ifst2, ofst, args->arg5); + } else { + Compose(ifst1, ifst2, parens, ofst, args->arg5); + } +} + +void PdtCompose(const FstClass & ifst1, + const FstClass & ifst2, + const vector > &parens, + MutableFstClass *ofst, + const ComposeOptions &copts, + bool left_pdt); + +// PDT EXPAND + +struct PdtExpandOptions { + bool connect; + bool keep_parentheses; + WeightClass weight_threshold; + + PdtExpandOptions(bool c = true, bool k = false, + WeightClass w = WeightClass::Zero()) + : connect(c), keep_parentheses(k), weight_threshold(w) {} +}; + +typedef args::Package >&, + MutableFstClass *, PdtExpandOptions> PdtExpandArgs; + +template +void PdtExpand(PdtExpandArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + Expand(fst, parens, ofst, + ExpandOptions( + args->arg4.connect, args->arg4.keep_parentheses, + *(args->arg4.weight_threshold.GetWeight()))); +} + +void PdtExpand(const FstClass &ifst, + const vector > &parens, + MutableFstClass *ofst, const PdtExpandOptions &opts); + +void PdtExpand(const FstClass &ifst, + const vector > &parens, + MutableFstClass *ofst, bool connect); + +// PDT REPLACE + +typedef args::Package > &, + MutableFstClass *, + vector > *, + const int64 &> PdtReplaceArgs; +template +void PdtReplace(PdtReplaceArgs *args) { + vector *> > tuples( + args->arg1.size()); + for (size_t i = 0; i < tuples.size(); ++i) { + tuples[i].first = args->arg1[i].first; + tuples[i].second = (args->arg1[i].second)->GetFst(); + } + MutableFst *ofst = args->arg2->GetMutableFst(); + vector > parens( + args->arg3->size()); + + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg3->at(i).first; + parens[i].second = args->arg3->at(i).second; + } + Replace(tuples, ofst, &parens, args->arg4); + + // now copy parens back + args->arg3->resize(parens.size()); + for (size_t i = 0; i < parens.size(); ++i) { + (*args->arg3)[i].first = parens[i].first; + (*args->arg3)[i].second = parens[i].second; + } +} + +void PdtReplace(const vector > &fst_tuples, + MutableFstClass *ofst, + vector > *parens, + const int64 &root); + +// PDT REVERSE + +typedef args::Package >&, + MutableFstClass *> PdtReverseArgs; + +template +void PdtReverse(PdtReverseArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + Reverse(fst, parens, ofst); +} + +void PdtReverse(const FstClass &ifst, + const vector > &parens, + MutableFstClass *ofst); + + +// PDT SHORTESTPATH + +struct PdtShortestPathOptions { + QueueType queue_type; + bool keep_parentheses; + bool path_gc; + + PdtShortestPathOptions(QueueType qt = FIFO_QUEUE, + bool kp = false, bool gc = true) + : queue_type(qt), keep_parentheses(kp), path_gc(gc) {} +}; + +typedef args::Package >&, + MutableFstClass *, + const PdtShortestPathOptions &> PdtShortestPathArgs; + +template +void PdtShortestPath(PdtShortestPathArgs *args) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + const Fst &fst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + const PdtShortestPathOptions &opts = args->arg4; + + + vector > parens(args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + + switch (opts.queue_type) { + default: + FSTERROR() << "Unknown queue type: " << opts.queue_type; + case FIFO_QUEUE: { + typedef FifoQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + case LIFO_QUEUE: { + typedef LifoQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + case STATE_ORDER_QUEUE: { + typedef StateOrderQueue Queue; + fst::PdtShortestPathOptions spopts(opts.keep_parentheses, + opts.path_gc); + ShortestPath(fst, parens, ofst, spopts); + return; + } + } +} + +void PdtShortestPath(const FstClass &ifst, + const vector > &parens, + MutableFstClass *ofst, + const PdtShortestPathOptions &opts = + PdtShortestPathOptions()); + +// PRINT INFO + +typedef args::Package > &> PrintPdtInfoArgs; + +template +void PrintPdtInfo(PrintPdtInfoArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + vector > parens( + args->arg2.size()); + for (size_t i = 0; i < parens.size(); ++i) { + parens[i].first = args->arg2[i].first; + parens[i].second = args->arg2[i].second; + } + PdtInfo pdtinfo(fst, parens); + PrintPdtInfo(pdtinfo); +} + +void PrintPdtInfo(const FstClass &ifst, + const vector > &parens); + +} // namespace script +} // namespace fst + + +#define REGISTER_FST_PDT_OPERATIONS(ArcType) \ + REGISTER_FST_OPERATION(PdtCompose, ArcType, PdtComposeArgs); \ + REGISTER_FST_OPERATION(PdtExpand, ArcType, PdtExpandArgs); \ + REGISTER_FST_OPERATION(PdtReplace, ArcType, PdtReplaceArgs); \ + REGISTER_FST_OPERATION(PdtReverse, ArcType, PdtReverseArgs); \ + REGISTER_FST_OPERATION(PdtShortestPath, ArcType, PdtShortestPathArgs); \ + REGISTER_FST_OPERATION(PrintPdtInfo, ArcType, PrintPdtInfoArgs) +#endif // FST_EXTENSIONS_PDT_PDTSCRIPT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/replace.h b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/replace.h new file mode 100755 index 00000000000..a85d0fed029 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/extensions/pdt/replace.h @@ -0,0 +1,192 @@ +// replace.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Recursively replace Fst arcs with other Fst(s) returning a PDT. + +#ifndef FST_EXTENSIONS_PDT_REPLACE_H__ +#define FST_EXTENSIONS_PDT_REPLACE_H__ + +#include + +namespace fst { + +// Hash to paren IDs +template +struct ReplaceParenHash { + size_t operator()(const pair &p) const { + return p.first + p.second * kPrime; + } + private: + static const size_t kPrime = 7853; +}; + +template const size_t ReplaceParenHash::kPrime; + +// Builds a pushdown transducer (PDT) from an RTN specification +// identical to that in fst/lib/replace.h. The result is a PDT +// encoded as the FST 'ofst' where some transitions are labeled with +// open or close parentheses. To be interpreted as a PDT, the parens +// must balance on a path (see PdtExpand()). The open/close +// parenthesis label pairs are returned in 'parens'. +template +void Replace(const vector* > >& ifst_array, + MutableFst *ofst, + vector > *parens, + typename Arc::Label root) { + typedef typename Arc::Label Label; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + ofst->DeleteStates(); + parens->clear(); + + unordered_map label2id; + for (size_t i = 0; i < ifst_array.size(); ++i) + label2id[ifst_array[i].first] = i; + + Label max_label = kNoLabel; + + deque non_term_queue; // Queue of non-terminals to replace + unordered_set { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef F FactorIterator; + + struct Element { + Element() {} + + Element(StateId s, Weight w) : state(s), weight(w) {} + + StateId state; // Input state Id + Weight weight; // Residual weight + }; + + FactorWeightFstImpl(const Fst &fst, const FactorWeightOptions &opts) + : CacheImpl(opts), + fst_(fst.Copy()), + delta_(opts.delta), + mode_(opts.mode), + final_ilabel_(opts.final_ilabel), + final_olabel_(opts.final_olabel) { + SetType("factor_weight"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(FactorWeightProperties(props), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + + if (mode_ == 0) + LOG(WARNING) << "FactorWeightFst: factor mode is set to 0: " + << "factoring neither arc weights nor final weights."; + } + + FactorWeightFstImpl(const FactorWeightFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + delta_(impl.delta_), + mode_(impl.mode_), + final_ilabel_(impl.final_ilabel_), + final_olabel_(impl.final_olabel_) { + SetType("factor_weight"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~FactorWeightFstImpl() { + delete fst_; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + StateId start = FindState(Element(fst_->Start(), Weight::One())); + SetStart(start); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + const Element &e = elements_[s]; + // TODO: fix so cast is unnecessary + Weight w = e.state == kNoStateId + ? e.weight + : (Weight) Times(e.weight, fst_->Final(e.state)); + FactorIterator f(w); + if (!(mode_ & kFactorFinalWeights) || f.Done()) + SetFinal(s, w); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + + // Find state corresponding to an element. Create new state + // if element not found. + StateId FindState(const Element &e) { + if (!(mode_ & kFactorArcWeights) && e.weight == Weight::One()) { + while (unfactored_.size() <= e.state) + unfactored_.push_back(kNoStateId); + if (unfactored_[e.state] == kNoStateId) { + unfactored_[e.state] = elements_.size(); + elements_.push_back(e); + } + return unfactored_[e.state]; + } else { + typename ElementMap::iterator eit = element_map_.find(e); + if (eit != element_map_.end()) { + return (*eit).second; + } else { + StateId s = elements_.size(); + elements_.push_back(e); + element_map_.insert(pair(e, s)); + return s; + } + } + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void Expand(StateId s) { + Element e = elements_[s]; + if (e.state != kNoStateId) { + for (ArcIterator< Fst > ait(*fst_, e.state); + !ait.Done(); + ait.Next()) { + const A &arc = ait.Value(); + Weight w = Times(e.weight, arc.weight); + FactorIterator fit(w); + if (!(mode_ & kFactorArcWeights) || fit.Done()) { + StateId d = FindState(Element(arc.nextstate, Weight::One())); + PushArc(s, Arc(arc.ilabel, arc.olabel, w, d)); + } else { + for (; !fit.Done(); fit.Next()) { + const pair &p = fit.Value(); + StateId d = FindState(Element(arc.nextstate, + p.second.Quantize(delta_))); + PushArc(s, Arc(arc.ilabel, arc.olabel, p.first, d)); + } + } + } + } + + if ((mode_ & kFactorFinalWeights) && + ((e.state == kNoStateId) || + (fst_->Final(e.state) != Weight::Zero()))) { + Weight w = e.state == kNoStateId + ? e.weight + : Times(e.weight, fst_->Final(e.state)); + for (FactorIterator fit(w); + !fit.Done(); + fit.Next()) { + const pair &p = fit.Value(); + StateId d = FindState(Element(kNoStateId, + p.second.Quantize(delta_))); + PushArc(s, Arc(final_ilabel_, final_olabel_, p.first, d)); + } + } + SetArcs(s); + } + + private: + static const size_t kPrime = 7853; + + // Equality function for Elements, assume weights have been quantized. + class ElementEqual { + public: + bool operator()(const Element &x, const Element &y) const { + return x.state == y.state && x.weight == y.weight; + } + }; + + // Hash function for Elements to Fst states. + class ElementKey { + public: + size_t operator()(const Element &x) const { + return static_cast(x.state * kPrime + x.weight.Hash()); + } + private: + }; + + typedef unordered_map ElementMap; + + const Fst *fst_; + float delta_; + uint32 mode_; // factoring arc and/or final weights + Label final_ilabel_; // ilabel of arc created when factoring final w's + Label final_olabel_; // olabel of arc created when factoring final w's + vector elements_; // mapping Fst state to Elements + ElementMap element_map_; // mapping Elements to Fst state + // mapping between old/new 'StateId' for states that do not need to + // be factored when 'mode_' is '0' or 'kFactorFinalWeights' + vector unfactored_; + + void operator=(const FactorWeightFstImpl &); // disallow +}; + +template const size_t FactorWeightFstImpl::kPrime; + + +// FactorWeightFst takes as template parameter a FactorIterator as +// defined above. The result of weight factoring is a transducer +// equivalent to the input whose path weights have been factored +// according to the FactorIterator. States and transitions will be +// added as necessary. The algorithm is a generalization to arbitrary +// weights of the second step of the input epsilon-normalization +// algorithm due to Mohri, "Generic epsilon-removal and input +// epsilon-normalization algorithms for weighted transducers", +// International Journal of Computer Science 13(1): 129-143 (2002). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class FactorWeightFst : public ImplToFst< FactorWeightFstImpl > { + public: + friend class ArcIterator< FactorWeightFst >; + friend class StateIterator< FactorWeightFst >; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef FactorWeightFstImpl Impl; + + FactorWeightFst(const Fst &fst) + : ImplToFst(new Impl(fst, FactorWeightOptions())) {} + + FactorWeightFst(const Fst &fst, const FactorWeightOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + FactorWeightFst(const FactorWeightFst &fst, bool copy) + : ImplToFst(fst, copy) {} + + // Get a copy of this FactorWeightFst. See Fst<>::Copy() for further doc. + virtual FactorWeightFst *Copy(bool copy = false) const { + return new FactorWeightFst(*this, copy); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const FactorWeightFst &fst); // Disallow +}; + + +// Specialization for FactorWeightFst. +template +class StateIterator< FactorWeightFst > + : public CacheStateIterator< FactorWeightFst > { + public: + explicit StateIterator(const FactorWeightFst &fst) + : CacheStateIterator< FactorWeightFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for FactorWeightFst. +template +class ArcIterator< FactorWeightFst > + : public CacheArcIterator< FactorWeightFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const FactorWeightFst &fst, StateId s) + : CacheArcIterator< FactorWeightFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void FactorWeightFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< FactorWeightFst >(*this); +} + + +} // namespace fst + +#endif // FST_LIB_FACTOR_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/factor-weight.h.bak b/extlibs/openfstwin-1.3.1/include/fst/factor-weight.h.bak new file mode 100755 index 00000000000..97440e154b0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/factor-weight.h.bak @@ -0,0 +1,476 @@ +// factor-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Classes to factor weights in an FST. + +#ifndef FST_LIB_FACTOR_WEIGHT_H__ +#define FST_LIB_FACTOR_WEIGHT_H__ + +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include + + +namespace fst { + +const uint32 kFactorFinalWeights = 0x00000001; +const uint32 kFactorArcWeights = 0x00000002; + +template +struct FactorWeightOptions : CacheOptions { + typedef typename Arc::Label Label; + float delta; + uint32 mode; // factor arc weights and/or final weights + Label final_ilabel; // input label of arc created when factoring final w's + Label final_olabel; // output label of arc created when factoring final w's + + FactorWeightOptions(const CacheOptions &opts, float d, + uint32 m = kFactorArcWeights | kFactorFinalWeights, + Label il = 0, Label ol = 0) + : CacheOptions(opts), delta(d), mode(m), final_ilabel(il), + final_olabel(ol) {} + + explicit FactorWeightOptions( + float d, uint32 m = kFactorArcWeights | kFactorFinalWeights, + Label il = 0, Label ol = 0) + : delta(d), mode(m), final_ilabel(il), final_olabel(ol) {} + + FactorWeightOptions(uint32 m = kFactorArcWeights | kFactorFinalWeights, + Label il = 0, Label ol = 0) + : delta(kDelta), mode(m), final_ilabel(il), final_olabel(ol) {} +}; + + +// A factor iterator takes as argument a weight w and returns a +// sequence of pairs of weights (xi,yi) such that the sum of the +// products xi times yi is equal to w. If w is fully factored, +// the iterator should return nothing. +// +// template +// class FactorIterator { +// public: +// FactorIterator(W w); +// bool Done() const; +// void Next(); +// pair Value() const; +// void Reset(); +// } + + +// Factor trivially. +template +class IdentityFactor { + public: + IdentityFactor(const W &w) {} + bool Done() const { return true; } + void Next() {} + pair Value() const { return make_pair(W::One(), W::One()); } // unused + void Reset() {} +}; + + +// Factor a StringWeight w as 'ab' where 'a' is a label. +template +class StringFactor { + public: + StringFactor(const StringWeight &w) + : weight_(w), done_(w.Size() <= 1) {} + + bool Done() const { return done_; } + + void Next() { done_ = true; } + + pair< StringWeight, StringWeight > Value() const { + StringWeightIterator iter(weight_); + StringWeight w1(iter.Value()); + StringWeight w2; + for (iter.Next(); !iter.Done(); iter.Next()) + w2.PushBack(iter.Value()); + return make_pair(w1, w2); + } + + void Reset() { done_ = weight_.Size() <= 1; } + + private: + StringWeight weight_; + bool done_; +}; + + +// Factor a GallicWeight using StringFactor. +template +class GallicFactor { + public: + GallicFactor(const GallicWeight &w) + : weight_(w), done_(w.Value1().Size() <= 1) {} + + bool Done() const { return done_; } + + void Next() { done_ = true; } + + pair< GallicWeight, GallicWeight > Value() const { + StringFactor iter(weight_.Value1()); + GallicWeight w1(iter.Value().first, weight_.Value2()); + GallicWeight w2(iter.Value().second, W::One()); + return make_pair(w1, w2); + } + + void Reset() { done_ = weight_.Value1().Size() <= 1; } + + private: + GallicWeight weight_; + bool done_; +}; + + +// Implementation class for FactorWeight +template +class FactorWeightFstImpl + : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef F FactorIterator; + + struct Element { + Element() {} + + Element(StateId s, Weight w) : state(s), weight(w) {} + + StateId state; // Input state Id + Weight weight; // Residual weight + }; + + FactorWeightFstImpl(const Fst &fst, const FactorWeightOptions &opts) + : CacheImpl(opts), + fst_(fst.Copy()), + delta_(opts.delta), + mode_(opts.mode), + final_ilabel_(opts.final_ilabel), + final_olabel_(opts.final_olabel) { + SetType("factor_weight"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(FactorWeightProperties(props), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + + if (mode_ == 0) + LOG(WARNING) << "FactorWeightFst: factor mode is set to 0: " + << "factoring neither arc weights nor final weights."; + } + + FactorWeightFstImpl(const FactorWeightFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + delta_(impl.delta_), + mode_(impl.mode_), + final_ilabel_(impl.final_ilabel_), + final_olabel_(impl.final_olabel_) { + SetType("factor_weight"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~FactorWeightFstImpl() { + delete fst_; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + StateId start = FindState(Element(fst_->Start(), Weight::One())); + SetStart(start); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + const Element &e = elements_[s]; + // TODO: fix so cast is unnecessary + Weight w = e.state == kNoStateId + ? e.weight + : (Weight) Times(e.weight, fst_->Final(e.state)); + FactorIterator f(w); + if (!(mode_ & kFactorFinalWeights) || f.Done()) + SetFinal(s, w); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + + // Find state corresponding to an element. Create new state + // if element not found. + StateId FindState(const Element &e) { + if (!(mode_ & kFactorArcWeights) && e.weight == Weight::One()) { + while (unfactored_.size() <= e.state) + unfactored_.push_back(kNoStateId); + if (unfactored_[e.state] == kNoStateId) { + unfactored_[e.state] = elements_.size(); + elements_.push_back(e); + } + return unfactored_[e.state]; + } else { + typename ElementMap::iterator eit = element_map_.find(e); + if (eit != element_map_.end()) { + return (*eit).second; + } else { + StateId s = elements_.size(); + elements_.push_back(e); + element_map_.insert(pair(e, s)); + return s; + } + } + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void Expand(StateId s) { + Element e = elements_[s]; + if (e.state != kNoStateId) { + for (ArcIterator< Fst > ait(*fst_, e.state); + !ait.Done(); + ait.Next()) { + const A &arc = ait.Value(); + Weight w = Times(e.weight, arc.weight); + FactorIterator fit(w); + if (!(mode_ & kFactorArcWeights) || fit.Done()) { + StateId d = FindState(Element(arc.nextstate, Weight::One())); + PushArc(s, Arc(arc.ilabel, arc.olabel, w, d)); + } else { + for (; !fit.Done(); fit.Next()) { + const pair &p = fit.Value(); + StateId d = FindState(Element(arc.nextstate, + p.second.Quantize(delta_))); + PushArc(s, Arc(arc.ilabel, arc.olabel, p.first, d)); + } + } + } + } + + if ((mode_ & kFactorFinalWeights) && + ((e.state == kNoStateId) || + (fst_->Final(e.state) != Weight::Zero()))) { + Weight w = e.state == kNoStateId + ? e.weight + : Times(e.weight, fst_->Final(e.state)); + for (FactorIterator fit(w); + !fit.Done(); + fit.Next()) { + const pair &p = fit.Value(); + StateId d = FindState(Element(kNoStateId, + p.second.Quantize(delta_))); + PushArc(s, Arc(final_ilabel_, final_olabel_, p.first, d)); + } + } + SetArcs(s); + } + + private: + static const size_t kPrime = 7853; + + // Equality function for Elements, assume weights have been quantized. + class ElementEqual { + public: + bool operator()(const Element &x, const Element &y) const { + return x.state == y.state && x.weight == y.weight; + } + }; + + // Hash function for Elements to Fst states. + class ElementKey { + public: + size_t operator()(const Element &x) const { + return static_cast(x.state * kPrime + x.weight.Hash()); + } + private: + }; + + typedef unordered_map ElementMap; + + const Fst *fst_; + float delta_; + uint32 mode_; // factoring arc and/or final weights + Label final_ilabel_; // ilabel of arc created when factoring final w's + Label final_olabel_; // olabel of arc created when factoring final w's + vector elements_; // mapping Fst state to Elements + ElementMap element_map_; // mapping Elements to Fst state + // mapping between old/new 'StateId' for states that do not need to + // be factored when 'mode_' is '0' or 'kFactorFinalWeights' + vector unfactored_; + + void operator=(const FactorWeightFstImpl &); // disallow +}; + +template const size_t FactorWeightFstImpl::kPrime; + + +// FactorWeightFst takes as template parameter a FactorIterator as +// defined above. The result of weight factoring is a transducer +// equivalent to the input whose path weights have been factored +// according to the FactorIterator. States and transitions will be +// added as necessary. The algorithm is a generalization to arbitrary +// weights of the second step of the input epsilon-normalization +// algorithm due to Mohri, "Generic epsilon-removal and input +// epsilon-normalization algorithms for weighted transducers", +// International Journal of Computer Science 13(1): 129-143 (2002). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class FactorWeightFst : public ImplToFst< FactorWeightFstImpl > { + public: + friend class ArcIterator< FactorWeightFst >; + friend class StateIterator< FactorWeightFst >; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef FactorWeightFstImpl Impl; + + FactorWeightFst(const Fst &fst) + : ImplToFst(new Impl(fst, FactorWeightOptions())) {} + + FactorWeightFst(const Fst &fst, const FactorWeightOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + FactorWeightFst(const FactorWeightFst &fst, bool copy) + : ImplToFst(fst, copy) {} + + // Get a copy of this FactorWeightFst. See Fst<>::Copy() for further doc. + virtual FactorWeightFst *Copy(bool copy = false) const { + return new FactorWeightFst(*this, copy); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const FactorWeightFst &fst); // Disallow +}; + + +// Specialization for FactorWeightFst. +template +class StateIterator< FactorWeightFst > + : public CacheStateIterator< FactorWeightFst > { + public: + explicit StateIterator(const FactorWeightFst &fst) + : CacheStateIterator< FactorWeightFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for FactorWeightFst. +template +class ArcIterator< FactorWeightFst > + : public CacheArcIterator< FactorWeightFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const FactorWeightFst &fst, StateId s) + : CacheArcIterator< FactorWeightFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void FactorWeightFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< FactorWeightFst >(*this); +} + + +} // namespace fst + +#endif // FST_LIB_FACTOR_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/flags.h b/extlibs/openfstwin-1.3.1/include/fst/flags.h new file mode 100755 index 00000000000..31548d44803 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/flags.h @@ -0,0 +1,242 @@ +// flags.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Google-style flag handling declarations and inline definitions. + +#ifndef FST_LIB_FLAGS_H__ +#define FST_LIB_FLAGS_H__ + +#include +#include +#include + +#include +#include + +using std::string; +#ifdef _MSC_VER //Added Paul Dixon 04/09/10 + #define strtoll _strtoi64 + #define atoll atol + //#ifndef I_AM_A_DLL + //#define EXPORT __declspec(dllexport) + //#define IMPORT __declspec(dllimport) + //#else + //#define EXPORT __declspec(dllimport) + //#define IMPORT __declspec(dllexport) + //#endif + #ifdef OPENFSTEXPORT + #define OPENFSTDLL __declspec(dllexport) + #else + #define OPENFSTDLL __declspec(dllimport) + #endif +#else + #define OPENFSTDLL +#endif +// +// FLAGS USAGE: +// +// Definition example: +// +// DEFINE_int32(length, 0, "length"); +// +// This defines variable FLAGS_length, initialized to 0. +// +// Declaration example: +// +// DECLARE_int32(length); +// +// SetFlags() can be used to set flags from the command line +// using, for example, '--length=2'. +// +// ShowUsage() can be used to print out command and flag usage. +// + +#define DECLARE_bool(name) OPENFSTDLL extern bool FLAGS_ ## name +#define DECLARE_string(name) OPENFSTDLL extern string FLAGS_ ## name +#define DECLARE_int32(name) OPENFSTDLL extern int32 FLAGS_ ## name +#define DECLARE_int64(name) OPENFSTDLL extern int64 FLAGS_ ## name +#define DECLARE_double(name) OPENFSTDLL extern double FLAGS_ ## name + +template +struct FlagDescription { + FlagDescription(T *addr, const char *doc, const char *type, const T val) + : address(addr), doc_string(doc), type_name(type), default_value(val) {} + + T *address; + const char *doc_string; + const char *type_name; + const T default_value; +}; + +template +class FlagRegister { + public: + static FlagRegister *GetRegister() { + fst::FstOnceInit(®ister_init_, &FlagRegister::Init); + return register_; + } + + const FlagDescription &GetFlagDescription(const string &name) const { + fst::MutexLock l(register_lock_); + typename std::map< string, FlagDescription >::const_iterator it = + flag_table_.find(name); + return it != flag_table_.end() ? it->second : 0; + } + void SetDescription(const string &name, + const FlagDescription &desc) { + fst::MutexLock l(register_lock_); + flag_table_.insert(make_pair(name, desc)); + } + + bool SetFlag(const string &val, bool *address) const { + if (val == "true" || val == "1" || val.empty()) { + *address = true; + return true; + } else if (val == "false" || val == "0") { + *address = false; + return true; + } + else { + return false; + } + } + bool SetFlag(const string &val, string *address) const { + *address = val; + return true; + } + bool SetFlag(const string &val, int32 *address) const { + char *p = 0; + *address = strtol(val.c_str(), &p, 0); + return !val.empty() && *p == '\0'; + } + bool SetFlag(const string &val, int64 *address) const { + char *p = 0; + *address = strtoll(val.c_str(), &p, 0); + return !val.empty() && *p == '\0'; + } + bool SetFlag(const string &val, double *address) const { + char *p = 0; + *address = strtod(val.c_str(), &p); + return !val.empty() && *p == '\0'; + } + + bool SetFlag(const string &arg, const string &val) const { + for (typename std::map< string, + FlagDescription >::const_iterator it = + flag_table_.begin(); + it != flag_table_.end(); + ++it) { + const string &name = it->first; + const FlagDescription &desc = it->second; + if (arg == name) + return SetFlag(val, desc.address); + } + return false; + } + + void ShowDefault(bool default_value) const { + std::cout << ", default = "; + std::cout << (default_value ? "true" : "false"); + } + void ShowDefault(const string &default_value) const { + std::cout << ", default = "; + std::cout << "\"" << default_value << "\""; + } + template void ShowDefault(const V& default_value) const { + std::cout << ", default = "; + std::cout << default_value; + } + void ShowUsage() const { + for (typename std::map< string, + FlagDescription >::const_iterator it = + flag_table_.begin(); + it != flag_table_.end(); + ++it) { + const string &name = it->first; + const FlagDescription &desc = it->second; + std::cout << " --" << name + << ": type = " << desc.type_name; + ShowDefault(desc.default_value); + std::cout << "\n " << desc.doc_string << "\n"; + } + } + + private: + static void Init() { + register_lock_ = new fst::Mutex; + register_ = new FlagRegister; + } + OPENFSTDLL static fst::FstOnceType register_init_; // ensures only called once //ChangedPD + OPENFSTDLL static fst::Mutex* register_lock_; // multithreading lock //ChangedPD + OPENFSTDLL static FlagRegister *register_; //ChangedPD + + std::map< string, FlagDescription > flag_table_; +}; + +#ifdef OPENFSTEXPORT //AddedPD +template +fst::FstOnceType FlagRegister::register_init_ = fst::FST_ONCE_INIT; + +template +fst::Mutex *FlagRegister::register_lock_ = 0; + +template +FlagRegister *FlagRegister::register_ = 0; +#endif + +template +class FlagRegisterer { + public: + FlagRegisterer(const string &name, const FlagDescription &desc) { + FlagRegister *registr = FlagRegister::GetRegister(); + registr->SetDescription(name, desc); + } + + private: + DISALLOW_COPY_AND_ASSIGN(FlagRegisterer); +}; + + +#define DEFINE_VAR(type, name, value, doc) \ + type FLAGS_ ## name = value; \ + static FlagRegisterer \ + name ## _flags_registerer(#name, FlagDescription(&FLAGS_ ## name, \ + doc, \ + #type, \ + value)) + +#define DEFINE_bool(name, value, doc) DEFINE_VAR(bool, name, value, doc) +#define DEFINE_string(name, value, doc) \ + DEFINE_VAR(string, name, value, doc) +#define DEFINE_int32(name, value, doc) DEFINE_VAR(int32, name, value, doc) +#define DEFINE_int64(name, value, doc) DEFINE_VAR(int64, name, value, doc) +#define DEFINE_double(name, value, doc) DEFINE_VAR(double, name, value, doc) + + +// Temporary directory +DECLARE_string(tmpdir); + +void OPENFSTDLL SetFlags(const char *usage, int *argc, char ***argv, bool remove_flags); //ChangedPD + +// Deprecated - for backward compatibility +inline void InitFst(const char *usage, int *argc, char ***argv, bool rmflags) { + return SetFlags(usage, argc, argv, rmflags); +} + +void OPENFSTDLL ShowUsage(); //ChangedPD + +#endif // FST_LIB_FLAGS_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/flags.h.bak b/extlibs/openfstwin-1.3.1/include/fst/flags.h.bak new file mode 100755 index 00000000000..ec3d3015336 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/flags.h.bak @@ -0,0 +1,224 @@ +// flags.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Google-style flag handling declarations and inline definitions. + +#ifndef FST_LIB_FLAGS_H__ +#define FST_LIB_FLAGS_H__ + +#include +#include +#include + +#include +#include + +using std::string; + +// +// FLAGS USAGE: +// +// Definition example: +// +// DEFINE_int32(length, 0, "length"); +// +// This defines variable FLAGS_length, initialized to 0. +// +// Declaration example: +// +// DECLARE_int32(length); +// +// SetFlags() can be used to set flags from the command line +// using, for example, '--length=2'. +// +// ShowUsage() can be used to print out command and flag usage. +// + +#define DECLARE_bool(name) extern bool FLAGS_ ## name +#define DECLARE_string(name) extern string FLAGS_ ## name +#define DECLARE_int32(name) extern int32 FLAGS_ ## name +#define DECLARE_int64(name) extern int64 FLAGS_ ## name +#define DECLARE_double(name) extern double FLAGS_ ## name + +template +struct FlagDescription { + FlagDescription(T *addr, const char *doc, const char *type, const T val) + : address(addr), doc_string(doc), type_name(type), default_value(val) {} + + T *address; + const char *doc_string; + const char *type_name; + const T default_value; +}; + +template +class FlagRegister { + public: + static FlagRegister *GetRegister() { + fst::FstOnceInit(®ister_init_, &FlagRegister::Init); + return register_; + } + + const FlagDescription &GetFlagDescription(const string &name) const { + fst::MutexLock l(register_lock_); + typename std::map< string, FlagDescription >::const_iterator it = + flag_table_.find(name); + return it != flag_table_.end() ? it->second : 0; + } + void SetDescription(const string &name, + const FlagDescription &desc) { + fst::MutexLock l(register_lock_); + flag_table_.insert(make_pair(name, desc)); + } + + bool SetFlag(const string &val, bool *address) const { + if (val == "true" || val == "1" || val.empty()) { + *address = true; + return true; + } else if (val == "false" || val == "0") { + *address = false; + return true; + } + else { + return false; + } + } + bool SetFlag(const string &val, string *address) const { + *address = val; + return true; + } + bool SetFlag(const string &val, int32 *address) const { + char *p = 0; + *address = strtol(val.c_str(), &p, 0); + return !val.empty() && *p == '\0'; + } + bool SetFlag(const string &val, int64 *address) const { + char *p = 0; + *address = strtoll(val.c_str(), &p, 0); + return !val.empty() && *p == '\0'; + } + bool SetFlag(const string &val, double *address) const { + char *p = 0; + *address = strtod(val.c_str(), &p); + return !val.empty() && *p == '\0'; + } + + bool SetFlag(const string &arg, const string &val) const { + for (typename std::map< string, + FlagDescription >::const_iterator it = + flag_table_.begin(); + it != flag_table_.end(); + ++it) { + const string &name = it->first; + const FlagDescription &desc = it->second; + if (arg == name) + return SetFlag(val, desc.address); + } + return false; + } + + void ShowDefault(bool default_value) const { + std::cout << ", default = "; + std::cout << (default_value ? "true" : "false"); + } + void ShowDefault(const string &default_value) const { + std::cout << ", default = "; + std::cout << "\"" << default_value << "\""; + } + template void ShowDefault(const V& default_value) const { + std::cout << ", default = "; + std::cout << default_value; + } + void ShowUsage() const { + for (typename std::map< string, + FlagDescription >::const_iterator it = + flag_table_.begin(); + it != flag_table_.end(); + ++it) { + const string &name = it->first; + const FlagDescription &desc = it->second; + std::cout << " --" << name + << ": type = " << desc.type_name; + ShowDefault(desc.default_value); + std::cout << "\n " << desc.doc_string << "\n"; + } + } + + private: + static void Init() { + register_lock_ = new fst::Mutex; + register_ = new FlagRegister; + } + static fst::FstOnceType register_init_; // ensures only called once + static fst::Mutex* register_lock_; // multithreading lock + static FlagRegister *register_; + + std::map< string, FlagDescription > flag_table_; +}; + +template +fst::FstOnceType FlagRegister::register_init_ = fst::FST_ONCE_INIT; + +template +fst::Mutex *FlagRegister::register_lock_ = 0; + +template +FlagRegister *FlagRegister::register_ = 0; + + +template +class FlagRegisterer { + public: + FlagRegisterer(const string &name, const FlagDescription &desc) { + FlagRegister *registr = FlagRegister::GetRegister(); + registr->SetDescription(name, desc); + } + + private: + DISALLOW_COPY_AND_ASSIGN(FlagRegisterer); +}; + + +#define DEFINE_VAR(type, name, value, doc) \ + type FLAGS_ ## name = value; \ + static FlagRegisterer \ + name ## _flags_registerer(#name, FlagDescription(&FLAGS_ ## name, \ + doc, \ + #type, \ + value)) + +#define DEFINE_bool(name, value, doc) DEFINE_VAR(bool, name, value, doc) +#define DEFINE_string(name, value, doc) \ + DEFINE_VAR(string, name, value, doc) +#define DEFINE_int32(name, value, doc) DEFINE_VAR(int32, name, value, doc) +#define DEFINE_int64(name, value, doc) DEFINE_VAR(int64, name, value, doc) +#define DEFINE_double(name, value, doc) DEFINE_VAR(double, name, value, doc) + + +// Temporary directory +DECLARE_string(tmpdir); + +void SetFlags(const char *usage, int *argc, char ***argv, bool remove_flags); + +// Deprecated - for backward compatibility +inline void InitFst(const char *usage, int *argc, char ***argv, bool rmflags) { + return SetFlags(usage, argc, argv, rmflags); +} + +void ShowUsage(); + +#endif // FST_LIB_FLAGS_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/float-weight.h b/extlibs/openfstwin-1.3.1/include/fst/float-weight.h new file mode 100755 index 00000000000..530cbdd01c8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/float-weight.h @@ -0,0 +1,598 @@ +// float-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Float weight set and associated semiring operation definitions. +// + +#ifndef FST_LIB_FLOAT_WEIGHT_H__ +#define FST_LIB_FLOAT_WEIGHT_H__ + +#include +#include +#include +#include + +#include +#include + + +namespace fst { + +// numeric limits class +template +class FloatLimits { + public: + static const T kPosInfinity; + static const T kNegInfinity; + static const T kNumberBad; +}; + +template +const T FloatLimits::kPosInfinity = numeric_limits::infinity(); + +template +const T FloatLimits::kNegInfinity = -FloatLimits::kPosInfinity; + +template +const T FloatLimits::kNumberBad = numeric_limits::quiet_NaN(); + +// weight class to be templated on floating-points types +template +class FloatWeightTpl { + public: + FloatWeightTpl() {} + + FloatWeightTpl(T f) : value_(f) {} + + FloatWeightTpl(const FloatWeightTpl &w) : value_(w.value_) {} + + FloatWeightTpl &operator=(const FloatWeightTpl &w) { + value_ = w.value_; + return *this; + } + + istream &Read(istream &strm) { + return ReadType(strm, &value_); + } + + ostream &Write(ostream &strm) const { + return WriteType(strm, value_); + } + + size_t Hash() const { + union { + T f; + size_t s; + } u; + u.s = 0; + u.f = value_; + return u.s; + } + + const T &Value() const { return value_; } + + protected: + void SetValue(const T &f) { value_ = f; } + + inline static string GetPrecisionString() { + int64 size = sizeof(T); + if (size == sizeof(float)) return ""; + size *= CHAR_BIT; + + string result; + Int64ToStr(size, &result); + return result; + } + + private: + T value_; +}; + +// Single-precision float weight +typedef FloatWeightTpl FloatWeight; + +template +inline bool operator==(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + // Volatile qualifier thwarts over-aggressive compiler optimizations + // that lead to problems esp. with NaturalLess(). + volatile T v1 = w1.Value(); + volatile T v2 = w2.Value(); + return v1 == v2; +} + +inline bool operator==(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + return operator==(w1, w2); +} + +inline bool operator==(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + return operator==(w1, w2); +} + +template +inline bool operator!=(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + return !(w1 == w2); +} + +inline bool operator!=(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + return operator!=(w1, w2); +} + +inline bool operator!=(const FloatWeightTpl &w1, + const FloatWeightTpl &w2) { + return operator!=(w1, w2); +} + +template +inline bool ApproxEqual(const FloatWeightTpl &w1, + const FloatWeightTpl &w2, + float delta = kDelta) { + return w1.Value() <= w2.Value() + delta && w2.Value() <= w1.Value() + delta; +} + +template +inline ostream &operator<<(ostream &strm, const FloatWeightTpl &w) { + if (w.Value() == FloatLimits::kPosInfinity) + return strm << "Infinity"; + else if (w.Value() == FloatLimits::kNegInfinity) + return strm << "-Infinity"; + else if (w.Value() != w.Value()) // Fails for NaN + return strm << "BadNumber"; + else + return strm << w.Value(); +} + +template +inline istream &operator>>(istream &strm, FloatWeightTpl &w) { + string s; + strm >> s; + if (s == "Infinity") { + w = FloatWeightTpl(FloatLimits::kPosInfinity); + } else if (s == "-Infinity") { + w = FloatWeightTpl(FloatLimits::kNegInfinity); + } else { + char *p; + T f = strtod(s.c_str(), &p); + if (p < s.c_str() + s.size()) + strm.clear(std::ios::badbit); + else + w = FloatWeightTpl(f); + } + return strm; +} + + +// Tropical semiring: (min, +, inf, 0) +template +class TropicalWeightTpl : public FloatWeightTpl { + public: + using FloatWeightTpl::Value; + + typedef TropicalWeightTpl ReverseWeight; + + TropicalWeightTpl() : FloatWeightTpl() {} + + TropicalWeightTpl(T f) : FloatWeightTpl(f) {} + + TropicalWeightTpl(const TropicalWeightTpl &w) : FloatWeightTpl(w) {} + + static const TropicalWeightTpl Zero() { + return TropicalWeightTpl(FloatLimits::kPosInfinity); } + + static const TropicalWeightTpl One() { + return TropicalWeightTpl(0.0F); } + + static const TropicalWeightTpl NoWeight() { + return TropicalWeightTpl(FloatLimits::kNumberBad); } + + static const string &Type() { + static const string type = "tropical" + + FloatWeightTpl::GetPrecisionString(); + return type; + } + + bool Member() const { + // First part fails for IEEE NaN + return Value() == Value() && Value() != FloatLimits::kNegInfinity; + } + + TropicalWeightTpl Quantize(float delta = kDelta) const { + if (Value() == FloatLimits::kNegInfinity || + Value() == FloatLimits::kPosInfinity || + Value() != Value()) + return *this; + else + return TropicalWeightTpl(floor(Value()/delta + 0.5F) * delta); + } + + TropicalWeightTpl Reverse() const { return *this; } + + static uint64 Properties() { + return kLeftSemiring | kRightSemiring | kCommutative | + kPath | kIdempotent; + } +}; + +// Single precision tropical weight +typedef TropicalWeightTpl TropicalWeight; + +template +inline TropicalWeightTpl Plus(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return TropicalWeightTpl::NoWeight(); + return w1.Value() < w2.Value() ? w1 : w2; +} + +inline TropicalWeightTpl Plus(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + return Plus(w1, w2); +} + +inline TropicalWeightTpl Plus(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + return Plus(w1, w2); +} + +template +inline TropicalWeightTpl Times(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return TropicalWeightTpl::NoWeight(); + T f1 = w1.Value(), f2 = w2.Value(); + if (f1 == FloatLimits::kPosInfinity) + return w1; + else if (f2 == FloatLimits::kPosInfinity) + return w2; + else + return TropicalWeightTpl(f1 + f2); +} + +inline TropicalWeightTpl Times(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + return Times(w1, w2); +} + +inline TropicalWeightTpl Times(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2) { + return Times(w1, w2); +} + +template +inline TropicalWeightTpl Divide(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + if (!w1.Member() || !w2.Member()) + return TropicalWeightTpl::NoWeight(); + T f1 = w1.Value(), f2 = w2.Value(); + if (f2 == FloatLimits::kPosInfinity) + return FloatLimits::kNumberBad; + else if (f1 == FloatLimits::kPosInfinity) + return FloatLimits::kPosInfinity; + else + return TropicalWeightTpl(f1 - f2); +} + +inline TropicalWeightTpl Divide(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + +inline TropicalWeightTpl Divide(const TropicalWeightTpl &w1, + const TropicalWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + + +// Log semiring: (log(e^-x + e^y), +, inf, 0) +template +class LogWeightTpl : public FloatWeightTpl { + public: + using FloatWeightTpl::Value; + + typedef LogWeightTpl ReverseWeight; + + LogWeightTpl() : FloatWeightTpl() {} + + LogWeightTpl(T f) : FloatWeightTpl(f) {} + + LogWeightTpl(const LogWeightTpl &w) : FloatWeightTpl(w) {} + + static const LogWeightTpl Zero() { + return LogWeightTpl(FloatLimits::kPosInfinity); + } + + static const LogWeightTpl One() { + return LogWeightTpl(0.0F); + } + + static const LogWeightTpl NoWeight() { + return LogWeightTpl(FloatLimits::kNumberBad); } + + static const string &Type() { + static const string type = "log" + FloatWeightTpl::GetPrecisionString(); + return type; + } + + bool Member() const { + // First part fails for IEEE NaN + return Value() == Value() && Value() != FloatLimits::kNegInfinity; + } + + LogWeightTpl Quantize(float delta = kDelta) const { + if (Value() == FloatLimits::kNegInfinity || + Value() == FloatLimits::kPosInfinity || + Value() != Value()) + return *this; + else + return LogWeightTpl(floor(Value()/delta + 0.5F) * delta); + } + + LogWeightTpl Reverse() const { return *this; } + + static uint64 Properties() { + return kLeftSemiring | kRightSemiring | kCommutative; + } +}; + +// Single-precision log weight +typedef LogWeightTpl LogWeight; +// Double-precision log weight +typedef LogWeightTpl Log64Weight; + +template +inline T LogExp(T x) { return log(1.0F + exp(-x)); } + +template +inline LogWeightTpl Plus(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + T f1 = w1.Value(), f2 = w2.Value(); + if (f1 == FloatLimits::kPosInfinity) + return w2; + else if (f2 == FloatLimits::kPosInfinity) + return w1; + else if (f1 > f2) + return LogWeightTpl(f2 - LogExp(f1 - f2)); + else + return LogWeightTpl(f1 - LogExp(f2 - f1)); +} + +inline LogWeightTpl Plus(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + return Plus(w1, w2); +} + +inline LogWeightTpl Plus(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + return Plus(w1, w2); +} + +template +inline LogWeightTpl Times(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return LogWeightTpl::NoWeight(); + T f1 = w1.Value(), f2 = w2.Value(); + if (f1 == FloatLimits::kPosInfinity) + return w1; + else if (f2 == FloatLimits::kPosInfinity) + return w2; + else + return LogWeightTpl(f1 + f2); +} + +inline LogWeightTpl Times(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + return Times(w1, w2); +} + +inline LogWeightTpl Times(const LogWeightTpl &w1, + const LogWeightTpl &w2) { + return Times(w1, w2); +} + +template +inline LogWeightTpl Divide(const LogWeightTpl &w1, + const LogWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + if (!w1.Member() || !w2.Member()) + return LogWeightTpl::NoWeight(); + T f1 = w1.Value(), f2 = w2.Value(); + if (f2 == FloatLimits::kPosInfinity) + return FloatLimits::kNumberBad; + else if (f1 == FloatLimits::kPosInfinity) + return FloatLimits::kPosInfinity; + else + return LogWeightTpl(f1 - f2); +} + +inline LogWeightTpl Divide(const LogWeightTpl &w1, + const LogWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + +inline LogWeightTpl Divide(const LogWeightTpl &w1, + const LogWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + +// MinMax semiring: (min, max, inf, -inf) +template +class MinMaxWeightTpl : public FloatWeightTpl { + public: + using FloatWeightTpl::Value; + + typedef MinMaxWeightTpl ReverseWeight; + + MinMaxWeightTpl() : FloatWeightTpl() {} + + MinMaxWeightTpl(T f) : FloatWeightTpl(f) {} + + MinMaxWeightTpl(const MinMaxWeightTpl &w) : FloatWeightTpl(w) {} + + static const MinMaxWeightTpl Zero() { + return MinMaxWeightTpl(FloatLimits::kPosInfinity); + } + + static const MinMaxWeightTpl One() { + return MinMaxWeightTpl(FloatLimits::kNegInfinity); + } + + static const MinMaxWeightTpl NoWeight() { + return MinMaxWeightTpl(FloatLimits::kNumberBad); } + + static const string &Type() { + static const string type = "minmax" + + FloatWeightTpl::GetPrecisionString(); + return type; + } + + bool Member() const { + // Fails for IEEE NaN + return Value() == Value(); + } + + MinMaxWeightTpl Quantize(float delta = kDelta) const { + // If one of infinities, or a NaN + if (Value() == FloatLimits::kNegInfinity || + Value() == FloatLimits::kPosInfinity || + Value() != Value()) + return *this; + else + return MinMaxWeightTpl(floor(Value()/delta + 0.5F) * delta); + } + + MinMaxWeightTpl Reverse() const { return *this; } + + static uint64 Properties() { + return kLeftSemiring | kRightSemiring | kCommutative | kIdempotent | kPath; + } +}; + +// Single-precision min-max weight +typedef MinMaxWeightTpl MinMaxWeight; + +// Min +template +inline MinMaxWeightTpl Plus( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return MinMaxWeightTpl::NoWeight(); + return w1.Value() < w2.Value() ? w1 : w2; +} + +inline MinMaxWeightTpl Plus( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + return Plus(w1, w2); +} + +inline MinMaxWeightTpl Plus( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + return Plus(w1, w2); +} + +// Max +template +inline MinMaxWeightTpl Times( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return MinMaxWeightTpl::NoWeight(); + return w1.Value() >= w2.Value() ? w1 : w2; +} + +inline MinMaxWeightTpl Times( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + return Times(w1, w2); +} + +inline MinMaxWeightTpl Times( + const MinMaxWeightTpl &w1, const MinMaxWeightTpl &w2) { + return Times(w1, w2); +} + +// Defined only for special cases +template +inline MinMaxWeightTpl Divide(const MinMaxWeightTpl &w1, + const MinMaxWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + if (!w1.Member() || !w2.Member()) + return MinMaxWeightTpl::NoWeight(); + // min(w1, x) = w2, w1 >= w2 => min(w1, x) = w2, x = w2 + return w1.Value() >= w2.Value() ? w1 : FloatLimits::kNumberBad; +} + +inline MinMaxWeightTpl Divide(const MinMaxWeightTpl &w1, + const MinMaxWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + +inline MinMaxWeightTpl Divide(const MinMaxWeightTpl &w1, + const MinMaxWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + return Divide(w1, w2, typ); +} + +// +// WEIGHT CONVERTER SPECIALIZATIONS. +// + +// Convert to tropical +template <> +struct WeightConvert { + TropicalWeight operator()(LogWeight w) const { return w.Value(); } +}; + +template <> +struct WeightConvert { + TropicalWeight operator()(Log64Weight w) const { return w.Value(); } +}; + +// Convert to log +template <> +struct WeightConvert { + LogWeight operator()(TropicalWeight w) const { return w.Value(); } +}; + +template <> +struct WeightConvert { + LogWeight operator()(Log64Weight w) const { return w.Value(); } +}; + +// Convert to log64 +template <> +struct WeightConvert { + Log64Weight operator()(TropicalWeight w) const { return w.Value(); } +}; + +template <> +struct WeightConvert { + Log64Weight operator()(LogWeight w) const { return w.Value(); } +}; + +} // namespace fst + +#endif // FST_LIB_FLOAT_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/fst-decl.h b/extlibs/openfstwin-1.3.1/include/fst/fst-decl.h new file mode 100755 index 00000000000..0e2cdf1974d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/fst-decl.h @@ -0,0 +1,125 @@ +// fst-decl.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// This file contains declarations of classes in the Fst template library. +// + +#ifndef FST_LIB_FST_DECL_H__ +#define FST_LIB_FST_DECL_H__ + +#include + +namespace fst { + +class SymbolTable; +class SymbolTableIterator; + +template class FloatWeightTpl; +template class TropicalWeightTpl; +template class LogWeightTpl; +template class MinMaxWeightTpl; + +typedef FloatWeightTpl FloatWeight; +typedef TropicalWeightTpl TropicalWeight; +typedef LogWeightTpl LogWeight; +typedef MinMaxWeightTpl MinMaxWeight; + +template class ArcTpl; +typedef ArcTpl StdArc; +typedef ArcTpl LogArc; + +template class CompactFst; +template class ConstFst; +template class EditFst; +template class ExpandedFst; +template class Fst; +template class MutableFst; +template class VectorFst; + +template class ArcSortFst; +template class ClosureFst; +template class ComposeFst; +template class ConcatFst; +template class DeterminizeFst; +template class DeterminizeFst; +template class DifferenceFst; +template class IntersectFst; +template class InvertFst; +template class ArcMapFst; +template class ProjectFst; +template class RandGenFst; +template class RelabelFst; +template class ReplaceFst; +template class RmEpsilonFst; +template class UnionFst; + +template class Heap; + +template class AcceptorCompactor; +template class StringCompactor; +template class UnweightedAcceptorCompactor; +template class UnweightedCompactor; +template class WeightedStringCompactor; + +template class DefaultReplaceStateTable; + +typedef CompactFst > +StdCompactAcceptorFst; +typedef CompactFst< StdArc, StringCompactor > +StdCompactStringFst; +typedef CompactFst > +StdCompactUnweightedAcceptorFst; +typedef CompactFst > +StdCompactUnweightedFst; +typedef CompactFst< StdArc, WeightedStringCompactor > +StdCompactWeightedStringFst; +typedef ConstFst StdConstFst; +typedef ExpandedFst StdExpandedFst; +typedef Fst StdFst; +typedef MutableFst StdMutableFst; +typedef VectorFst StdVectorFst; + + +template class StdArcSortFst; +typedef ClosureFst StdClosureFst; +typedef ComposeFst StdComposeFst; +typedef ConcatFst StdConcatFst; +typedef DeterminizeFst StdDeterminizeFst; +typedef DifferenceFst StdDifferenceFst; +typedef IntersectFst StdIntersectFst; +typedef InvertFst StdInvertFst; +typedef ProjectFst StdProjectFst; +typedef RelabelFst StdRelabelFst; +typedef ReplaceFst > +StdReplaceFst; +typedef RmEpsilonFst StdRmEpsilonFst; +typedef UnionFst StdUnionFst; + +template class IntegerFilterState; +typedef IntegerFilterState CharFilterState; +typedef IntegerFilterState ShortFilterState; +typedef IntegerFilterState IntFilterState; + +template class Matcher; +template class SequenceComposeFilter; +template class AltSequenceComposeFilter; +template class MatchComposeFilter; + +} // namespace fst + +#endif // FST_LIB_FST_DECL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/fst.h b/extlibs/openfstwin-1.3.1/include/fst/fst.h new file mode 100755 index 00000000000..dc3fcecf8a9 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/fst.h @@ -0,0 +1,943 @@ +// fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Finite-State Transducer (FST) - abstract base class definition, +// state and arc iterator interface, and suggested base implementation. +// + +#ifndef FST_LIB_FST_H__ +#define FST_LIB_FST_H__ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +DECLARE_bool(fst_align); + +namespace fst { + +bool OPENFSTDLL IsFstHeader(istream &, const string &); //ChangedPD + +class FstHeader; +template class StateIteratorData; +template class ArcIteratorData; +template class MatcherBase; + +struct FstReadOptions { + string source; // Where you're reading from + const FstHeader *header; // Pointer to Fst header. If non-zero, use + // this info (don't read a stream header) + const SymbolTable* isymbols; // Pointer to input symbols. If non-zero, use + // this info (read and skip stream isymbols) + const SymbolTable* osymbols; // Pointer to output symbols. If non-zero, use + // this info (read and skip stream osymbols) + + explicit FstReadOptions(const string& src = "", + const FstHeader *hdr = 0, + const SymbolTable* isym = 0, + const SymbolTable* osym = 0) + : source(src), header(hdr), isymbols(isym), osymbols(osym) {} + + explicit FstReadOptions(const string& src, + const SymbolTable* isym, + const SymbolTable* osym = 0) + : source(src), header(0), isymbols(isym), osymbols(osym) {} +}; + + +struct FstWriteOptions { + string source; // Where you're writing to + bool write_header; // Write the header? + bool write_isymbols; // Write input symbols? + bool write_osymbols; // Write output symbols? + bool align; // Write data aligned where appropriate; + // this may fail on pipes + + explicit FstWriteOptions(const string& src = "", + bool hdr = true, bool isym = true, + bool osym = true, bool alig = FLAGS_fst_align) + : source(src), write_header(hdr), + write_isymbols(isym), write_osymbols(osym), align(alig) {} +}; + +// +// Fst HEADER CLASS +// +// This is the recommended Fst file header representation. +// +class FstHeader { + public: + enum { + HAS_ISYMBOLS = 0x1, // Has input symbol table + HAS_OSYMBOLS = 0x2, // Has output symbol table + IS_ALIGNED = 0x4, // Memory-aligned (where appropriate) + } Flags; + + FstHeader() : version_(0), flags_(0), properties_(0), start_(-1), + numstates_(0), numarcs_(0) {} + const string &FstType() const { return fsttype_; } + const string &ArcType() const { return arctype_; } + int32 Version() const { return version_; } + int32 GetFlags() const { return flags_; } + uint64 Properties() const { return properties_; } + int64 Start() const { return start_; } + int64 NumStates() const { return numstates_; } + int64 NumArcs() const { return numarcs_; } + + void SetFstType(const string& type) { fsttype_ = type; } + void SetArcType(const string& type) { arctype_ = type; } + void SetVersion(int32 version) { version_ = version; } + void SetFlags(int32 flags) { flags_ = flags; } + void SetProperties(uint64 properties) { properties_ = properties; } + void SetStart(int64 start) { start_ = start; } + void SetNumStates(int64 numstates) { numstates_ = numstates; } + void SetNumArcs(int64 numarcs) { numarcs_ = numarcs; } + + bool OPENFSTDLL Read(istream &strm, const string &source, bool rewind = false); //ChangedPD + bool OPENFSTDLL Write(ostream &strm, const string &source) const; //ChangedPD + + private: + + string fsttype_; // E.g. "vector" + string arctype_; // E.g. "standard" + int32 version_; // Type version # + int32 flags_; // File format bits + uint64 properties_; // FST property bits + int64 start_; // Start state + int64 numstates_; // # of states + int64 numarcs_; // # of arcs +}; + + +// Specifies matcher action. +enum MatchType { MATCH_INPUT, // Match input label. + MATCH_OUTPUT, // Match output label. + MATCH_BOTH, // Match input or output label. + MATCH_NONE, // Match nothing. + MATCH_UNKNOWN }; // Match type unknown. + +// +// Fst INTERFACE CLASS DEFINITION +// + +// A generic FST, templated on the arc definition, with +// common-demoninator methods (use StateIterator and ArcIterator to +// iterate over its states and arcs). +template +class Fst { + public: + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + virtual ~Fst() {} + + virtual StateId Start() const = 0; // Initial state + + virtual Weight Final(StateId) const = 0; // State's final weight + + virtual size_t NumArcs(StateId) const = 0; // State's arc count + + virtual size_t NumInputEpsilons(StateId) + const = 0; // State's input epsilon count + + virtual size_t NumOutputEpsilons(StateId) + const = 0; // State's output epsilon count + + // If test=false, return stored properties bits for mask (some poss. unknown) + // If test=true, return property bits for mask (computing o.w. unknown) + virtual uint64 Properties(uint64 mask, bool test) + const = 0; // Property bits + + virtual const string& Type() const = 0; // Fst type name + + // Get a copy of this Fst. The copying behaves as follows: + // + // (1) The copying is constant time if safe = false or if safe = true + // and is on an otherwise unaccessed Fst. + // + // (2) If safe = true, the copy is thread-safe in that the original + // and copy can be safely accessed (but not necessarily mutated) by + // separate threads. For some Fst types, 'Copy(true)' should only be + // called on an Fst that has not otherwise been accessed. Its behavior + // is undefined otherwise. + // + // (3) If a MutableFst is copied and then mutated, then the original is + // unmodified and vice versa (often by a copy-on-write on the initial + // mutation, which may not be constant time). + virtual Fst *Copy(bool safe = false) const = 0; + + // Read an Fst from an input stream; returns NULL on error + static Fst *Read(istream &strm, const FstReadOptions &opts) { + FstReadOptions ropts(opts); + FstHeader hdr; + if (ropts.header) + hdr = *opts.header; + else { + if (!hdr.Read(strm, opts.source)) + return 0; + ropts.header = &hdr; + } + FstRegister *registr = FstRegister::GetRegister(); + const typename FstRegister::Reader reader = + registr->GetReader(hdr.FstType()); + if (!reader) { + LOG(ERROR) << "Fst::Read: Unknown FST type \"" << hdr.FstType() + << "\" (arc type = \"" << A::Type() + << "\"): " << ropts.source; + return 0; + } + return reader(strm, ropts); + }; + + // Read an Fst from a file; return NULL on error + // Empty filename reads from standard input + static Fst *Read(const string &filename) { + if (!filename.empty()) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "Fst::Read: Can't open file: " << filename; + return 0; + } + return Read(strm, FstReadOptions(filename)); + } else { + return Read(std::cin, FstReadOptions("standard input")); + } + } + + // Write an Fst to an output stream; return false on error + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + LOG(ERROR) << "Fst::Write: No write stream method for " << Type() + << " Fst type"; + return false; + } + + // Write an Fst to a file; return false on error + // Empty filename writes to standard output + virtual bool Write(const string &filename) const { + LOG(ERROR) << "Fst::Write: No write filename method for " << Type() + << " Fst type"; + return false; + } + + // Return input label symbol table; return NULL if not specified + virtual const SymbolTable* InputSymbols() const = 0; + + // Return output label symbol table; return NULL if not specified + virtual const SymbolTable* OutputSymbols() const = 0; + + // For generic state iterator construction; not normally called + // directly by users. + virtual void InitStateIterator(StateIteratorData *) const = 0; + + // For generic arc iterator construction; not normally called + // directly by users. + virtual void InitArcIterator(StateId s, ArcIteratorData *) const = 0; + + // For generic matcher construction; not normally called + // directly by users. + virtual MatcherBase *InitMatcher(MatchType match_type) const; + + protected: + + bool WriteFile(const string &filename) const { + if (!filename.empty()) { + ofstream strm(filename.c_str(), ofstream::out | ofstream::binary); + if (!strm) { + LOG(ERROR) << "Fst::Write: Can't open file: " << filename; + return false; + } + return Write(strm, FstWriteOptions(filename)); + } else { + return Write(std::cout, FstWriteOptions("standard output")); + } + } +}; + + +// +// STATE and ARC ITERATOR DEFINITIONS +// + +// State iterator interface templated on the Arc definition; used +// for StateIterator specializations returned by the InitStateIterator +// Fst method. +template +class StateIteratorBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + virtual ~StateIteratorBase() {} + + bool Done() const { return Done_(); } // End of iterator? + StateId Value() const { return Value_(); } // Current state (when !Done) + void Next() { Next_(); } // Advance to next state (when !Done) + void Reset() { Reset_(); } // Return to initial condition + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const = 0; + virtual StateId Value_() const = 0; + virtual void Next_() = 0; + virtual void Reset_() = 0; +}; + + +// StateIterator initialization data + +template struct StateIteratorData { + StateIteratorBase *base; // Specialized iterator if non-zero + typename A::StateId nstates; // O.w. total # of states +}; + + +// Generic state iterator, templated on the FST definition +// - a wrapper around pointer to specific one. +// Here is a typical use: \code +// for (StateIterator siter(fst); +// !siter.Done(); +// siter.Next()) { +// StateId s = siter.Value(); +// ... +// } \endcode +template +class StateIterator { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + + explicit StateIterator(const F &fst) : s_(0) { + fst.InitStateIterator(&data_); + } + + ~StateIterator() { if (data_.base) delete data_.base; } + + bool Done() const { + return data_.base ? data_.base->Done() : s_ >= data_.nstates; + } + + StateId Value() const { return data_.base ? data_.base->Value() : s_; } + + void Next() { + if (data_.base) + data_.base->Next(); + else + ++s_; + } + + void Reset() { + if (data_.base) + data_.base->Reset(); + else + s_ = 0; + } + + private: + StateIteratorData data_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Flags to control the behavior on an arc iterator: +static const uint32 kArcILabelValue = 0x0001; // Value() gives valid ilabel +static const uint32 kArcOLabelValue = 0x0002; // " " " olabel +static const uint32 kArcWeightValue = 0x0004; // " " " weight +static const uint32 kArcNextStateValue = 0x0008; // " " " nextstate +static const uint32 kArcNoCache = 0x0010; // No need to cache arcs + +static const uint32 kArcValueFlags = + kArcILabelValue | kArcOLabelValue | + kArcWeightValue | kArcNextStateValue; + +static const uint32 kArcFlags = kArcValueFlags | kArcNoCache; + + +// Arc iterator interface, templated on the Arc definition; used +// for Arc iterator specializations that are returned by the InitArcIterator +// Fst method. +template +class ArcIteratorBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + virtual ~ArcIteratorBase() {} + + bool Done() const { return Done_(); } // End of iterator? + const A& Value() const { return Value_(); } // Current arc (when !Done) + void Next() { Next_(); } // Advance to next arc (when !Done) + size_t Position() const { return Position_(); } // Return current position + void Reset() { Reset_(); } // Return to initial condition + void Seek(size_t a) { Seek_(a); } // Random arc access by position + uint32 Flags() const { return Flags_(); } // Return current behavorial flags + void SetFlags(uint32 flags, uint32 mask) { // Set behavorial flags + SetFlags_(flags, mask); + } + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const = 0; + virtual const A& Value_() const = 0; + virtual void Next_() = 0; + virtual size_t Position_() const = 0; + virtual void Reset_() = 0; + virtual void Seek_(size_t a) = 0; + virtual uint32 Flags_() const = 0; + virtual void SetFlags_(uint32 flags, uint32 mask) = 0; +}; + + +// ArcIterator initialization data +template struct ArcIteratorData { + ArcIteratorBase *base; // Specialized iterator if non-zero + const A *arcs; // O.w. arcs pointer + size_t narcs; // ... and arc count + int *ref_count; // ... and reference count if non-zero +}; + + +// Generic arc iterator, templated on the FST definition +// - a wrapper around pointer to specific one. +// Here is a typical use: \code +// for (ArcIterator aiter(fst, s)); +// !aiter.Done(); +// aiter.Next()) { +// StdArc &arc = aiter.Value(); +// ... +// } \endcode +template +class ArcIterator { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + + ArcIterator(const F &fst, StateId s) : i_(0) { + fst.InitArcIterator(s, &data_); + } + + explicit ArcIterator(const ArcIteratorData &data) : data_(data), i_(0) { + if (data_.ref_count) + ++(*data_.ref_count); + } + + ~ArcIterator() { + if (data_.base) + delete data_.base; + else if (data_.ref_count) + --(*data_.ref_count); + } + + bool Done() const { + return data_.base ? data_.base->Done() : i_ >= data_.narcs; + } + + const Arc& Value() const { + return data_.base ? data_.base->Value() : data_.arcs[i_]; + } + + void Next() { + if (data_.base) + data_.base->Next(); + else + ++i_; + } + + void Reset() { + if (data_.base) + data_.base->Reset(); + else + i_ = 0; + } + + void Seek(size_t a) { + if (data_.base) + data_.base->Seek(a); + else + i_ = a; + } + + size_t Position() const { + return data_.base ? data_.base->Position() : i_; + } + + uint32 Flags() const { + if (data_.base) + return data_.base->Flags(); + else + return kArcValueFlags; + } + + void SetFlags(uint32 flags, uint32 mask) { + if (data_.base) + data_.base->SetFlags(flags, mask); + } + + private: + ArcIteratorData data_; + size_t i_; + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// +// MATCHER DEFINITIONS +// + +template +MatcherBase *Fst::InitMatcher(MatchType match_type) const { + return 0; // Use the default matcher +} + + +// +// FST ACCESSORS - Useful functions in high-performance cases. +// + +namespace internal { + +// General case - requires non-abstract, 'final' methods. Use for inlining. +template inline +typename F::Arc::Weight Final(const F &fst, typename F::Arc::StateId s) { + return fst.F::Final(s); +} + +template inline +ssize_t NumArcs(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumOutputEpsilons(s); +} + + +// Fst case - abstract methods. +template inline +typename A::Weight Final(const Fst &fst, typename A::StateId s) { + return fst.Final(s); +} + +template inline +ssize_t NumArcs(const Fst &fst, typename A::StateId s) { + return fst.NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const Fst &fst, typename A::StateId s) { + return fst.NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const Fst &fst, typename A::StateId s) { + return fst.NumOutputEpsilons(s); +} + +} // namespace internal + +// A useful alias when using StdArc. +typedef Fst StdFst; + + +// +// CONSTANT DEFINITIONS +// + +const int kNoStateId = -1; // Not a valid state ID +const int kNoLabel = -1; // Not a valid label + +// +// Fst IMPLEMENTATION BASE +// +// This is the recommended Fst implementation base class. It will +// handle reference counts, property bits, type information and symbols. +// + +template class FstImpl { + public: + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + FstImpl() + : properties_(0), type_("null"), isymbols_(0), osymbols_(0) {} + + FstImpl(const FstImpl &impl) + : properties_(impl.properties_), type_(impl.type_), + isymbols_(impl.isymbols_ ? impl.isymbols_->Copy() : 0), + osymbols_(impl.osymbols_ ? impl.osymbols_->Copy() : 0) {} + + virtual ~FstImpl() { + delete isymbols_; + delete osymbols_; + } + + const string& Type() const { return type_; } + + void SetType(const string &type) { type_ = type; } + + virtual uint64 Properties() const { return properties_; } + + virtual uint64 Properties(uint64 mask) const { return properties_ & mask; } + + void SetProperties(uint64 props) { + properties_ &= kError; // kError can't be cleared + properties_ |= props; + } + + void SetProperties(uint64 props, uint64 mask) { + properties_ &= ~mask | kError; // kError can't be cleared + properties_ |= props & mask; + } + + // Allows (only) setting error bit on const FST impls + void SetProperties(uint64 props, uint64 mask) const { + if (mask != kError) + FSTERROR() << "FstImpl::SetProperties() const: can only set kError"; + properties_ |= kError; + } + + const SymbolTable* InputSymbols() const { return isymbols_; } + + const SymbolTable* OutputSymbols() const { return osymbols_; } + + SymbolTable* InputSymbols() { return isymbols_; } + + SymbolTable* OutputSymbols() { return osymbols_; } + + void SetInputSymbols(const SymbolTable* isyms) { + if (isymbols_) delete isymbols_; + isymbols_ = isyms ? isyms->Copy() : 0; + } + + void SetOutputSymbols(const SymbolTable* osyms) { + if (osymbols_) delete osymbols_; + osymbols_ = osyms ? osyms->Copy() : 0; + } + + int RefCount() const { + return ref_count_.count(); + } + + int IncrRefCount() { + return ref_count_.Incr(); + } + + int DecrRefCount() { + return ref_count_.Decr(); + } + + // Read-in header and symbols from input stream, initialize Fst, and + // return the header. If opts.header is non-null, skip read-in and + // use the option value. If opts.[io]symbols is non-null, read-in + // (if present), but use the option value. + bool ReadHeader(istream &strm, const FstReadOptions& opts, + int min_version, FstHeader *hdr); + + // Write-out header and symbols from output stream. + // If a opts.header is false, skip writing header. + // If opts.[io]symbols is false, skip writing those symbols. + // This method is needed for Impl's that implement Write methods. + void WriteHeader(ostream &strm, const FstWriteOptions& opts, + int version, FstHeader *hdr) const { + if (opts.write_header) { + hdr->SetFstType(type_); + hdr->SetArcType(A::Type()); + hdr->SetVersion(version); + hdr->SetProperties(properties_); + int32 file_flags = 0; + if (isymbols_ && opts.write_isymbols) + file_flags |= FstHeader::HAS_ISYMBOLS; + if (osymbols_ && opts.write_osymbols) + file_flags |= FstHeader::HAS_OSYMBOLS; + if (opts.align) + file_flags |= FstHeader::IS_ALIGNED; + hdr->SetFlags(file_flags); + hdr->Write(strm, opts.source); + } + if (isymbols_ && opts.write_isymbols) isymbols_->Write(strm); + if (osymbols_ && opts.write_osymbols) osymbols_->Write(strm); + } + + // Write-out header and symbols to output stream. + // If a opts.header is false, skip writing header. + // If opts.[io]symbols is false, skip writing those symbols. + // type is the Fst type being written. + // This method is used in the cross-type serialization methods Fst::WriteFst. + static void WriteFstHeader(const Fst &fst, ostream &strm, + const FstWriteOptions& opts, int version, + const string &type, FstHeader *hdr) { + if (opts.write_header) { + hdr->SetFstType(type); + hdr->SetArcType(A::Type()); + hdr->SetVersion(version); + hdr->SetProperties(fst.Properties(kFstProperties, false)); + int32 file_flags = 0; + if (fst.InputSymbols() && opts.write_isymbols) + file_flags |= FstHeader::HAS_ISYMBOLS; + if (fst.OutputSymbols() && opts.write_osymbols) + file_flags |= FstHeader::HAS_OSYMBOLS; + if (opts.align) + file_flags |= FstHeader::IS_ALIGNED; + hdr->SetFlags(file_flags); + hdr->Write(strm, opts.source); + } + if (fst.InputSymbols() && opts.write_isymbols) { + fst.InputSymbols()->Write(strm); + } + if (fst.OutputSymbols() && opts.write_osymbols) { + fst.OutputSymbols()->Write(strm); + } + } + + // In serialization routines where the header cannot be written until after + // the machine has been serialized, this routine can be called to seek to + // the beginning of the file an rewrite the header with updated fields. + // It repositions the file pointer back at the end of the file. + // returns true on success, false on failure. + static bool UpdateFstHeader(const Fst &fst, ostream &strm, + const FstWriteOptions& opts, int version, + const string &type, FstHeader *hdr, + size_t header_offset) { + strm.seekp(header_offset); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + WriteFstHeader(fst, strm, opts, version, type, hdr); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + strm.seekp(0, ios_base::end); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + return true; + } + + protected: + mutable uint64 properties_; // Property bits + + private: + string type_; // Unique name of Fst class + SymbolTable *isymbols_; // Ilabel symbol table + SymbolTable *osymbols_; // Olabel symbol table + RefCounter ref_count_; // Reference count + + void operator=(const FstImpl &impl); // disallow +}; + +template inline +bool FstImpl::ReadHeader(istream &strm, const FstReadOptions& opts, + int min_version, FstHeader *hdr) { + if (opts.header) + *hdr = *opts.header; + else if (!hdr->Read(strm, opts.source)) + return false; + + if (FLAGS_v >= 2) { + LOG(INFO) << "FstImpl::ReadHeader: source: " << opts.source + << ", fst_type: " << hdr->FstType() + << ", arc_type: " << A::Type() + << ", version: " << hdr->Version() + << ", flags: " << hdr->GetFlags(); + } + + if (hdr->FstType() != type_) { + LOG(ERROR) << "FstImpl::ReadHeader: Fst not of type \"" << type_ + << "\": " << opts.source; + return false; + } + if (hdr->ArcType() != A::Type()) { + LOG(ERROR) << "FstImpl::ReadHeader: Arc not of type \"" << A::Type() + << "\": " << opts.source; + return false; + } + if (hdr->Version() < min_version) { + LOG(ERROR) << "FstImpl::ReadHeader: Obsolete " << type_ + << " Fst version: " << opts.source; + return false; + } + properties_ = hdr->Properties(); + if (hdr->GetFlags() & FstHeader::HAS_ISYMBOLS) + isymbols_ = SymbolTable::Read(strm, opts.source); + if (hdr->GetFlags() & FstHeader::HAS_OSYMBOLS) + osymbols_ =SymbolTable::Read(strm, opts.source); + + if (opts.isymbols) { + delete isymbols_; + isymbols_ = opts.isymbols->Copy(); + } + if (opts.osymbols) { + delete osymbols_; + osymbols_ = opts.osymbols->Copy(); + } + return true; +} + + +template +uint64 TestProperties(const Fst &fst, uint64 mask, uint64 *known); + + +// This is a helper class template useful for attaching an Fst interface to +// its implementation, handling reference counting. +template < class I, class F = Fst > +class ImplToFst : public F { + public: + typedef typename I::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + virtual ~ImplToFst() { if (!impl_->DecrRefCount()) delete impl_; } + + virtual StateId Start() const { return impl_->Start(); } + + virtual Weight Final(StateId s) const { return impl_->Final(s); } + + virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); } + + virtual size_t NumInputEpsilons(StateId s) const { + return impl_->NumInputEpsilons(s); + } + + virtual size_t NumOutputEpsilons(StateId s) const { + return impl_->NumOutputEpsilons(s); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + if (test) { + uint64 knownprops, testprops = TestProperties(*this, mask, &knownprops); + impl_->SetProperties(testprops, knownprops); + return testprops & mask; + } else { + return impl_->Properties(mask); + } + } + + virtual const string& Type() const { return impl_->Type(); } + + virtual const SymbolTable* InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable* OutputSymbols() const { + return impl_->OutputSymbols(); + } + + protected: + ImplToFst() : impl_(0) {} + + ImplToFst(I *impl) : impl_(impl) {} + + ImplToFst(const ImplToFst &fst) { + impl_ = fst.impl_; + impl_->IncrRefCount(); + } + + // This constructor presumes there is a copy constructor for the + // implementation. + ImplToFst(const ImplToFst &fst, bool safe) { + if (safe) { + impl_ = new I(*(fst.impl_)); + } else { + impl_ = fst.impl_; + impl_->IncrRefCount(); + } + } + + I *GetImpl() const { return impl_; } + + // Change Fst implementation pointer. If 'own_impl' is true, + // ownership of the input implementation is given to this + // object; otherwise, the input implementation's reference count + // should be incremented. + void SetImpl(I *impl, bool own_impl = true) { + if (!own_impl) + impl->IncrRefCount(); + if (impl_ && !impl_->DecrRefCount()) delete impl_; + impl_ = impl; + } + + private: + // Disallow + ImplToFst &operator=(const ImplToFst &fst); + + ImplToFst &operator=(const Fst &fst) { + FSTERROR() << "ImplToFst: Assignment operator disallowed"; + GetImpl()->SetProperties(kError, kError); + return *this; + } + + I *impl_; +}; + + +// Converts FSTs by casting their implementations, where this makes +// sense (which excludes implementations with weight-dependent virtual +// methods). Must be a friend of the Fst classes involved (currently +// the concrete Fsts: VectorFst, ConstFst, CompactFst). +template void Cast(const F &ifst, G *ofst) { + ofst->SetImpl(reinterpret_cast(ifst.GetImpl()), false); +} + +// Fst Serialization +template +void FstToString(const Fst &fst, string *result) { + ostringstream ostrm; + fst.Write(ostrm, FstWriteOptions("FstToString")); + *result = ostrm.str(); +} + +template +Fst *StringToFst(const string &s) { + istringstream istrm(s); + return Fst::Read(istrm, FstReadOptions("StringToFst")); +} + +} // namespace fst + +#endif // FST_LIB_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/fst.h.bak b/extlibs/openfstwin-1.3.1/include/fst/fst.h.bak new file mode 100755 index 00000000000..80c96adda65 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/fst.h.bak @@ -0,0 +1,943 @@ +// fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Finite-State Transducer (FST) - abstract base class definition, +// state and arc iterator interface, and suggested base implementation. +// + +#ifndef FST_LIB_FST_H__ +#define FST_LIB_FST_H__ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +DECLARE_bool(fst_align); + +namespace fst { + +bool IsFstHeader(istream &, const string &); + +class FstHeader; +template class StateIteratorData; +template class ArcIteratorData; +template class MatcherBase; + +struct FstReadOptions { + string source; // Where you're reading from + const FstHeader *header; // Pointer to Fst header. If non-zero, use + // this info (don't read a stream header) + const SymbolTable* isymbols; // Pointer to input symbols. If non-zero, use + // this info (read and skip stream isymbols) + const SymbolTable* osymbols; // Pointer to output symbols. If non-zero, use + // this info (read and skip stream osymbols) + + explicit FstReadOptions(const string& src = "", + const FstHeader *hdr = 0, + const SymbolTable* isym = 0, + const SymbolTable* osym = 0) + : source(src), header(hdr), isymbols(isym), osymbols(osym) {} + + explicit FstReadOptions(const string& src, + const SymbolTable* isym, + const SymbolTable* osym = 0) + : source(src), header(0), isymbols(isym), osymbols(osym) {} +}; + + +struct FstWriteOptions { + string source; // Where you're writing to + bool write_header; // Write the header? + bool write_isymbols; // Write input symbols? + bool write_osymbols; // Write output symbols? + bool align; // Write data aligned where appropriate; + // this may fail on pipes + + explicit FstWriteOptions(const string& src = "", + bool hdr = true, bool isym = true, + bool osym = true, bool alig = FLAGS_fst_align) + : source(src), write_header(hdr), + write_isymbols(isym), write_osymbols(osym), align(alig) {} +}; + +// +// Fst HEADER CLASS +// +// This is the recommended Fst file header representation. +// +class FstHeader { + public: + enum { + HAS_ISYMBOLS = 0x1, // Has input symbol table + HAS_OSYMBOLS = 0x2, // Has output symbol table + IS_ALIGNED = 0x4, // Memory-aligned (where appropriate) + } Flags; + + FstHeader() : version_(0), flags_(0), properties_(0), start_(-1), + numstates_(0), numarcs_(0) {} + const string &FstType() const { return fsttype_; } + const string &ArcType() const { return arctype_; } + int32 Version() const { return version_; } + int32 GetFlags() const { return flags_; } + uint64 Properties() const { return properties_; } + int64 Start() const { return start_; } + int64 NumStates() const { return numstates_; } + int64 NumArcs() const { return numarcs_; } + + void SetFstType(const string& type) { fsttype_ = type; } + void SetArcType(const string& type) { arctype_ = type; } + void SetVersion(int32 version) { version_ = version; } + void SetFlags(int32 flags) { flags_ = flags; } + void SetProperties(uint64 properties) { properties_ = properties; } + void SetStart(int64 start) { start_ = start; } + void SetNumStates(int64 numstates) { numstates_ = numstates; } + void SetNumArcs(int64 numarcs) { numarcs_ = numarcs; } + + bool Read(istream &strm, const string &source, bool rewind = false); + bool Write(ostream &strm, const string &source) const; + + private: + + string fsttype_; // E.g. "vector" + string arctype_; // E.g. "standard" + int32 version_; // Type version # + int32 flags_; // File format bits + uint64 properties_; // FST property bits + int64 start_; // Start state + int64 numstates_; // # of states + int64 numarcs_; // # of arcs +}; + + +// Specifies matcher action. +enum MatchType { MATCH_INPUT, // Match input label. + MATCH_OUTPUT, // Match output label. + MATCH_BOTH, // Match input or output label. + MATCH_NONE, // Match nothing. + MATCH_UNKNOWN }; // Match type unknown. + +// +// Fst INTERFACE CLASS DEFINITION +// + +// A generic FST, templated on the arc definition, with +// common-demoninator methods (use StateIterator and ArcIterator to +// iterate over its states and arcs). +template +class Fst { + public: + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + virtual ~Fst() {} + + virtual StateId Start() const = 0; // Initial state + + virtual Weight Final(StateId) const = 0; // State's final weight + + virtual size_t NumArcs(StateId) const = 0; // State's arc count + + virtual size_t NumInputEpsilons(StateId) + const = 0; // State's input epsilon count + + virtual size_t NumOutputEpsilons(StateId) + const = 0; // State's output epsilon count + + // If test=false, return stored properties bits for mask (some poss. unknown) + // If test=true, return property bits for mask (computing o.w. unknown) + virtual uint64 Properties(uint64 mask, bool test) + const = 0; // Property bits + + virtual const string& Type() const = 0; // Fst type name + + // Get a copy of this Fst. The copying behaves as follows: + // + // (1) The copying is constant time if safe = false or if safe = true + // and is on an otherwise unaccessed Fst. + // + // (2) If safe = true, the copy is thread-safe in that the original + // and copy can be safely accessed (but not necessarily mutated) by + // separate threads. For some Fst types, 'Copy(true)' should only be + // called on an Fst that has not otherwise been accessed. Its behavior + // is undefined otherwise. + // + // (3) If a MutableFst is copied and then mutated, then the original is + // unmodified and vice versa (often by a copy-on-write on the initial + // mutation, which may not be constant time). + virtual Fst *Copy(bool safe = false) const = 0; + + // Read an Fst from an input stream; returns NULL on error + static Fst *Read(istream &strm, const FstReadOptions &opts) { + FstReadOptions ropts(opts); + FstHeader hdr; + if (ropts.header) + hdr = *opts.header; + else { + if (!hdr.Read(strm, opts.source)) + return 0; + ropts.header = &hdr; + } + FstRegister *registr = FstRegister::GetRegister(); + const typename FstRegister::Reader reader = + registr->GetReader(hdr.FstType()); + if (!reader) { + LOG(ERROR) << "Fst::Read: Unknown FST type \"" << hdr.FstType() + << "\" (arc type = \"" << A::Type() + << "\"): " << ropts.source; + return 0; + } + return reader(strm, ropts); + }; + + // Read an Fst from a file; return NULL on error + // Empty filename reads from standard input + static Fst *Read(const string &filename) { + if (!filename.empty()) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "Fst::Read: Can't open file: " << filename; + return 0; + } + return Read(strm, FstReadOptions(filename)); + } else { + return Read(std::cin, FstReadOptions("standard input")); + } + } + + // Write an Fst to an output stream; return false on error + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + LOG(ERROR) << "Fst::Write: No write stream method for " << Type() + << " Fst type"; + return false; + } + + // Write an Fst to a file; return false on error + // Empty filename writes to standard output + virtual bool Write(const string &filename) const { + LOG(ERROR) << "Fst::Write: No write filename method for " << Type() + << " Fst type"; + return false; + } + + // Return input label symbol table; return NULL if not specified + virtual const SymbolTable* InputSymbols() const = 0; + + // Return output label symbol table; return NULL if not specified + virtual const SymbolTable* OutputSymbols() const = 0; + + // For generic state iterator construction; not normally called + // directly by users. + virtual void InitStateIterator(StateIteratorData *) const = 0; + + // For generic arc iterator construction; not normally called + // directly by users. + virtual void InitArcIterator(StateId s, ArcIteratorData *) const = 0; + + // For generic matcher construction; not normally called + // directly by users. + virtual MatcherBase *InitMatcher(MatchType match_type) const; + + protected: + + bool WriteFile(const string &filename) const { + if (!filename.empty()) { + ofstream strm(filename.c_str(), ofstream::out | ofstream::binary); + if (!strm) { + LOG(ERROR) << "Fst::Write: Can't open file: " << filename; + return false; + } + return Write(strm, FstWriteOptions(filename)); + } else { + return Write(std::cout, FstWriteOptions("standard output")); + } + } +}; + + +// +// STATE and ARC ITERATOR DEFINITIONS +// + +// State iterator interface templated on the Arc definition; used +// for StateIterator specializations returned by the InitStateIterator +// Fst method. +template +class StateIteratorBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + virtual ~StateIteratorBase() {} + + bool Done() const { return Done_(); } // End of iterator? + StateId Value() const { return Value_(); } // Current state (when !Done) + void Next() { Next_(); } // Advance to next state (when !Done) + void Reset() { Reset_(); } // Return to initial condition + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const = 0; + virtual StateId Value_() const = 0; + virtual void Next_() = 0; + virtual void Reset_() = 0; +}; + + +// StateIterator initialization data + +template struct StateIteratorData { + StateIteratorBase *base; // Specialized iterator if non-zero + typename A::StateId nstates; // O.w. total # of states +}; + + +// Generic state iterator, templated on the FST definition +// - a wrapper around pointer to specific one. +// Here is a typical use: \code +// for (StateIterator siter(fst); +// !siter.Done(); +// siter.Next()) { +// StateId s = siter.Value(); +// ... +// } \endcode +template +class StateIterator { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + + explicit StateIterator(const F &fst) : s_(0) { + fst.InitStateIterator(&data_); + } + + ~StateIterator() { if (data_.base) delete data_.base; } + + bool Done() const { + return data_.base ? data_.base->Done() : s_ >= data_.nstates; + } + + StateId Value() const { return data_.base ? data_.base->Value() : s_; } + + void Next() { + if (data_.base) + data_.base->Next(); + else + ++s_; + } + + void Reset() { + if (data_.base) + data_.base->Reset(); + else + s_ = 0; + } + + private: + StateIteratorData data_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Flags to control the behavior on an arc iterator: +static const uint32 kArcILabelValue = 0x0001; // Value() gives valid ilabel +static const uint32 kArcOLabelValue = 0x0002; // " " " olabel +static const uint32 kArcWeightValue = 0x0004; // " " " weight +static const uint32 kArcNextStateValue = 0x0008; // " " " nextstate +static const uint32 kArcNoCache = 0x0010; // No need to cache arcs + +static const uint32 kArcValueFlags = + kArcILabelValue | kArcOLabelValue | + kArcWeightValue | kArcNextStateValue; + +static const uint32 kArcFlags = kArcValueFlags | kArcNoCache; + + +// Arc iterator interface, templated on the Arc definition; used +// for Arc iterator specializations that are returned by the InitArcIterator +// Fst method. +template +class ArcIteratorBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + virtual ~ArcIteratorBase() {} + + bool Done() const { return Done_(); } // End of iterator? + const A& Value() const { return Value_(); } // Current arc (when !Done) + void Next() { Next_(); } // Advance to next arc (when !Done) + size_t Position() const { return Position_(); } // Return current position + void Reset() { Reset_(); } // Return to initial condition + void Seek(size_t a) { Seek_(a); } // Random arc access by position + uint32 Flags() const { return Flags_(); } // Return current behavorial flags + void SetFlags(uint32 flags, uint32 mask) { // Set behavorial flags + SetFlags_(flags, mask); + } + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const = 0; + virtual const A& Value_() const = 0; + virtual void Next_() = 0; + virtual size_t Position_() const = 0; + virtual void Reset_() = 0; + virtual void Seek_(size_t a) = 0; + virtual uint32 Flags_() const = 0; + virtual void SetFlags_(uint32 flags, uint32 mask) = 0; +}; + + +// ArcIterator initialization data +template struct ArcIteratorData { + ArcIteratorBase *base; // Specialized iterator if non-zero + const A *arcs; // O.w. arcs pointer + size_t narcs; // ... and arc count + int *ref_count; // ... and reference count if non-zero +}; + + +// Generic arc iterator, templated on the FST definition +// - a wrapper around pointer to specific one. +// Here is a typical use: \code +// for (ArcIterator aiter(fst, s)); +// !aiter.Done(); +// aiter.Next()) { +// StdArc &arc = aiter.Value(); +// ... +// } \endcode +template +class ArcIterator { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + + ArcIterator(const F &fst, StateId s) : i_(0) { + fst.InitArcIterator(s, &data_); + } + + explicit ArcIterator(const ArcIteratorData &data) : data_(data), i_(0) { + if (data_.ref_count) + ++(*data_.ref_count); + } + + ~ArcIterator() { + if (data_.base) + delete data_.base; + else if (data_.ref_count) + --(*data_.ref_count); + } + + bool Done() const { + return data_.base ? data_.base->Done() : i_ >= data_.narcs; + } + + const Arc& Value() const { + return data_.base ? data_.base->Value() : data_.arcs[i_]; + } + + void Next() { + if (data_.base) + data_.base->Next(); + else + ++i_; + } + + void Reset() { + if (data_.base) + data_.base->Reset(); + else + i_ = 0; + } + + void Seek(size_t a) { + if (data_.base) + data_.base->Seek(a); + else + i_ = a; + } + + size_t Position() const { + return data_.base ? data_.base->Position() : i_; + } + + uint32 Flags() const { + if (data_.base) + return data_.base->Flags(); + else + return kArcValueFlags; + } + + void SetFlags(uint32 flags, uint32 mask) { + if (data_.base) + data_.base->SetFlags(flags, mask); + } + + private: + ArcIteratorData data_; + size_t i_; + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// +// MATCHER DEFINITIONS +// + +template +MatcherBase *Fst::InitMatcher(MatchType match_type) const { + return 0; // Use the default matcher +} + + +// +// FST ACCESSORS - Useful functions in high-performance cases. +// + +namespace internal { + +// General case - requires non-abstract, 'final' methods. Use for inlining. +template inline +typename F::Arc::Weight Final(const F &fst, typename F::Arc::StateId s) { + return fst.F::Final(s); +} + +template inline +ssize_t NumArcs(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const F &fst, typename F::Arc::StateId s) { + return fst.F::NumOutputEpsilons(s); +} + + +// Fst case - abstract methods. +template inline +typename A::Weight Final(const Fst &fst, typename A::StateId s) { + return fst.Final(s); +} + +template inline +ssize_t NumArcs(const Fst &fst, typename A::StateId s) { + return fst.NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const Fst &fst, typename A::StateId s) { + return fst.NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const Fst &fst, typename A::StateId s) { + return fst.NumOutputEpsilons(s); +} + +} // namespace internal + +// A useful alias when using StdArc. +typedef Fst StdFst; + + +// +// CONSTANT DEFINITIONS +// + +const int kNoStateId = -1; // Not a valid state ID +const int kNoLabel = -1; // Not a valid label + +// +// Fst IMPLEMENTATION BASE +// +// This is the recommended Fst implementation base class. It will +// handle reference counts, property bits, type information and symbols. +// + +template class FstImpl { + public: + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + FstImpl() + : properties_(0), type_("null"), isymbols_(0), osymbols_(0) {} + + FstImpl(const FstImpl &impl) + : properties_(impl.properties_), type_(impl.type_), + isymbols_(impl.isymbols_ ? impl.isymbols_->Copy() : 0), + osymbols_(impl.osymbols_ ? impl.osymbols_->Copy() : 0) {} + + virtual ~FstImpl() { + delete isymbols_; + delete osymbols_; + } + + const string& Type() const { return type_; } + + void SetType(const string &type) { type_ = type; } + + virtual uint64 Properties() const { return properties_; } + + virtual uint64 Properties(uint64 mask) const { return properties_ & mask; } + + void SetProperties(uint64 props) { + properties_ &= kError; // kError can't be cleared + properties_ |= props; + } + + void SetProperties(uint64 props, uint64 mask) { + properties_ &= ~mask | kError; // kError can't be cleared + properties_ |= props & mask; + } + + // Allows (only) setting error bit on const FST impls + void SetProperties(uint64 props, uint64 mask) const { + if (mask != kError) + FSTERROR() << "FstImpl::SetProperties() const: can only set kError"; + properties_ |= kError; + } + + const SymbolTable* InputSymbols() const { return isymbols_; } + + const SymbolTable* OutputSymbols() const { return osymbols_; } + + SymbolTable* InputSymbols() { return isymbols_; } + + SymbolTable* OutputSymbols() { return osymbols_; } + + void SetInputSymbols(const SymbolTable* isyms) { + if (isymbols_) delete isymbols_; + isymbols_ = isyms ? isyms->Copy() : 0; + } + + void SetOutputSymbols(const SymbolTable* osyms) { + if (osymbols_) delete osymbols_; + osymbols_ = osyms ? osyms->Copy() : 0; + } + + int RefCount() const { + return ref_count_.count(); + } + + int IncrRefCount() { + return ref_count_.Incr(); + } + + int DecrRefCount() { + return ref_count_.Decr(); + } + + // Read-in header and symbols from input stream, initialize Fst, and + // return the header. If opts.header is non-null, skip read-in and + // use the option value. If opts.[io]symbols is non-null, read-in + // (if present), but use the option value. + bool ReadHeader(istream &strm, const FstReadOptions& opts, + int min_version, FstHeader *hdr); + + // Write-out header and symbols from output stream. + // If a opts.header is false, skip writing header. + // If opts.[io]symbols is false, skip writing those symbols. + // This method is needed for Impl's that implement Write methods. + void WriteHeader(ostream &strm, const FstWriteOptions& opts, + int version, FstHeader *hdr) const { + if (opts.write_header) { + hdr->SetFstType(type_); + hdr->SetArcType(A::Type()); + hdr->SetVersion(version); + hdr->SetProperties(properties_); + int32 file_flags = 0; + if (isymbols_ && opts.write_isymbols) + file_flags |= FstHeader::HAS_ISYMBOLS; + if (osymbols_ && opts.write_osymbols) + file_flags |= FstHeader::HAS_OSYMBOLS; + if (opts.align) + file_flags |= FstHeader::IS_ALIGNED; + hdr->SetFlags(file_flags); + hdr->Write(strm, opts.source); + } + if (isymbols_ && opts.write_isymbols) isymbols_->Write(strm); + if (osymbols_ && opts.write_osymbols) osymbols_->Write(strm); + } + + // Write-out header and symbols to output stream. + // If a opts.header is false, skip writing header. + // If opts.[io]symbols is false, skip writing those symbols. + // type is the Fst type being written. + // This method is used in the cross-type serialization methods Fst::WriteFst. + static void WriteFstHeader(const Fst &fst, ostream &strm, + const FstWriteOptions& opts, int version, + const string &type, FstHeader *hdr) { + if (opts.write_header) { + hdr->SetFstType(type); + hdr->SetArcType(A::Type()); + hdr->SetVersion(version); + hdr->SetProperties(fst.Properties(kFstProperties, false)); + int32 file_flags = 0; + if (fst.InputSymbols() && opts.write_isymbols) + file_flags |= FstHeader::HAS_ISYMBOLS; + if (fst.OutputSymbols() && opts.write_osymbols) + file_flags |= FstHeader::HAS_OSYMBOLS; + if (opts.align) + file_flags |= FstHeader::IS_ALIGNED; + hdr->SetFlags(file_flags); + hdr->Write(strm, opts.source); + } + if (fst.InputSymbols() && opts.write_isymbols) { + fst.InputSymbols()->Write(strm); + } + if (fst.OutputSymbols() && opts.write_osymbols) { + fst.OutputSymbols()->Write(strm); + } + } + + // In serialization routines where the header cannot be written until after + // the machine has been serialized, this routine can be called to seek to + // the beginning of the file an rewrite the header with updated fields. + // It repositions the file pointer back at the end of the file. + // returns true on success, false on failure. + static bool UpdateFstHeader(const Fst &fst, ostream &strm, + const FstWriteOptions& opts, int version, + const string &type, FstHeader *hdr, + size_t header_offset) { + strm.seekp(header_offset); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + WriteFstHeader(fst, strm, opts, version, type, hdr); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + strm.seekp(0, ios_base::end); + if (!strm) { + LOG(ERROR) << "Fst::UpdateFstHeader: write failed: " << opts.source; + return false; + } + return true; + } + + protected: + mutable uint64 properties_; // Property bits + + private: + string type_; // Unique name of Fst class + SymbolTable *isymbols_; // Ilabel symbol table + SymbolTable *osymbols_; // Olabel symbol table + RefCounter ref_count_; // Reference count + + void operator=(const FstImpl &impl); // disallow +}; + +template inline +bool FstImpl::ReadHeader(istream &strm, const FstReadOptions& opts, + int min_version, FstHeader *hdr) { + if (opts.header) + *hdr = *opts.header; + else if (!hdr->Read(strm, opts.source)) + return false; + + if (FLAGS_v >= 2) { + LOG(INFO) << "FstImpl::ReadHeader: source: " << opts.source + << ", fst_type: " << hdr->FstType() + << ", arc_type: " << A::Type() + << ", version: " << hdr->Version() + << ", flags: " << hdr->GetFlags(); + } + + if (hdr->FstType() != type_) { + LOG(ERROR) << "FstImpl::ReadHeader: Fst not of type \"" << type_ + << "\": " << opts.source; + return false; + } + if (hdr->ArcType() != A::Type()) { + LOG(ERROR) << "FstImpl::ReadHeader: Arc not of type \"" << A::Type() + << "\": " << opts.source; + return false; + } + if (hdr->Version() < min_version) { + LOG(ERROR) << "FstImpl::ReadHeader: Obsolete " << type_ + << " Fst version: " << opts.source; + return false; + } + properties_ = hdr->Properties(); + if (hdr->GetFlags() & FstHeader::HAS_ISYMBOLS) + isymbols_ = SymbolTable::Read(strm, opts.source); + if (hdr->GetFlags() & FstHeader::HAS_OSYMBOLS) + osymbols_ =SymbolTable::Read(strm, opts.source); + + if (opts.isymbols) { + delete isymbols_; + isymbols_ = opts.isymbols->Copy(); + } + if (opts.osymbols) { + delete osymbols_; + osymbols_ = opts.osymbols->Copy(); + } + return true; +} + + +template +uint64 TestProperties(const Fst &fst, uint64 mask, uint64 *known); + + +// This is a helper class template useful for attaching an Fst interface to +// its implementation, handling reference counting. +template < class I, class F = Fst > +class ImplToFst : public F { + public: + typedef typename I::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + virtual ~ImplToFst() { if (!impl_->DecrRefCount()) delete impl_; } + + virtual StateId Start() const { return impl_->Start(); } + + virtual Weight Final(StateId s) const { return impl_->Final(s); } + + virtual size_t NumArcs(StateId s) const { return impl_->NumArcs(s); } + + virtual size_t NumInputEpsilons(StateId s) const { + return impl_->NumInputEpsilons(s); + } + + virtual size_t NumOutputEpsilons(StateId s) const { + return impl_->NumOutputEpsilons(s); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + if (test) { + uint64 knownprops, testprops = TestProperties(*this, mask, &knownprops); + impl_->SetProperties(testprops, knownprops); + return testprops & mask; + } else { + return impl_->Properties(mask); + } + } + + virtual const string& Type() const { return impl_->Type(); } + + virtual const SymbolTable* InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable* OutputSymbols() const { + return impl_->OutputSymbols(); + } + + protected: + ImplToFst() : impl_(0) {} + + ImplToFst(I *impl) : impl_(impl) {} + + ImplToFst(const ImplToFst &fst) { + impl_ = fst.impl_; + impl_->IncrRefCount(); + } + + // This constructor presumes there is a copy constructor for the + // implementation. + ImplToFst(const ImplToFst &fst, bool safe) { + if (safe) { + impl_ = new I(*(fst.impl_)); + } else { + impl_ = fst.impl_; + impl_->IncrRefCount(); + } + } + + I *GetImpl() const { return impl_; } + + // Change Fst implementation pointer. If 'own_impl' is true, + // ownership of the input implementation is given to this + // object; otherwise, the input implementation's reference count + // should be incremented. + void SetImpl(I *impl, bool own_impl = true) { + if (!own_impl) + impl->IncrRefCount(); + if (impl_ && !impl_->DecrRefCount()) delete impl_; + impl_ = impl; + } + + private: + // Disallow + ImplToFst &operator=(const ImplToFst &fst); + + ImplToFst &operator=(const Fst &fst) { + FSTERROR() << "ImplToFst: Assignment operator disallowed"; + GetImpl()->SetProperties(kError, kError); + return *this; + } + + I *impl_; +}; + + +// Converts FSTs by casting their implementations, where this makes +// sense (which excludes implementations with weight-dependent virtual +// methods). Must be a friend of the Fst classes involved (currently +// the concrete Fsts: VectorFst, ConstFst, CompactFst). +template void Cast(const F &ifst, G *ofst) { + ofst->SetImpl(reinterpret_cast(ifst.GetImpl()), false); +} + +// Fst Serialization +template +void FstToString(const Fst &fst, string *result) { + ostringstream ostrm; + fst.Write(ostrm, FstWriteOptions("FstToString")); + *result = ostrm.str(); +} + +template +Fst *StringToFst(const string &s) { + istringstream istrm(s); + return Fst::Read(istrm, FstReadOptions("StringToFst")); +} + +} // namespace fst + +#endif // FST_LIB_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/fstlib.h b/extlibs/openfstwin-1.3.1/include/fst/fstlib.h new file mode 100755 index 00000000000..a9293f3adbc --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/fstlib.h @@ -0,0 +1,152 @@ +// fstlib.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \page FstLib FST - Weighted Finite State Transducers +// This is a library for constructing, combining, optimizing, and +// searching "weighted finite-state transducers" (FSTs). Weighted +// finite-state transducers are automata where each transition has an +// input label, an output label, and a weight. The more familiar +// finite-state acceptor is represented as a transducer with each +// transition's input and output the same. Finite-state acceptors +// are used to represent sets of strings (specifically, "regular" or +// "rational sets"); finite-state transducers are used to represent +// binary relations between pairs of strings (specifically, "rational +// transductions"). The weights can be used to represent the cost of +// taking a particular transition. +// +// In this library, the transducers are templated on the Arc +// (transition) definition, which allows changing the label, weight, +// and state ID sets. Labels and state IDs are restricted to signed +// integral types but the weight can be an arbitrary type whose +// members satisfy certain algebraic ("semiring") properties. +// +// For more information, see the FST Library Wiki page: +// http://wiki.corp.google.com/twiki/bin/view/Main/FstLibrary + +// \file +// This convenience file includes all other FST inl.h files. +// + +#ifndef FST_LIB_FSTLIB_H__ +#define FST_LIB_FSTLIB_H__ + + +// Abstract FST classes +#include +#include +#include + +// Concrete FST classes +#include +#include +#include +#include + +// FST algorithms and delayed FST classes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Weights +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Auxiliary classes for composition +#include +#include +#include +#include +#include +#include + +// Data structures +#include +#include +#include +#include + +// Miscellaneous +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#endif // FST_LIB_FSTLIB_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/generic-register.h b/extlibs/openfstwin-1.3.1/include/fst/generic-register.h new file mode 100755 index 00000000000..a98a14232b6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/generic-register.h @@ -0,0 +1,163 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_LIB_GENERIC_REGISTER_H_ +#define FST_LIB_GENERIC_REGISTER_H_ + +#include +#include + +#include +#include + +// Generic class representing a globally-stored correspondence between +// objects of KeyType and EntryType. +// KeyType must: +// a) be such as can be stored as a key in a map<> +// b) be concatenable with a const char* with the + operator +// (or you must subclass and redefine LoadEntryFromSharedObject) +// EntryType must be default constructible. +// +// The third template parameter should be the type of a subclass of this class +// (think CRTP). This is to allow GetRegister() to instantiate and return +// an object of the appropriate type. + +namespace fst { + +template +class GenericRegister { + public: + typedef KeyType Key; + typedef EntryType Entry; + + static RegisterType *GetRegister() { + FstOnceInit(®ister_init_, + &RegisterType::Init); + + return register_; + } + + void SetEntry(const KeyType &key, + const EntryType &entry) { + MutexLock l(register_lock_); + + register_table_.insert(make_pair(key, entry)); + } + + EntryType GetEntry(const KeyType &key) const { + const EntryType *entry = LookupEntry(key); + if (entry) { + return *entry; + } else { + return LoadEntryFromSharedObject(key); + } + } + + virtual ~GenericRegister() { } + + protected: + // Override this if you want to be able to load missing definitions from + // shared object files. + virtual EntryType LoadEntryFromSharedObject(const KeyType &key) const { + string so_filename = ConvertKeyToSoFilename(key); + + #ifndef _MSC_VER //AddedPD + void *handle = dlopen(so_filename.c_str(), RTLD_LAZY); + if (handle == 0) { + LOG(ERROR) << "GenericRegister::GetEntry : " << dlerror(); + return EntryType(); + } + #endif //ChangedPD + + // We assume that the DSO constructs a static object in its global + // scope that does the registration. Thus we need only load it, not + // call any methods. + const EntryType *entry = this->LookupEntry(key); + if (entry == 0) { + LOG(ERROR) << "GenericRegister::GetEntry : " + << "lookup failed in shared object: " << so_filename; + return EntryType(); + } + return *entry; + } + + // Override this to define how to turn a key into an SO filename. + virtual string ConvertKeyToSoFilename(const KeyType& key) const = 0; + + virtual const EntryType *LookupEntry( + const KeyType &key) const { + MutexLock l(register_lock_); + + typename RegisterMapType::const_iterator it = register_table_.find(key); + + if (it != register_table_.end()) { + return &it->second; + } else { + return 0; + } + } + + private: + typedef map RegisterMapType; + + static void Init() { + register_lock_ = new Mutex; + register_ = new RegisterType; + } + + OPENFSTDLL static FstOnceType register_init_; //ChangedPD + OPENFSTDLL static Mutex *register_lock_; //ChangedPD + OPENFSTDLL static RegisterType *register_; //ChangedPD + + RegisterMapType register_table_; +}; + + +#ifdef OPENFSTEXPORT //ChangedPD +template +FstOnceType GenericRegister::register_init_ = FST_ONCE_INIT; + +template +Mutex *GenericRegister::register_lock_ = 0; + +template +RegisterType *GenericRegister::register_ = 0; +#endif //ChangedPD +// +// GENERIC REGISTRATION +// + +// Generic register-er class capable of creating new register entries in the +// given RegisterType template parameter. This type must define types Key +// and Entry, and have appropriate static GetRegister() and instance +// SetEntry() functions. An easy way to accomplish this is to have RegisterType +// be the type of a subclass of GenericRegister. +template +class GenericRegisterer { + public: + typedef typename RegisterType::Key Key; + typedef typename RegisterType::Entry Entry; + + GenericRegisterer(Key key, Entry entry) { + RegisterType *reg = RegisterType::GetRegister(); + reg->SetEntry(key, entry); + } +}; + +} // namespace fst + +#endif // FST_LIB_GENERIC_REGISTER_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/generic-register.h.bak b/extlibs/openfstwin-1.3.1/include/fst/generic-register.h.bak new file mode 100755 index 00000000000..bec7a155e83 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/generic-register.h.bak @@ -0,0 +1,161 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_LIB_GENERIC_REGISTER_H_ +#define FST_LIB_GENERIC_REGISTER_H_ + +#include +#include + +#include +#include + +// Generic class representing a globally-stored correspondence between +// objects of KeyType and EntryType. +// KeyType must: +// a) be such as can be stored as a key in a map<> +// b) be concatenable with a const char* with the + operator +// (or you must subclass and redefine LoadEntryFromSharedObject) +// EntryType must be default constructible. +// +// The third template parameter should be the type of a subclass of this class +// (think CRTP). This is to allow GetRegister() to instantiate and return +// an object of the appropriate type. + +namespace fst { + +template +class GenericRegister { + public: + typedef KeyType Key; + typedef EntryType Entry; + + static RegisterType *GetRegister() { + FstOnceInit(®ister_init_, + &RegisterType::Init); + + return register_; + } + + void SetEntry(const KeyType &key, + const EntryType &entry) { + MutexLock l(register_lock_); + + register_table_.insert(make_pair(key, entry)); + } + + EntryType GetEntry(const KeyType &key) const { + const EntryType *entry = LookupEntry(key); + if (entry) { + return *entry; + } else { + return LoadEntryFromSharedObject(key); + } + } + + virtual ~GenericRegister() { } + + protected: + // Override this if you want to be able to load missing definitions from + // shared object files. + virtual EntryType LoadEntryFromSharedObject(const KeyType &key) const { + string so_filename = ConvertKeyToSoFilename(key); + + #ifndef _MSC_VER //AddedPD + void *handle = dlopen(so_filename.c_str(), RTLD_LAZY); + if (handle == 0) { + LOG(ERROR) << "GenericRegister::GetEntry : " << dlerror(); + return EntryType(); + } + #endif //ChangedPD + + // We assume that the DSO constructs a static object in its global + // scope that does the registration. Thus we need only load it, not + // call any methods. + const EntryType *entry = this->LookupEntry(key); + if (entry == 0) { + LOG(ERROR) << "GenericRegister::GetEntry : " + << "lookup failed in shared object: " << so_filename; + return EntryType(); + } + return *entry; + } + + // Override this to define how to turn a key into an SO filename. + virtual string ConvertKeyToSoFilename(const KeyType& key) const = 0; + + virtual const EntryType *LookupEntry( + const KeyType &key) const { + MutexLock l(register_lock_); + + typename RegisterMapType::const_iterator it = register_table_.find(key); + + if (it != register_table_.end()) { + return &it->second; + } else { + return 0; + } + } + + private: + typedef map RegisterMapType; + + static void Init() { + register_lock_ = new Mutex; + register_ = new RegisterType; + } + + static FstOnceType register_init_; + static Mutex *register_lock_; + static RegisterType *register_; + + RegisterMapType register_table_; +}; + +template +FstOnceType GenericRegister::register_init_ = FST_ONCE_INIT; + +template +Mutex *GenericRegister::register_lock_ = 0; + +template +RegisterType *GenericRegister::register_ = 0; + +// +// GENERIC REGISTRATION +// + +// Generic register-er class capable of creating new register entries in the +// given RegisterType template parameter. This type must define types Key +// and Entry, and have appropriate static GetRegister() and instance +// SetEntry() functions. An easy way to accomplish this is to have RegisterType +// be the type of a subclass of GenericRegister. +template +class GenericRegisterer { + public: + typedef typename RegisterType::Key Key; + typedef typename RegisterType::Entry Entry; + + GenericRegisterer(Key key, Entry entry) { + RegisterType *reg = RegisterType::GetRegister(); + reg->SetEntry(key, entry); + } +}; + +} // namespace fst + +#endif // FST_LIB_GENERIC_REGISTER_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/heap.h b/extlibs/openfstwin-1.3.1/include/fst/heap.h new file mode 100755 index 00000000000..a7affbd4286 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/heap.h @@ -0,0 +1,206 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// All Rights Reserved. +// Author: Johan Schalkwyk (johans@google.com) +// +// \file +// Implementation of a heap as in STL, but allows tracking positions +// in heap using a key. The key can be used to do an in-place update of +// values in the heap. + +#ifndef FST_LIB_HEAP_H__ +#define FST_LIB_HEAP_H__ + +#include +using std::vector; +#include + +#include +namespace fst { + +// +// \class Heap +// \brief A templated heap implementation that support in-place update +// of values. +// +// The templated heap implementation is a little different from the +// STL priority_queue and the *_heap operations in STL. This heap +// supports indexing of values in the heap via an associated key. +// +// Each value is internally associated with a key which is returned +// to the calling functions on heap insert. This key can be used +// to later update the specific value in the heap. +// +// \param T the element type of the hash, can be POD, Data or Ptr to Data +// \param Compare Comparison class for determiningg min-heapness. +// \param whether heap top should be max or min element w.r.t. Compare +// + +static const int kNoKey = -1; +template +class Heap { + public: + + // Initialize with a specific comparator + Heap(Compare comp) : comp_(comp), size_(0) { } + + // Create a heap with initial size of internal arrays of 0 + Heap() : size_(0) { } + + ~Heap() { } + + // Insert a value into the heap + int Insert(const T& val) { + if (size_ < A_.size()) { + A_[size_] = val; + pos_[key_[size_]] = size_; + } else { + A_.push_back(val); + pos_.push_back(size_); + key_.push_back(size_); + } + + ++size_; + return Insert(val, size_ - 1); + } + + // Update a value at position given by the key. The pos array is first + // indexed by the key. The position gives the position in the heap array. + // Once we have the position we can then use the standard heap operations + // to calculate the parent and child positions. + void Update(int key, const T& val) { + int i = pos_[key]; + if (Better(val, A_[Parent(i)])) { + Insert(val, i); + } else { + A_[i] = val; + Heapify(i); + } + } + + // Return the greatest (max=true) / least (max=false) value w.r.t. + // from the heap. + T Pop() { + T top = A_[0]; + + Swap(0, size_-1); + size_--; + Heapify(0); + return top; + } + + // Return the greatest (max=true) / least (max=false) value w.r.t. + // comp object from the heap. + T Top() const { + return A_[0]; + } + + // Check if the heap is empty + bool Empty() const { + return size_ == 0; + } + + void Clear() { + size_ = 0; + } + + + // + // The following protected routines are used in a supportive role + // for managing the heap and keeping the heap properties. + // + private: + // Compute left child of parent + int Left(int i) { + return 2*(i+1)-1; // 0 -> 1, 1 -> 3 + } + + // Compute right child of parent + int Right(int i) { + return 2*(i+1); // 0 -> 2, 1 -> 4 + } + + // Given a child compute parent + int Parent(int i) { + return (i-1)/2; // 1 -> 0, 2 -> 0, 3 -> 1, 4-> 1 + } + + // Swap a child, parent. Use to move element up/down tree. + // Note a little tricky here. When we swap we need to swap: + // the value + // the associated keys + // the position of the value in the heap + void Swap(int j, int k) { + int tkey = key_[j]; + pos_[key_[j] = key_[k]] = j; + pos_[key_[k] = tkey] = k; + + T val = A_[j]; + A_[j] = A_[k]; + A_[k] = val; + } + + // Returns the greater (max=true) / least (max=false) of two + // elements. + bool Better(const T& x, const T& y) { + return max ? comp_(y, x) : comp_(x, y); + } + + // Heapify subtree rooted at index i. + void Heapify(int i) { + int l = Left(i); + int r = Right(i); + int largest; + + if (l < size_ && Better(A_[l], A_[i]) ) + largest = l; + else + largest = i; + + if (r < size_ && Better(A_[r], A_[largest]) ) + largest = r; + + if (largest != i) { + Swap(i, largest); + Heapify(largest); + } + } + + + // Insert (update) element at subtree rooted at index i + int Insert(const T& val, int i) { + int p; + while (i > 0 && !Better(A_[p = Parent(i)], val)) { + Swap(i, p); + i = p; + } + + return key_[i]; + } + + private: + Compare comp_; + + vector pos_; + vector key_; + vector A_; + int size_; + + // DISALLOW_COPY_AND_ASSIGN(Heap); +}; + +} // namespace fst + +#endif // FST_LIB_HEAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/icu.h b/extlibs/openfstwin-1.3.1/include/fst/icu.h new file mode 100755 index 00000000000..58e19a67d00 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/icu.h @@ -0,0 +1,116 @@ +// icu.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: sorenj@google.com (Jeffrey Sorensen) +// roubert@google.com (Fredrik Roubert) +// +// This library implements an unrestricted Thompson/Pike UTF-8 parser and +// serializer. UTF-8 is a restricted subset of this byte stream encoding. See +// http://en.wikipedia.org/wiki/UTF-8 for a good description of the encoding +// details. + +#ifndef FST_LIB_ICU_H_ +#define FST_LIB_ICU_H_ + +#include +#include +#include + +namespace fst { + +template +bool UTF8StringToLabels(const string &str, vector { + public: + using ComposeFst::CreateBase; + using ComposeFst::CreateBase1; + using ComposeFst::Properties; + using ImplToFst< ComposeFstImplBase >::GetImpl; + using ImplToFst< ComposeFstImplBase >::SetImpl; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + IntersectFst(const Fst &fst1, const Fst &fst2, + const CacheOptions opts = CacheOptions()) { + bool acceptors = fst1.Properties(kAcceptor, true) && + fst2.Properties(kAcceptor, true); + SetImpl(CreateBase(fst1, fst2, opts)); + if (!acceptors) { + FSTERROR() << "IntersectFst: input FSTs are not acceptors"; + GetImpl()->SetProperties(kError); + } + } + + template + IntersectFst(const Fst &fst1, const Fst &fst2, + const IntersectFstOptions &opts) { + bool acceptors = fst1.Properties(kAcceptor, true) && + fst2.Properties(kAcceptor, true); + SetImpl(CreateBase1(fst1, fst2, opts)); + if (!acceptors) { + FSTERROR() << "IntersectFst: input FSTs are not acceptors"; + GetImpl()->SetProperties(kError); + } + } + + // See Fst<>::Copy() for doc. + IntersectFst(const IntersectFst &fst, bool safe = false) : + ComposeFst(fst, safe) {} + + // Get a copy of this IntersectFst. See Fst<>::Copy() for further doc. + virtual IntersectFst *Copy(bool safe = false) const { + return new IntersectFst(*this, safe); + } +}; + + +// Specialization for IntersectFst. +template +class StateIterator< IntersectFst > + : public StateIterator< ComposeFst > { + public: + explicit StateIterator(const IntersectFst &fst) + : StateIterator< ComposeFst >(fst) {} +}; + + +// Specialization for IntersectFst. +template +class ArcIterator< IntersectFst > + : public ArcIterator< ComposeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const IntersectFst &fst, StateId s) + : ArcIterator< ComposeFst >(fst, s) {} +}; + +// Useful alias when using StdArc. +typedef IntersectFst StdIntersectFst; + + +typedef ComposeOptions IntersectOptions; + + +// Computes the intersection (Hadamard product) of two FSAs. This +// version writes the intersection to an output MurableFst. Only +// strings that are in both automata are retained in the result. +// +// The two arguments must be acceptors. One of the arguments must be +// label-sorted. +// +// Complexity: same as Compose. +// +// Caveats: same as Compose. +template +void Intersect(const Fst &ifst1, const Fst &ifst2, + MutableFst *ofst, + const IntersectOptions &opts = IntersectOptions()) { + typedef Matcher< Fst > M; + + if (opts.filter_type == AUTO_FILTER) { + CacheOptions nopts; + nopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = IntersectFst(ifst1, ifst2, nopts); + } else if (opts.filter_type == SEQUENCE_FILTER) { + IntersectFstOptions iopts; + iopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = IntersectFst(ifst1, ifst2, iopts); + } else if (opts.filter_type == ALT_SEQUENCE_FILTER) { + IntersectFstOptions > iopts; + iopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = IntersectFst(ifst1, ifst2, iopts); + } else if (opts.filter_type == MATCH_FILTER) { + IntersectFstOptions > iopts; + iopts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = IntersectFst(ifst1, ifst2, iopts); + } + + if (opts.connect) + Connect(ofst); +} + +} // namespace fst + +#endif // FST_LIB_INTERSECT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/interval-set.h b/extlibs/openfstwin-1.3.1/include/fst/interval-set.h new file mode 100755 index 00000000000..cf6ac54425a --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/interval-set.h @@ -0,0 +1,381 @@ +// interval-set.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to represent and operate on sets of intervals. + +#ifndef FST_LIB_INTERVAL_SET_H__ +#define FST_LIB_INTERVAL_SET_H__ + +#include +#include +using std::vector; + + +#include + + +namespace fst { + +// Stores and operates on a set of half-open integral intervals [a,b) +// of signed integers of type T. +template +class IntervalSet { + public: + struct Interval { + T begin; + T end; + + Interval() : begin(-1), end(-1) {} + + Interval(T b, T e) : begin(b), end(e) {} + + bool operator<(const Interval &i) const { + return begin < i.begin || (begin == i.begin && end > i.end); + } + + bool operator==(const Interval &i) const { + return begin == i.begin && end == i.end; + } + + bool operator!=(const Interval &i) const { + return begin != i.begin || end != i.end; + } + + istream &Read(istream &strm) { + T n; + ReadType(strm, &n); + begin = n; + ReadType(strm, &n); + end = n; + return strm; + } + + ostream &Write(ostream &strm) const { + T n = begin; + WriteType(strm, n); + n = end; + WriteType(strm, n); + return strm; + } + }; + + IntervalSet() : count_(-1) {} + + // Returns the interval set as a vector. + vector *Intervals() { return &intervals_; } + + const vector *Intervals() const { return &intervals_; } + + const bool Empty() const { return intervals_.empty(); } + + const T Size() const { return intervals_.size(); } + + // Number of points in the intervals (undefined if not normalized). + const T Count() const { return count_; } + + void Clear() { + intervals_.clear(); + count_ = 0; + } + + // Adds an interval set to the set. The result may not be normalized. + void Union(const IntervalSet &iset) { + const vector *intervals = iset.Intervals(); + for (typename vector::const_iterator it = intervals->begin(); + it != intervals->end(); ++it) + intervals_.push_back(*it); + } + + // Requires intervals be normalized. + bool Member(T value) const { + Interval interval(value, value); + typename vector::const_iterator lb = + lower_bound(intervals_.begin(), intervals_.end(), interval); + if (lb == intervals_.begin()) + return false; + return (--lb)->end > value; + } + + // Requires intervals be normalized. + bool operator==(const IntervalSet& iset) const { + return *(iset.Intervals()) == intervals_; + } + + // Requires intervals be normalized. + bool operator!=(const IntervalSet& iset) const { + return *(iset.Intervals()) != intervals_; + } + + bool Singleton() const { + return intervals_.size() == 1 && + intervals_[0].begin + 1 == intervals_[0].end; + } + + + // Sorts; collapses overlapping and adjacent interals; sets count. + void Normalize(); + + // Intersects an interval set with the set. Requires intervals be + // normalized. The result is normalized. + void Intersect(const IntervalSet &iset, IntervalSet *oset) const; + + // Complements the set w.r.t [0, maxval). Requires intervals be + // normalized. The result is normalized. + void Complement(T maxval, IntervalSet *oset) const; + + // Subtract an interval set from the set. Requires intervals be + // normalized. The result is normalized. + void Difference(const IntervalSet &iset, IntervalSet *oset) const; + + // Determines if an interval set overlaps with the set. Requires + // intervals be normalized. + bool Overlaps(const IntervalSet &iset) const; + + // Determines if an interval set overlaps with the set but neither + // is contained in the other. Requires intervals be normalized. + bool StrictlyOverlaps(const IntervalSet &iset) const; + + // Determines if an interval set is contained within the set. Requires + // intervals be normalized. + bool Contains(const IntervalSet &iset) const; + + istream &Read(istream &strm) { + ReadType(strm, &intervals_); + return ReadType(strm, &count_); + } + + ostream &Write(ostream &strm) const { + WriteType(strm, intervals_); + return WriteType(strm, count_); + } + + private: + vector intervals_; + T count_; +}; + +// Sorts; collapses overlapping and adjacent interavls; sets count. +template +void IntervalSet::Normalize() { + sort(intervals_.begin(), intervals_.end()); + + count_ = 0; + T size = 0; + for (T i = 0; i < intervals_.size(); ++i) { + Interval &inti = intervals_[i]; + if (inti.begin == inti.end) + continue; + for (T j = i + 1; j < intervals_.size(); ++j) { + Interval &intj = intervals_[j]; + if (intj.begin > inti.end) + break; + if (intj.end > inti.end) + inti.end = intj.end; + ++i; + } + count_ += inti.end - inti.begin; + intervals_[size++] = inti; + } + intervals_.resize(size); +} + +// Intersects an interval set with the set. Requires intervals be normalized. +// The result is normalized. +template +void IntervalSet::Intersect(const IntervalSet &iset, + IntervalSet *oset) const { + const vector *iintervals = iset.Intervals(); + vector *ointervals = oset->Intervals(); + typename vector::const_iterator it1 = intervals_.begin(); + typename vector::const_iterator it2 = iintervals->begin(); + + ointervals->clear(); + oset->count_ = 0; + + while (it1 != intervals_.end() && it2 != iintervals->end()) { + if (it1->end <= it2->begin) { + ++it1; + } else if (it2->end <= it1->begin) { + ++it2; + } else { + Interval interval; + interval.begin = max(it1->begin, it2->begin); + interval.end = min(it1->end, it2->end); + ointervals->push_back(interval); + oset->count_ += interval.end - interval.begin; + if (it1->end < it2->end) + ++it1; + else + ++it2; + } + } +} + +// Complements the set w.r.t [0, maxval). Requires intervals be normalized. +// The result is normalized. +template +void IntervalSet::Complement(T maxval, IntervalSet *oset) const { + vector *ointervals = oset->Intervals(); + ointervals->clear(); + oset->count_ = 0; + + Interval interval; + interval.begin = 0; + for (typename vector::const_iterator it = intervals_.begin(); + it != intervals_.end(); + ++it) { + interval.end = min(it->begin, maxval); + if (interval.begin < interval.end) { + ointervals->push_back(interval); + oset->count_ += interval.end - interval.begin; + } + interval.begin = it->end; + } + interval.end = maxval; + if (interval.begin < interval.end) { + ointervals->push_back(interval); + oset->count_ += interval.end - interval.begin; + } +} + +// Subtract an interval set from the set. Requires intervals be normalized. +// The result is normalized. +template +void IntervalSet::Difference(const IntervalSet &iset, + IntervalSet *oset) const { + if (intervals_.empty()) { + oset->Intervals()->clear(); + oset->count_ = 0; + } else { + IntervalSet cset; + iset.Complement(intervals_.back().end, &cset); + Intersect(cset, oset); + } +} + +// Determines if an interval set overlaps with the set. Requires +// intervals be normalized. +template +bool IntervalSet::Overlaps(const IntervalSet &iset) const { + const vector *intervals = iset.Intervals(); + typename vector::const_iterator it1 = intervals_.begin(); + typename vector::const_iterator it2 = intervals->begin(); + + while (it1 != intervals_.end() && it2 != intervals->end()) { + if (it1->end <= it2->begin) { + ++it1; + } else if (it2->end <= it1->begin) { + ++it2; + } else { + return true; + } + } + return false; +} + +// Determines if an interval set overlaps with the set but neither +// is contained in the other. Requires intervals be normalized. +template +bool IntervalSet::StrictlyOverlaps(const IntervalSet &iset) const { + const vector *intervals = iset.Intervals(); + typename vector::const_iterator it1 = intervals_.begin(); + typename vector::const_iterator it2 = intervals->begin(); + bool only1 = false; // point in intervals_ but not intervals + bool only2 = false; // point in intervals but not intervals_ + bool overlap = false; // point in both intervals_ and intervals + + while (it1 != intervals_.end() && it2 != intervals->end()) { + if (it1->end <= it2->begin) { // no overlap - it1 first + only1 = true; + ++it1; + } else if (it2->end <= it1->begin) { // no overlap - it2 first + only2 = true; + ++it2; + } else if (it2->begin == it1->begin && it2->end == it1->end) { // equals + overlap = true; + ++it1; + ++it2; + } else if (it2->begin <= it1->begin && it2->end >= it1->end) { // 1 c 2 + only2 = true; + overlap = true; + ++it1; + } else if (it1->begin <= it2->begin && it1->end >= it2->end) { // 2 c 1 + only1 = true; + overlap = true; + ++it2; + } else { // strict overlap + only1 = true; + only2 = true; + overlap = true; + } + if (only1 == true && only2 == true && overlap == true) + return true; + } + if (it1 != intervals_.end()) + only1 = true; + if (it2 != intervals->end()) + only2 = true; + + return only1 == true && only2 == true && overlap == true; +} + +// Determines if an interval set is contained within the set. Requires +// intervals be normalized. +template +bool IntervalSet::Contains(const IntervalSet &iset) const { + if (iset.Count() > Count()) + return false; + + const vector *intervals = iset.Intervals(); + typename vector::const_iterator it1 = intervals_.begin(); + typename vector::const_iterator it2 = intervals->begin(); + + while (it1 != intervals_.end() && it2 != intervals->end()) { + if (it1->end <= it2->begin) { // no overlap - it1 first + ++it1; + } else if (it2->begin < it1->begin || it2->end > it1->end) { // no C + return false; + } else if (it2->end == it1->end) { + ++it1; + ++it2; + } else { + ++it2; + } + } + return it2 == intervals->end(); +} + +template +ostream &operator<<(ostream &strm, const IntervalSet &s) { + typedef typename IntervalSet::Interval Interval; + const vector *intervals = s.Intervals(); + strm << "{"; + for (typename vector::const_iterator it = intervals->begin(); + it != intervals->end(); + ++it) { + if (it != intervals->begin()) + strm << ","; + strm << "[" << it->begin << "," << it->end << ")"; + } + strm << "}"; + return strm; +} + +} // namespace fst + +#endif // FST_LIB_INTERVAL_SET_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/invert.h b/extlibs/openfstwin-1.3.1/include/fst/invert.h new file mode 100755 index 00000000000..bc83a5d11e2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/invert.h @@ -0,0 +1,125 @@ +// invert.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to invert an Fst. + +#ifndef FST_LIB_INVERT_H__ +#define FST_LIB_INVERT_H__ + +#include +#include + + +namespace fst { + +// Mapper to implement inversion of an arc. +template struct InvertMapper { + InvertMapper() {} + + A operator()(const A &arc) { + return A(arc.olabel, arc.ilabel, arc.weight, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_CLEAR_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_CLEAR_SYMBOLS;} + + uint64 Properties(uint64 props) { return InvertProperties(props); } +}; + + +// Inverts the transduction corresponding to an FST by exchanging the +// FST's input and output labels. This version modifies its input. +// +// Complexity: +// - Time: O(V + E) +// - Space: O(1) +// where V = # of states and E = # of arcs. +template inline +void Invert(MutableFst *fst) { + SymbolTable *input = fst->InputSymbols() ? fst->InputSymbols()->Copy() : 0; + SymbolTable *output = fst->OutputSymbols() ? fst->OutputSymbols()->Copy() : 0; + ArcMap(fst, InvertMapper()); + fst->SetInputSymbols(output); + fst->SetOutputSymbols(input); + delete input; + delete output; +} + + +// Inverts the transduction corresponding to an FST by exchanging the +// FST's input and output labels. This version is a delayed Fst. +// +// Complexity: +// - Time: O(v + e) +// - Space: O(1) +// where v = # of states visited, e = # of arcs visited. Constant +// time and to visit an input state or arc is assumed and exclusive +// of caching. +template +class InvertFst : public ArcMapFst > { + public: + typedef A Arc; + typedef InvertMapper C; + typedef ArcMapFstImpl< A, A, InvertMapper > Impl; + using ImplToFst::GetImpl; + + explicit InvertFst(const Fst &fst) : ArcMapFst(fst, C()) { + GetImpl()->SetOutputSymbols(fst.InputSymbols()); + GetImpl()->SetInputSymbols(fst.OutputSymbols()); + } + + // See Fst<>::Copy() for doc. + InvertFst(const InvertFst &fst, bool safe = false) + : ArcMapFst(fst, safe) {} + + // Get a copy of this InvertFst. See Fst<>::Copy() for further doc. + virtual InvertFst *Copy(bool safe = false) const { + return new InvertFst(*this, safe); + } +}; + + +// Specialization for InvertFst. +template +class StateIterator< InvertFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const InvertFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for InvertFst. +template +class ArcIterator< InvertFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const InvertFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Useful alias when using StdArc. +typedef InvertFst StdInvertFst; + +} // namespace fst + +#endif // FST_LIB_INVERT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/label-reachable.h b/extlibs/openfstwin-1.3.1/include/fst/label-reachable.h new file mode 100755 index 00000000000..a7c336069fd --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/label-reachable.h @@ -0,0 +1,565 @@ +// label_reachable.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to determine if a non-epsilon label can be read as the +// first non-epsilon symbol along some path from a given state. + + +#ifndef FST_LIB_LABEL_REACHABLE_H__ +#define FST_LIB_LABEL_REACHABLE_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +// Stores shareable data for label reachable class copies. +template +class LabelReachableData { + public: + typedef L Label; + typedef typename IntervalSet::Interval Interval; + + explicit LabelReachableData(bool reach_input, bool keep_relabel_data = true) + : reach_input_(reach_input), + keep_relabel_data_(keep_relabel_data), + have_relabel_data_(true), + final_label_(kNoLabel) {} + + ~LabelReachableData() {} + + bool ReachInput() const { return reach_input_; } + + vector< IntervalSet > *IntervalSets() { return &isets_; } + + unordered_map *Label2Index() { + if (!have_relabel_data_) + FSTERROR() << "LabelReachableData: no relabeling data"; + return &label2index_; + } + + Label FinalLabel() { + if (final_label_ == kNoLabel) + final_label_ = label2index_[kNoLabel]; + return final_label_; + } + + static LabelReachableData *Read(istream &istrm) { + LabelReachableData *data = new LabelReachableData(); + + ReadType(istrm, &data->reach_input_); + ReadType(istrm, &data->keep_relabel_data_); + data->have_relabel_data_ = data->keep_relabel_data_; + if (data->keep_relabel_data_) + ReadType(istrm, &data->label2index_); + ReadType(istrm, &data->final_label_); + ReadType(istrm, &data->isets_); + return data; + } + + bool Write(ostream &ostrm) { + WriteType(ostrm, reach_input_); + WriteType(ostrm, keep_relabel_data_); + if (keep_relabel_data_) + WriteType(ostrm, label2index_); + WriteType(ostrm, FinalLabel()); + WriteType(ostrm, isets_); + return true; + } + + int RefCount() const { return ref_count_.count(); } + int IncrRefCount() { return ref_count_.Incr(); } + int DecrRefCount() { return ref_count_.Decr(); } + + private: + LabelReachableData() {} + + bool reach_input_; // Input or output labels considered? + bool keep_relabel_data_; // Save label2index_ to file? + bool have_relabel_data_; // Using label2index_? + Label final_label_; // Final label + RefCounter ref_count_; // Reference count. + unordered_map label2index_; // Finds index for a label. + vector > isets_; // Interval sets per state. + + DISALLOW_COPY_AND_ASSIGN(LabelReachableData); +}; + + +// Tests reachability of labels from a given state. If reach_input = +// true, then input labels are considered, o.w. output labels are +// considered. To test for reachability from a state s, first do +// SetState(s). Then a label l can be reached from state s of FST f +// iff Reach(r) is true where r = Relabel(l). The relabeling is +// required to ensure a compact representation of the reachable +// labels. + +// The whole FST can be relabeled instead with Relabel(&f, +// reach_input) so that the test Reach(r) applies directly to the +// labels of the transformed FST f. The relabeled FST will also be +// sorted appropriately for composition. +// +// Reachablity of a final state from state s (via an epsilon path) +// can be tested with ReachFinal(); +// +// Reachability can also be tested on the set of labels specified by +// an arc iterator, useful for FST composition. In particular, +// Reach(aiter, ...) is true if labels on the input (output) side of +// the transitions of the arc iterator, when iter_input is true +// (false), can be reached from the state s. The iterator labels must +// have already been relabeled. +// +// With the arc iterator test of reachability, the begin position, end +// position and accumulated arc weight of the matches can be +// returned. The optional template argument controls how reachable arc +// weights are accumulated. The default uses the semiring +// Plus(). Alternative ones can be used to distribute the weights in +// composition in various ways. +template > +class LabelReachable { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename IntervalSet &fst, bool reach_input, S *s = 0, + bool keep_relabel_data = true) + : fst_(new VectorFst(fst)), + s_(kNoStateId), + data_(new LabelReachableData &fst, bool reach_input, S *s = 0, + bool keep_relabel_data = true) + : fst_(new VectorFst(fst)), + s_(kNoStateId), + data_(new LabelReachableData > M; + typedef SequenceComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for MATCH_INPUT to allow lookahead. +template +class DefaultLookAhead { + public: + typedef LookAheadMatcher< Fst > M; + typedef SequenceComposeFilter SF; + typedef LookAheadComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for MATCH_OUTPUT to allow lookahead. +template +class DefaultLookAhead { + public: + typedef LookAheadMatcher< Fst > M; + typedef AltSequenceComposeFilter SF; + typedef LookAheadComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for StdArc to allow weight and label pushing. +template <> +class DefaultLookAhead { + public: + typedef StdArc A; + typedef LookAheadMatcher< Fst > M; + typedef SequenceComposeFilter SF; + typedef LookAheadComposeFilter LF; + typedef PushWeightsComposeFilter WF; + typedef PushLabelsComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for StdArc to allow weight and label pushing. +template <> +class DefaultLookAhead { + public: + typedef StdArc A; + typedef LookAheadMatcher< Fst > M; + typedef AltSequenceComposeFilter SF; + typedef LookAheadComposeFilter LF; + typedef PushWeightsComposeFilter WF; + typedef PushLabelsComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for LogArc to allow weight and label pushing. +template <> +class DefaultLookAhead { + public: + typedef LogArc A; + typedef LookAheadMatcher< Fst > M; + typedef SequenceComposeFilter SF; + typedef LookAheadComposeFilter LF; + typedef PushWeightsComposeFilter WF; + typedef PushLabelsComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +// Specializes for LogArc to allow weight and label pushing. +template <> +class DefaultLookAhead { + public: + typedef LogArc A; + typedef LookAheadMatcher< Fst > M; + typedef AltSequenceComposeFilter SF; + typedef LookAheadComposeFilter LF; + typedef PushWeightsComposeFilter WF; + typedef PushLabelsComposeFilter ComposeFilter; + typedef M FstMatcher; +}; + +} // namespace fst + +#endif // FST_LIB_LOOKAHEAD_FILTER_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/lookahead-matcher.h b/extlibs/openfstwin-1.3.1/include/fst/lookahead-matcher.h new file mode 100755 index 00000000000..10d9c010f56 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/lookahead-matcher.h @@ -0,0 +1,813 @@ +// lookahead-matcher.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes to add lookahead to FST matchers, useful e.g. for improving +// composition efficiency with certain inputs. + +#ifndef FST_LIB_LOOKAHEAD_MATCHER_H__ +#define FST_LIB_LOOKAHEAD_MATCHER_H__ + +#include +#include +#include +#include +#include + + +DECLARE_string(save_relabel_ipairs); +DECLARE_string(save_relabel_opairs); + +namespace fst { + +// LOOKAHEAD MATCHERS - these have the interface of Matchers (see +// matcher.h) and these additional methods: +// +// template +// class LookAheadMatcher { +// public: +// typedef F FST; +// typedef F::Arc Arc; +// typedef typename Arc::StateId StateId; +// typedef typename Arc::Label Label; +// typedef typename Arc::Weight Weight; +// +// // Required constructors. +// LookAheadMatcher(const F &fst, MatchType match_type); +// // If safe=true, the copy is thread-safe (except the lookahead Fst is +// // preserved). See Fst<>::Cop() for further doc. +// LookAheadMatcher(const LookAheadMatcher &matcher, bool safe = false); +// +// Below are methods for looking ahead for a match to a label and +// more generally, to a rational set. Each returns false if there is +// definitely not a match and returns true if there possibly is a +// match. + +// // LABEL LOOKAHEAD: Can 'label' be read from the current matcher state +// // after possibly following epsilon transitions? +// bool LookAheadLabel(Label label) const; +// +// // RATIONAL LOOKAHEAD: The next methods allow looking ahead for an +// // arbitrary rational set of strings, specified by an FST and a state +// // from which to begin the matching. If the lookahead FST is a +// // transducer, this looks on the side different from the matcher +// // 'match_type' (cf. composition). +// +// // Are there paths P from 's' in the lookahead FST that can be read from +// // the cur. matcher state? +// bool LookAheadFst(const Fst& fst, StateId s); +// +// // Gives an estimate of the combined weight of the paths P in the +// // lookahead and matcher FSTs for the last call to LookAheadFst. +// // A trivial implementation returns Weight::One(). Non-trivial +// // implementations are useful for weight-pushing in composition. +// Weight LookAheadWeight() const; +// +// // Is there is a single non-epsilon arc found in the lookahead FST +// // that begins P (after possibly following any epsilons) in the last +// // call LookAheadFst? If so, return true and copy it to '*arc', o.w. +// // return false. A trivial implementation returns false. Non-trivial +// // implementations are useful for label-pushing in composition. +// bool LookAheadPrefix(Arc *arc); +// +// // Optionally pre-specifies the lookahead FST that will be passed +// // to LookAheadFst() for possible precomputation. If copy is true, +// // then 'fst' is a copy of the FST used in the previous call to +// // this method (useful to avoid unnecessary updates). +// void InitLookAheadFst(const Fst& fst, bool copy = false); +// +// }; + +// +// LOOK-AHEAD FLAGS (see also kMatcherFlags in matcher.h): +// +// Matcher is a lookahead matcher when 'match_type' is MATCH_INPUT. +const uint32 kInputLookAheadMatcher = 0x00000001; + +// Matcher is a lookahead matcher when 'match_type' is MATCH_OUTPUT. +const uint32 kOutputLookAheadMatcher = 0x00000002; + +// A non-trivial implementation of LookAheadWeight() method defined and +// should be used? +const uint32 kLookAheadWeight = 0x00000004; + +// A non-trivial implementation of LookAheadPrefix() method defined and +// should be used? +const uint32 kLookAheadPrefix = 0x00000008; + +// Look-ahead of matcher FST non-epsilon arcs? +const uint32 kLookAheadNonEpsilons = 0x00000010; + +// Look-ahead of matcher FST epsilon arcs? +const uint32 kLookAheadEpsilons = 0x00000020; + +// Ignore epsilon paths for the lookahead prefix? Note this gives +// correct results in composition only with an appropriate composition +// filter since it depends on the filter blocking the ignored paths. +const uint32 kLookAheadNonEpsilonPrefix = 0x00000040; + +// For LabelLookAheadMatcher, save relabeling data to file +const uint32 kLookAheadKeepRelabelData = 0x00000080; + +// Flags used for lookahead matchers. +const uint32 kLookAheadFlags = 0x000000ff; + +// LookAhead Matcher interface, templated on the Arc definition; used +// for lookahead matcher specializations that are returned by the +// InitMatcher() Fst method. +template +class LookAheadMatcherBase : public MatcherBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + LookAheadMatcherBase() + : weight_(Weight::One()), + prefix_arc_(kNoLabel, kNoLabel, Weight::One(), kNoStateId) {} + + virtual ~LookAheadMatcherBase() {} + + bool LookAheadLabel(Label label) const { return LookAheadLabel_(label); } + + bool LookAheadFst(const Fst &fst, StateId s) { + return LookAheadFst_(fst, s); + } + + Weight LookAheadWeight() const { return weight_; } + + bool LookAheadPrefix(Arc *arc) const { + if (prefix_arc_.nextstate != kNoStateId) { + *arc = prefix_arc_; + return true; + } else { + return false; + } + } + + virtual void InitLookAheadFst(const Fst& fst, bool copy = false) = 0; + + protected: + void SetLookAheadWeight(const Weight &w) { weight_ = w; } + + void SetLookAheadPrefix(const Arc &arc) { prefix_arc_ = arc; } + + void ClearLookAheadPrefix() { prefix_arc_.nextstate = kNoStateId; } + + private: + virtual bool LookAheadLabel_(Label label) const = 0; + virtual bool LookAheadFst_(const Fst &fst, + StateId s) = 0; // This must set l.a. weight and + // prefix if non-trivial. + Weight weight_; // Look-ahead weight + Arc prefix_arc_; // Look-ahead prefix arc +}; + + +// Don't really lookahead, just declare future looks good regardless. +template +class TrivialLookAheadMatcher + : public LookAheadMatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + TrivialLookAheadMatcher(const FST &fst, MatchType match_type) + : matcher_(fst, match_type) {} + + TrivialLookAheadMatcher(const TrivialLookAheadMatcher &lmatcher, + bool safe = false) + : matcher_(lmatcher.matcher_, safe) {} + + // General matcher methods + TrivialLookAheadMatcher *Copy(bool safe = false) const { + return new TrivialLookAheadMatcher(*this, safe); + } + + MatchType Type(bool test) const { return matcher_.Type(test); } + void SetState(StateId s) { return matcher_.SetState(s); } + bool Find(Label label) { return matcher_.Find(label); } + bool Done() const { return matcher_.Done(); } + const Arc& Value() const { return matcher_.Value(); } + void Next() { matcher_.Next(); } + virtual const FST &GetFst() const { return matcher_.GetFst(); } + uint64 Properties(uint64 props) const { return matcher_.Properties(props); } + uint32 Flags() const { + return matcher_.Flags() | kInputLookAheadMatcher | kOutputLookAheadMatcher; + } + + // Look-ahead methods. + bool LookAheadLabel(Label label) const { return true; } + bool LookAheadFst(const Fst &fst, StateId s) {return true; } + Weight LookAheadWeight() const { return Weight::One(); } + bool LookAheadPrefix(Arc *arc) const { return false; } + void InitLookAheadFst(const Fst& fst, bool copy = false) {} + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + bool LookAheadLabel_(Label l) const { return LookAheadLabel(l); } + + bool LookAheadFst_(const Fst &fst, StateId s) { + return LookAheadFst(fst, s); + } + + Weight LookAheadWeight_() const { return LookAheadWeight(); } + bool LookAheadPrefix_(Arc *arc) const { return LookAheadPrefix(arc); } + + M matcher_; +}; + +// Look-ahead of one transition. Template argument F accepts flags to +// control behavior. +template +class ArcLookAheadMatcher + : public LookAheadMatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef NullAddOn MatcherData; + + using LookAheadMatcherBase::LookAheadWeight; + using LookAheadMatcherBase::SetLookAheadPrefix; + using LookAheadMatcherBase::SetLookAheadWeight; + using LookAheadMatcherBase::ClearLookAheadPrefix; + + ArcLookAheadMatcher(const FST &fst, MatchType match_type, + MatcherData *data = 0) + : matcher_(fst, match_type), + fst_(matcher_.GetFst()), + lfst_(0), + s_(kNoStateId) {} + + ArcLookAheadMatcher(const ArcLookAheadMatcher &lmatcher, + bool safe = false) + : matcher_(lmatcher.matcher_, safe), + fst_(matcher_.GetFst()), + lfst_(lmatcher.lfst_), + s_(kNoStateId) {} + + // General matcher methods + ArcLookAheadMatcher *Copy(bool safe = false) const { + return new ArcLookAheadMatcher(*this, safe); + } + + MatchType Type(bool test) const { return matcher_.Type(test); } + + void SetState(StateId s) { + s_ = s; + matcher_.SetState(s); + } + + bool Find(Label label) { return matcher_.Find(label); } + bool Done() const { return matcher_.Done(); } + const Arc& Value() const { return matcher_.Value(); } + void Next() { matcher_.Next(); } + const FST &GetFst() const { return fst_; } + uint64 Properties(uint64 props) const { return matcher_.Properties(props); } + uint32 Flags() const { + return matcher_.Flags() | kInputLookAheadMatcher | + kOutputLookAheadMatcher | F; + } + + // Writable matcher methods + MatcherData *GetData() const { return 0; } + + // Look-ahead methods. + bool LookAheadLabel(Label label) const { return matcher_.Find(label); } + + // Checks if there is a matching (possibly super-final) transition + // at (s_, s). + bool LookAheadFst(const Fst &fst, StateId s); + + void InitLookAheadFst(const Fst& fst, bool copy = false) { + lfst_ = &fst; + } + + private: + // This allows base class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + bool LookAheadLabel_(Label l) const { return LookAheadLabel(l); } + bool LookAheadFst_(const Fst &fst, StateId s) { + return LookAheadFst(fst, s); + } + + mutable M matcher_; + const FST &fst_; // Matcher FST + const Fst *lfst_; // Look-ahead FST + StateId s_; // Matcher state +}; + +template +bool ArcLookAheadMatcher::LookAheadFst(const Fst &fst, StateId s) { + if (&fst != lfst_) + InitLookAheadFst(fst); + + bool ret = false; + ssize_t nprefix = 0; + if (F & kLookAheadWeight) + SetLookAheadWeight(Weight::Zero()); + if (F & kLookAheadPrefix) + ClearLookAheadPrefix(); + if (fst_.Final(s_) != Weight::Zero() && + lfst_->Final(s) != Weight::Zero()) { + if (!(F & (kLookAheadWeight | kLookAheadPrefix))) + return true; + ++nprefix; + if (F & kLookAheadWeight) + SetLookAheadWeight(Plus(LookAheadWeight(), + Times(fst_.Final(s_), lfst_->Final(s)))); + ret = true; + } + if (matcher_.Find(kNoLabel)) { + if (!(F & (kLookAheadWeight | kLookAheadPrefix))) + return true; + ++nprefix; + if (F & kLookAheadWeight) + for (; !matcher_.Done(); matcher_.Next()) + SetLookAheadWeight(Plus(LookAheadWeight(), matcher_.Value().weight)); + ret = true; + } + for (ArcIterator< Fst > aiter(*lfst_, s); + !aiter.Done(); + aiter.Next()) { + const Arc &arc = aiter.Value(); + Label label = kNoLabel; + switch (matcher_.Type(false)) { + case MATCH_INPUT: + label = arc.olabel; + break; + case MATCH_OUTPUT: + label = arc.ilabel; + break; + default: + FSTERROR() << "ArcLookAheadMatcher::LookAheadFst: bad match type"; + return true; + } + if (label == 0) { + if (!(F & (kLookAheadWeight | kLookAheadPrefix))) + return true; + if (!(F & kLookAheadNonEpsilonPrefix)) + ++nprefix; + if (F & kLookAheadWeight) + SetLookAheadWeight(Plus(LookAheadWeight(), arc.weight)); + ret = true; + } else if (matcher_.Find(label)) { + if (!(F & (kLookAheadWeight | kLookAheadPrefix))) + return true; + for (; !matcher_.Done(); matcher_.Next()) { + ++nprefix; + if (F & kLookAheadWeight) + SetLookAheadWeight(Plus(LookAheadWeight(), + Times(arc.weight, + matcher_.Value().weight))); + if ((F & kLookAheadPrefix) && nprefix == 1) + SetLookAheadPrefix(arc); + } + ret = true; + } + } + if (F & kLookAheadPrefix) { + if (nprefix == 1) + SetLookAheadWeight(Weight::One()); // Avoids double counting. + else + ClearLookAheadPrefix(); + } + return ret; +} + + +// Template argument F accepts flags to control behavior. +// It must include precisely one of KInputLookAheadMatcher or +// KOutputLookAheadMatcher. +template > +class LabelLookAheadMatcher + : public LookAheadMatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef LabelReachableData *fst, const L &mfst, + bool relabel_input) { + typename L::Impl *impl = mfst.GetImpl(); + D *data = impl->GetAddOn(); + LabelReachable reachable(data->First() ? + data->First() : data->Second()); + reachable.Relabel(fst, relabel_input); + } + + // Returns relabeling pairs (cf. relabel.h::Relabel()). + // Class L should be a label-lookahead Fst. + // If 'avoid_collisions' is true, extra pairs are added to + // ensure no collisions when relabeling automata that have + // labels unseen here. + template + static void RelabelPairs(const L &mfst, vector > *pairs, + bool avoid_collisions = false) { + typename L::Impl *impl = mfst.GetImpl(); + D *data = impl->GetAddOn(); + LabelReachable reachable(data->First() ? + data->First() : data->Second()); + reachable.RelabelPairs(pairs, avoid_collisions); + } +}; + +template +template inline +LabelLookAheadRelabeler::LabelLookAheadRelabeler(I **impl) { + Fst &fst = (*impl)->GetFst(); + D *data = (*impl)->GetAddOn(); + const string name = (*impl)->Type(); + bool is_mutable = fst.Properties(kMutable, false); + MutableFst *mfst = 0; + if (is_mutable) { + mfst = static_cast *>(&fst); + } else { + mfst = new VectorFst(fst); + data->IncrRefCount(); + delete *impl; + } + if (data->First()) { // reach_input + LabelReachable reachable(data->First()); + reachable.Relabel(mfst, true); + if (!FLAGS_save_relabel_ipairs.empty()) { + vector > pairs; + reachable.RelabelPairs(&pairs, true); + WriteLabelPairs(FLAGS_save_relabel_ipairs, pairs); + } + } else { + LabelReachable reachable(data->Second()); + reachable.Relabel(mfst, false); + if (!FLAGS_save_relabel_opairs.empty()) { + vector > pairs; + reachable.RelabelPairs(&pairs, true); + WriteLabelPairs(FLAGS_save_relabel_opairs, pairs); + } + } + if (!is_mutable) { + *impl = new I(*mfst, name); + (*impl)->SetAddOn(data); + delete mfst; + data->DecrRefCount(); + } +} + + +// Generic lookahead matcher, templated on the FST definition +// - a wrapper around pointer to specific one. +template +class LookAheadMatcher { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef LookAheadMatcherBase LBase; + + LookAheadMatcher(const F &fst, MatchType match_type) { + base_ = fst.InitMatcher(match_type); + if (!base_) + base_ = new SortedMatcher(fst, match_type); + lookahead_ = false; + } + + LookAheadMatcher(const LookAheadMatcher &matcher, bool safe = false) { + base_ = matcher.base_->Copy(safe); + lookahead_ = matcher.lookahead_; + } + + ~LookAheadMatcher() { delete base_; } + + // General matcher methods + LookAheadMatcher *Copy(bool safe = false) const { + return new LookAheadMatcher(*this, safe); + } + + MatchType Type(bool test) const { return base_->Type(test); } + void SetState(StateId s) { base_->SetState(s); } + bool Find(Label label) { return base_->Find(label); } + bool Done() const { return base_->Done(); } + const Arc& Value() const { return base_->Value(); } + void Next() { base_->Next(); } + const F &GetFst() const { return static_cast(base_->GetFst()); } + + uint64 Properties(uint64 props) const { return base_->Properties(props); } + + uint32 Flags() const { return base_->Flags(); } + + // Look-ahead methods + bool LookAheadLabel(Label label) const { + if (LookAheadCheck()) { + LBase *lbase = static_cast(base_); + return lbase->LookAheadLabel(label); + } else { + return true; + } + } + + bool LookAheadFst(const Fst &fst, StateId s) { + if (LookAheadCheck()) { + LBase *lbase = static_cast(base_); + return lbase->LookAheadFst(fst, s); + } else { + return true; + } + } + + Weight LookAheadWeight() const { + if (LookAheadCheck()) { + LBase *lbase = static_cast(base_); + return lbase->LookAheadWeight(); + } else { + return Weight::One(); + } + } + + bool LookAheadPrefix(Arc *arc) const { + if (LookAheadCheck()) { + LBase *lbase = static_cast(base_); + return lbase->LookAheadPrefix(arc); + } else { + return false; + } + } + + void InitLookAheadFst(const Fst& fst, bool copy = false) { + if (LookAheadCheck()) { + LBase *lbase = static_cast(base_); + lbase->InitLookAheadFst(fst, copy); + } + } + + private: + bool LookAheadCheck() const { + if (!lookahead_) { + lookahead_ = base_->Flags() & + (kInputLookAheadMatcher | kOutputLookAheadMatcher); + if (!lookahead_) { + FSTERROR() << "LookAheadMatcher: No look-ahead matcher defined"; + } + } + return lookahead_; + } + + MatcherBase *base_; + mutable bool lookahead_; + + void operator=(const LookAheadMatcher &); // disallow +}; + +} // namespace fst + +#endif // FST_LIB_LOOKAHEAD_MATCHER_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/map.h b/extlibs/openfstwin-1.3.1/include/fst/map.h new file mode 100755 index 00000000000..419cac4ab26 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/map.h @@ -0,0 +1,121 @@ +// map.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Compatability file for old-style Map() functions and MapFst class +// that have been renamed to ArcMap (cf. StateMap). + +#ifndef FST_LIB_MAP_H__ +#define FST_LIB_MAP_H__ + + +#include + + +namespace fst { + +template +void Map(MutableFst *fst, C* mapper) { + ArcMap(fst, mapper); +} + +template +void Map(MutableFst *fst, C mapper) { + ArcMap(fst, mapper); +} + +template +void Map(const Fst &ifst, MutableFst *ofst, C* mapper) { + ArcMap(ifst, ofst, mapper); +} + +template +void Map(const Fst &ifst, MutableFst *ofst, C mapper) { + ArcMap(ifst, ofst, mapper); +} + +typedef ArcMapFstOptions MapFstOptions; + +template +class MapFst : public ArcMapFst { + public: + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + typedef CacheState State; + + MapFst(const Fst &fst, const C &mapper, const MapFstOptions& opts) + : ArcMapFst(fst, mapper, opts) {} + + MapFst(const Fst &fst, C* mapper, const MapFstOptions& opts) + : ArcMapFst(fst, mapper, opts) {} + + MapFst(const Fst &fst, const C &mapper) + : ArcMapFst(fst, mapper) {} + + MapFst(const Fst &fst, C* mapper) : ArcMapFst(fst, mapper) {} + + // See Fst<>::Copy() for doc. + MapFst(const ArcMapFst &fst, bool safe = false) + : ArcMapFst(fst, safe) {} + + // Get a copy of this MapFst. See Fst<>::Copy() for further doc. +virtual MapFst *Copy(bool safe = false) const { + return new MapFst(*this, safe); + } +}; + + +// Specialization for MapFst. +template +class StateIterator< MapFst > + : public StateIterator< ArcMapFst > { + public: + explicit StateIterator(const ArcMapFst &fst) + : StateIterator< ArcMapFst >(fst) {} +}; + + +// Specialization for MapFst. +template +class ArcIterator< MapFst > + : public ArcIterator< ArcMapFst > { + public: + ArcIterator(const ArcMapFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst >(fst, s) {} +}; + + +template +struct IdentityMapper { + typedef A FromArc; + typedef A ToArc; + + A operator()(const A &arc) const { return arc; } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } +}; + +} // namespace fst + +#endif // FST_LIB_MAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/matcher-fst.h b/extlibs/openfstwin-1.3.1/include/fst/matcher-fst.h new file mode 100755 index 00000000000..73e64add6fe --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/matcher-fst.h @@ -0,0 +1,359 @@ +// matcher-fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to add a matcher to an FST. + +#ifndef FST_LIB_MATCHER_FST_FST_H__ +#define FST_LIB_MATCHER_FST_FST_H__ + +#include +#include +#include + + +namespace fst { + +// WRITABLE MATCHERS - these have the interface of Matchers (see +// matcher.h) and these additional methods: +// +// template +// class Matcher { +// public: +// typedef ... MatcherData; // Initialization data +// ... +// // Constructor with additional argument for external initialization +// // data; matcher increments its reference count on construction and +// // decrements the reference count, and if 0 deletes, on destruction. +// Matcher(const F &fst, MatchType type, MatcherData *data); +// +// // Returns pointer to initialization data that can be +// // passed to a Matcher constructor. +// MatcherData *GetData() const; +// }; + +// The matcher initialization data class must have the form: +// class MatcherData { +// public: +// // Required copy constructor. +// MatcherData(const MatcherData &); +// // +// // Required I/O methods. +// static MatcherData *Read(istream &istrm); +// bool Write(ostream &ostrm); +// +// // Required reference counting. +// int RefCount() const; +// int IncrRefCount(); +// int DecrRefCount(); +// }; + +// Default MatcherFst initializer - does nothing. +template +class NullMatcherFstInit { + public: + typedef AddOnPair D; + typedef AddOnImpl Impl; + NullMatcherFstInit(Impl **) {} +}; + +// Class to add a matcher M to an Fst F. Creates a new Fst of type name N. +// Optional function object I can be used to initialize the Fst. +template > +class MatcherFst + : public ImplToExpandedFst< + AddOnImpl > > { + public: + friend class StateIterator< MatcherFst >; + friend class ArcIterator< MatcherFst >; + + typedef F FST; + typedef M FstMatcher; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef AddOnPair D; + typedef AddOnImpl Impl; + + MatcherFst() : ImplToExpandedFst(new Impl(F(), N)) {} + + explicit MatcherFst(const F &fst) + : ImplToExpandedFst(CreateImpl(fst, N)) {} + + explicit MatcherFst(const Fst &fst) + : ImplToExpandedFst(CreateImpl(fst, N)) {} + + // See Fst<>::Copy() for doc. + MatcherFst(const MatcherFst &fst, bool safe = false) + : ImplToExpandedFst(fst, safe) {} + + // Get a copy of this MatcherFst. See Fst<>::Copy() for further doc. + virtual MatcherFst *Copy(bool safe = false) const { + return new MatcherFst(*this, safe); + } + + // Read a MatcherFst from an input stream; return NULL on error + static MatcherFst *Read(istream &strm, + const FstReadOptions &opts) { + Impl *impl = Impl::Read(strm, opts); + return impl ? new MatcherFst(impl) : 0; + } + + // Read a MatcherFst from a file; return NULL on error + // Empty filename reads from standard input + static MatcherFst *Read(const string &filename) { + Impl *impl = ImplToExpandedFst::Read(filename); + return impl ? new MatcherFst(impl) : 0; + } + + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + return GetImpl()->Write(strm, opts); + } + + virtual bool Write(const string &filename) const { + return Fst::WriteFile(filename); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + return GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + return GetImpl()->InitArcIterator(s, data); + } + + virtual M *InitMatcher(MatchType match_type) const { + return new M(GetFst(), match_type, GetData(match_type)); + } + + // Allows access to MatcherFst components. + Impl *GetImpl() const { + return ImplToFst >::GetImpl(); + } + + F& GetFst() const { return GetImpl()->GetFst(); } + + typename M::MatcherData *GetData(MatchType match_type) const { + D *data = GetImpl()->GetAddOn(); + return match_type == MATCH_INPUT ? data->First() : data->Second(); + } + + private: + static Impl *CreateImpl(const F &fst, const string &name) { + M imatcher(fst, MATCH_INPUT); + M omatcher(fst, MATCH_OUTPUT); + D *data = new D(imatcher.GetData(), omatcher.GetData()); + Impl *impl = new Impl(fst, name); + impl->SetAddOn(data); + I init(&impl); + data->DecrRefCount(); + return impl; + } + + static Impl *CreateImpl(const Fst &fst, const string &name) { + F ffst(fst); + return CreateImpl(ffst, name); + } + + explicit MatcherFst(Impl *impl) : ImplToExpandedFst(impl) {} + + // Makes visible to friends. + void SetImpl(Impl *impl, bool own_impl = true) { + ImplToFst< Impl, ExpandedFst >::SetImpl(impl, own_impl); + } + + void operator=(const MatcherFst &fst); // disallow +}; + + +// Specialization fo MatcherFst. +template +class StateIterator< MatcherFst > : public StateIterator { + public: + explicit StateIterator(const MatcherFst &fst) : + StateIterator(fst.GetImpl()->GetFst()) {} +}; + + +// Specialization for MatcherFst. +template +class ArcIterator< MatcherFst > : public ArcIterator { + public: + ArcIterator(const MatcherFst &fst, typename F::Arc::StateId s) + : ArcIterator(fst.GetImpl()->GetFst(), s) {} +}; + + +// Specialization for MatcherFst +template +class Matcher< MatcherFst > { + public: + typedef MatcherFst FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + + Matcher(const FST &fst, MatchType match_type) { + matcher_ = fst.InitMatcher(match_type); + } + + Matcher(const Matcher &matcher) { + matcher_ = matcher.matcher_->Copy(); + } + + ~Matcher() { delete matcher_; } + + Matcher *Copy() const { + return new Matcher(*this); + } + + MatchType Type(bool test) const { return matcher_->Type(test); } + void SetState(StateId s) { matcher_->SetState(s); } + bool Find(Label label) { return matcher_->Find(label); } + bool Done() const { return matcher_->Done(); } + const Arc& Value() const { return matcher_->Value(); } + void Next() { matcher_->Next(); } + uint64 Properties(uint64 props) const { return matcher_->Properties(props); } + uint32 Flags() const { return matcher_->Flags(); } + + private: + M *matcher_; + + void operator=(const Matcher &); // disallow +}; + + +// Specialization for MatcherFst +template +class LookAheadMatcher< MatcherFst > { + public: + typedef MatcherFst FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + LookAheadMatcher(const FST &fst, MatchType match_type) { + matcher_ = fst.InitMatcher(match_type); + } + + LookAheadMatcher(const LookAheadMatcher &matcher, bool safe = false) { + matcher_ = matcher.matcher_->Copy(safe); + } + + ~LookAheadMatcher() { delete matcher_; } + + // General matcher methods + LookAheadMatcher *Copy(bool safe = false) const { + return new LookAheadMatcher(*this, safe); + } + + MatchType Type(bool test) const { return matcher_->Type(test); } + void SetState(StateId s) { matcher_->SetState(s); } + bool Find(Label label) { return matcher_->Find(label); } + bool Done() const { return matcher_->Done(); } + const Arc& Value() const { return matcher_->Value(); } + void Next() { matcher_->Next(); } + const FST &GetFst() const { return matcher_->GetFst(); } + uint64 Properties(uint64 props) const { return matcher_->Properties(props); } + uint32 Flags() const { return matcher_->Flags(); } + + // Look-ahead methods + bool LookAheadLabel(Label label) const { + return matcher_->LookAheadLabel(label); + } + + bool LookAheadFst(const Fst &fst, StateId s) { + return matcher_->LookAheadFst(fst, s); + } + + Weight LookAheadWeight() const { return matcher_->LookAheadWeight(); } + + bool LookAheadPrefix(Arc *arc) const { + return matcher_->LookAheadPrefix(arc); + } + + void InitLookAheadFst(const Fst& fst, bool copy = false) { + matcher_->InitLookAheadFst(fst, copy); + } + + private: + M *matcher_; + + void operator=(const LookAheadMatcher &); // disallow +}; + +// +// Useful aliases when using StdArc and LogArc. +// + +// Arc look-ahead matchers +extern const char arc_lookahead_fst_type[]; + +typedef MatcherFst, + ArcLookAheadMatcher > >, + arc_lookahead_fst_type> StdArcLookAheadFst; + +typedef MatcherFst, + ArcLookAheadMatcher > >, + arc_lookahead_fst_type> LogArcLookAheadFst; + + +// Label look-ahead matchers +extern const char ilabel_lookahead_fst_type[]; +extern const char olabel_lookahead_fst_type[]; + +static const uint32 ilabel_lookahead_flags = kInputLookAheadMatcher | + kLookAheadWeight | kLookAheadPrefix | + kLookAheadEpsilons | kLookAheadNonEpsilonPrefix; +static const uint32 olabel_lookahead_flags = kOutputLookAheadMatcher | + kLookAheadWeight | kLookAheadPrefix | + kLookAheadEpsilons | kLookAheadNonEpsilonPrefix; + +typedef MatcherFst, + LabelLookAheadMatcher >, + ilabel_lookahead_flags, + FastLogAccumulator >, + ilabel_lookahead_fst_type, + LabelLookAheadRelabeler > StdILabelLookAheadFst; + +typedef MatcherFst, + LabelLookAheadMatcher >, + ilabel_lookahead_flags, + FastLogAccumulator >, + ilabel_lookahead_fst_type, + LabelLookAheadRelabeler > LogILabelLookAheadFst; + +typedef MatcherFst, + LabelLookAheadMatcher >, + olabel_lookahead_flags, + FastLogAccumulator >, + olabel_lookahead_fst_type, + LabelLookAheadRelabeler > StdOLabelLookAheadFst; + +typedef MatcherFst, + LabelLookAheadMatcher >, + olabel_lookahead_flags, + FastLogAccumulator >, + olabel_lookahead_fst_type, + LabelLookAheadRelabeler > LogOLabelLookAheadFst; + +} // namespace fst + +#endif // FST_LIB_MATCHER_FST_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/matcher.h b/extlibs/openfstwin-1.3.1/include/fst/matcher.h new file mode 100755 index 00000000000..a89325b7c41 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/matcher.h @@ -0,0 +1,1116 @@ +// matcher.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes to allow matching labels leaving FST states. + +#ifndef FST_LIB_MATCHER_H__ +#define FST_LIB_MATCHER_H__ + +#include +#include + +#include // for all internal FST accessors + + +namespace fst { + +// MATCHERS - these can find and iterate through requested labels at +// FST states. In the simplest form, these are just some associative +// map or search keyed on labels. More generally, they may +// implement matching special labels that represent sets of labels +// such as 'sigma' (all), 'rho' (rest), or 'phi' (fail). +// The Matcher interface is: +// +// template +// class Matcher { +// public: +// typedef F FST; +// typedef F::Arc Arc; +// typedef typename Arc::StateId StateId; +// typedef typename Arc::Label Label; +// typedef typename Arc::Weight Weight; +// +// // Required constructors. +// Matcher(const F &fst, MatchType type); +// // If safe=true, the copy is thread-safe. See Fst<>::Copy() +// // for further doc. +// Matcher(const Matcher &matcher, bool safe = false); +// +// // If safe=true, the copy is thread-safe. See Fst<>::Copy() +// // for further doc. +// Matcher *Copy(bool safe = false) const; +// +// // Returns the match type that can be provided (depending on +// // compatibility of the input FST). It is either +// // the requested match type, MATCH_NONE, or MATCH_UNKNOWN. +// // If 'test' is false, a constant time test is performed, but +// // MATCH_UNKNOWN may be returned. If 'test' is true, +// // a definite answer is returned, but may involve more costly +// // computation (e.g., visiting the Fst). +// MatchType Type(bool test) const; +// // Specifies the current state. +// void SetState(StateId s); +// +// // This finds matches to a label at the current state. +// // Returns true if a match found. kNoLabel matches any +// // 'non-consuming' transitions, e.g., epsilon transitions, +// // which do not require a matching symbol. +// bool Find(Label label); +// // These iterate through any matches found: +// bool Done() const; // No more matches. +// const A& Value() const; // Current arc (when !Done) +// void Next(); // Advance to next arc (when !Done) +// +// // Return matcher FST. +// const F& GetFst() const; +// // This specifies the known Fst properties as viewed from this +// // matcher. It takes as argument the input Fst's known properties. +// uint64 Properties(uint64 props) const; +// }; + +// Flags used for basic matchers (see also lookahead.h). +const uint32 kMatcherFlags = 0x00000000; + +// Matcher interface, templated on the Arc definition; used +// for matcher specializations that are returned by the +// InitMatcher Fst method. +template +class MatcherBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + virtual ~MatcherBase() {} + + virtual MatcherBase *Copy(bool safe = false) const = 0; + virtual MatchType Type(bool test) const = 0; + void SetState(StateId s) { SetState_(s); } + bool Find(Label label) { return Find_(label); } + bool Done() const { return Done_(); } + const A& Value() const { return Value_(); } + void Next() { Next_(); } + virtual const Fst &GetFst() const = 0; + virtual uint64 Properties(uint64 props) const = 0; + virtual uint32 Flags() const { return 0; } + private: + virtual void SetState_(StateId s) = 0; + virtual bool Find_(Label label) = 0; + virtual bool Done_() const = 0; + virtual const A& Value_() const = 0; + virtual void Next_() = 0; +}; + + +// A matcher that expects sorted labels on the side to be matched. +// If match_type == MATCH_INPUT, epsilons match the implicit self loop +// Arc(kNoLabel, 0, Weight::One(), current_state) as well as any +// actual epsilon transitions. If match_type == MATCH_OUTPUT, then +// Arc(0, kNoLabel, Weight::One(), current_state) is instead matched. +template +class SortedMatcher : public MatcherBase { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + // Labels >= binary_label will be searched for by binary search, + // o.w. linear search is used. + SortedMatcher(const F &fst, MatchType match_type, + Label binary_label = 1) + : fst_(fst.Copy()), + s_(kNoStateId), + aiter_(0), + match_type_(match_type), + binary_label_(binary_label), + match_label_(kNoLabel), + narcs_(0), + loop_(kNoLabel, 0, Weight::One(), kNoStateId), + error_(false) { + switch(match_type_) { + case MATCH_INPUT: + case MATCH_NONE: + break; + case MATCH_OUTPUT: + swap(loop_.ilabel, loop_.olabel); + break; + default: + FSTERROR() << "SortedMatcher: bad match type"; + match_type_ = MATCH_NONE; + error_ = true; + } + } + + SortedMatcher(const SortedMatcher &matcher, bool safe = false) + : fst_(matcher.fst_->Copy(safe)), + s_(kNoStateId), + aiter_(0), + match_type_(matcher.match_type_), + binary_label_(matcher.binary_label_), + match_label_(kNoLabel), + narcs_(0), + loop_(matcher.loop_), + error_(matcher.error_) {} + + virtual ~SortedMatcher() { + if (aiter_) + delete aiter_; + delete fst_; + } + + virtual SortedMatcher *Copy(bool safe = false) const { + return new SortedMatcher(*this, safe); + } + + virtual MatchType Type(bool test) const { + if (match_type_ == MATCH_NONE) + return match_type_; + + uint64 true_prop = match_type_ == MATCH_INPUT ? + kILabelSorted : kOLabelSorted; + uint64 false_prop = match_type_ == MATCH_INPUT ? + kNotILabelSorted : kNotOLabelSorted; + uint64 props = fst_->Properties(true_prop | false_prop, test); + + if (props & true_prop) + return match_type_; + else if (props & false_prop) + return MATCH_NONE; + else + return MATCH_UNKNOWN; + } + + void SetState(StateId s) { + if (s_ == s) + return; + s_ = s; + if (match_type_ == MATCH_NONE) { + FSTERROR() << "SortedMatcher: bad match type"; + error_ = true; + } + if (aiter_) + delete aiter_; + aiter_ = new ArcIterator(*fst_, s); + aiter_->SetFlags(kArcNoCache, kArcNoCache); + narcs_ = internal::NumArcs(*fst_, s); + loop_.nextstate = s; + } + + bool Find(Label match_label); + + bool Done() const { + if (current_loop_) + return false; + if (aiter_->Done()) + return true; + aiter_->SetFlags( + match_type_ == MATCH_INPUT ? kArcILabelValue : kArcOLabelValue, + kArcValueFlags); + Label label = match_type_ == MATCH_INPUT ? + aiter_->Value().ilabel : aiter_->Value().olabel; + return label != match_label_; + } + + const Arc& Value() const { + if (current_loop_) { + return loop_; + } + aiter_->SetFlags(kArcValueFlags, kArcValueFlags); + return aiter_->Value(); + } + + void Next() { + if (current_loop_) + current_loop_ = false; + else + aiter_->Next(); + } + + virtual const F &GetFst() const { return *fst_; } + + virtual uint64 Properties(uint64 inprops) const { + uint64 outprops = inprops; + if (error_) outprops |= kError; + return outprops; + } + + private: + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + const F *fst_; + StateId s_; // Current state + ArcIterator *aiter_; // Iterator for current state + MatchType match_type_; // Type of match to perform + Label binary_label_; // Least label for binary search + Label match_label_; // Current label to be matched + size_t narcs_; // Current state arc count + Arc loop_; // For non-consuming symbols + bool current_loop_; // Current arc is the implicit loop + bool error_; // Error encountered + + void operator=(const SortedMatcher &); // Disallow +}; + +template inline +bool SortedMatcher::Find(Label match_label) { + if (error_) { + current_loop_ = false; + match_label_ = kNoLabel; + return false; + } + current_loop_ = match_label == 0; + match_label_ = match_label == kNoLabel ? 0 : match_label; + aiter_->SetFlags( + match_type_ == MATCH_INPUT ? kArcILabelValue : kArcOLabelValue, + kArcValueFlags); + if (match_label_ >= binary_label_) { + // Binary search for match. + size_t low = 0; + size_t high = narcs_; + while (low < high) { + size_t mid = (low + high) / 2; + aiter_->Seek(mid); + Label label = match_type_ == MATCH_INPUT ? + aiter_->Value().ilabel : aiter_->Value().olabel; + if (label > match_label_) { + high = mid; + } else if (label < match_label_) { + low = mid + 1; + } else { + // find first matching label (when non-determinism) + for (size_t i = mid; i > low; --i) { + aiter_->Seek(i - 1); + label = match_type_ == MATCH_INPUT ? aiter_->Value().ilabel : + aiter_->Value().olabel; + if (label != match_label_) { + aiter_->Seek(i); + return true; + } + } + return true; + } + } + return current_loop_; + } else { + // Linear search for match. + for (aiter_->Reset(); !aiter_->Done(); aiter_->Next()) { + Label label = match_type_ == MATCH_INPUT ? + aiter_->Value().ilabel : aiter_->Value().olabel; + if (label == match_label_) { + return true; + } + if (label > match_label_) + break; + } + return current_loop_; + } +} + + +// Specifies whether during matching we rewrite both the input and output sides. +enum MatcherRewriteMode { + MATCHER_REWRITE_AUTO = 0, // Rewrites both sides iff acceptor. + MATCHER_REWRITE_ALWAYS, + MATCHER_REWRITE_NEVER +}; + + +// For any requested label that doesn't match at a state, this matcher +// considers all transitions that match the label 'rho_label' (rho = +// 'rest'). Each such rho transition found is returned with the +// rho_label rewritten as the requested label (both sides if an +// acceptor, or if 'rewrite_both' is true and both input and output +// labels of the found transition are 'rho_label'). If 'rho_label' is +// kNoLabel, this special matching is not done. RhoMatcher is +// templated itself on a matcher, which is used to perform the +// underlying matching. By default, the underlying matcher is +// constructed by RhoMatcher. The user can instead pass in this +// object; in that case, RhoMatcher takes its ownership. +template +class RhoMatcher : public MatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + RhoMatcher(const FST &fst, + MatchType match_type, + Label rho_label = kNoLabel, + MatcherRewriteMode rewrite_mode = MATCHER_REWRITE_AUTO, + M *matcher = 0) + : matcher_(matcher ? matcher : new M(fst, match_type)), + match_type_(match_type), + rho_label_(rho_label), + error_(false) { + if (match_type == MATCH_BOTH) { + FSTERROR() << "RhoMatcher: bad match type"; + match_type_ = MATCH_NONE; + error_ = true; + } + if (rho_label == 0) { + FSTERROR() << "RhoMatcher: 0 cannot be used as rho_label"; + rho_label_ = kNoLabel; + error_ = true; + } + + if (rewrite_mode == MATCHER_REWRITE_AUTO) + rewrite_both_ = fst.Properties(kAcceptor, true); + else if (rewrite_mode == MATCHER_REWRITE_ALWAYS) + rewrite_both_ = true; + else + rewrite_both_ = false; + } + + RhoMatcher(const RhoMatcher &matcher, bool safe = false) + : matcher_(new M(*matcher.matcher_, safe)), + match_type_(matcher.match_type_), + rho_label_(matcher.rho_label_), + rewrite_both_(matcher.rewrite_both_), + error_(matcher.error_) {} + + virtual ~RhoMatcher() { + delete matcher_; + } + + virtual RhoMatcher *Copy(bool safe = false) const { + return new RhoMatcher(*this, safe); + } + + virtual MatchType Type(bool test) const { return matcher_->Type(test); } + + void SetState(StateId s) { + matcher_->SetState(s); + has_rho_ = rho_label_ != kNoLabel; + } + + bool Find(Label match_label) { + if (match_label == rho_label_ && rho_label_ != kNoLabel) { + FSTERROR() << "RhoMatcher::Find: bad label (rho)"; + error_ = true; + return false; + } + if (matcher_->Find(match_label)) { + rho_match_ = kNoLabel; + return true; + } else if (has_rho_ && match_label != 0 && match_label != kNoLabel && + (has_rho_ = matcher_->Find(rho_label_))) { + rho_match_ = match_label; + return true; + } else { + return false; + } + } + + bool Done() const { return matcher_->Done(); } + + const Arc& Value() const { + if (rho_match_ == kNoLabel) { + return matcher_->Value(); + } else { + rho_arc_ = matcher_->Value(); + if (rewrite_both_) { + if (rho_arc_.ilabel == rho_label_) + rho_arc_.ilabel = rho_match_; + if (rho_arc_.olabel == rho_label_) + rho_arc_.olabel = rho_match_; + } else if (match_type_ == MATCH_INPUT) { + rho_arc_.ilabel = rho_match_; + } else { + rho_arc_.olabel = rho_match_; + } + return rho_arc_; + } + } + + void Next() { matcher_->Next(); } + + virtual const FST &GetFst() const { return matcher_->GetFst(); } + + virtual uint64 Properties(uint64 props) const; + + private: + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + M *matcher_; + MatchType match_type_; // Type of match requested + Label rho_label_; // Label that represents the rho transition + bool rewrite_both_; // Rewrite both sides when both are 'rho_label_' + bool has_rho_; // Are there possibly rhos at the current state? + Label rho_match_; // Current label that matches rho transition + mutable Arc rho_arc_; // Arc to return when rho match + bool error_; // Error encountered + + void operator=(const RhoMatcher &); // Disallow +}; + +template inline +uint64 RhoMatcher::Properties(uint64 inprops) const { + uint64 outprops = matcher_->Properties(inprops); + if (error_) outprops |= kError; + + if (match_type_ == MATCH_NONE) { + return outprops; + } else if (match_type_ == MATCH_INPUT) { + if (rewrite_both_) { + return outprops & ~(kODeterministic | kNonODeterministic | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } else { + return outprops & ~(kODeterministic | kAcceptor | kString | + kILabelSorted | kNotILabelSorted); + } + } else if (match_type_ == MATCH_OUTPUT) { + if (rewrite_both_) { + return outprops & ~(kIDeterministic | kNonIDeterministic | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } else { + return outprops & ~(kIDeterministic | kAcceptor | kString | + kOLabelSorted | kNotOLabelSorted); + } + } else { + // Shouldn't ever get here. + FSTERROR() << "RhoMatcher:: bad match type: " << match_type_; + return 0; + } +} + + +// For any requested label, this matcher considers all transitions +// that match the label 'sigma_label' (sigma = "any"), and this in +// additions to transitions with the requested label. Each such sigma +// transition found is returned with the sigma_label rewritten as the +// requested label (both sides if an acceptor, or if 'rewrite_both' is +// true and both input and output labels of the found transition are +// 'sigma_label'). If 'sigma_label' is kNoLabel, this special +// matching is not done. SigmaMatcher is templated itself on a +// matcher, which is used to perform the underlying matching. By +// default, the underlying matcher is constructed by SigmaMatcher. +// The user can instead pass in this object; in that case, +// SigmaMatcher takes its ownership. +template +class SigmaMatcher : public MatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + SigmaMatcher(const FST &fst, + MatchType match_type, + Label sigma_label = kNoLabel, + MatcherRewriteMode rewrite_mode = MATCHER_REWRITE_AUTO, + M *matcher = 0) + : matcher_(matcher ? matcher : new M(fst, match_type)), + match_type_(match_type), + sigma_label_(sigma_label), + error_(false) { + if (match_type == MATCH_BOTH) { + FSTERROR() << "SigmaMatcher: bad match type"; + match_type_ = MATCH_NONE; + error_ = true; + } + if (sigma_label == 0) { + FSTERROR() << "SigmaMatcher: 0 cannot be used as sigma_label"; + sigma_label_ = kNoLabel; + error_ = true; + } + + if (rewrite_mode == MATCHER_REWRITE_AUTO) + rewrite_both_ = fst.Properties(kAcceptor, true); + else if (rewrite_mode == MATCHER_REWRITE_ALWAYS) + rewrite_both_ = true; + else + rewrite_both_ = false; + } + + SigmaMatcher(const SigmaMatcher &matcher, bool safe = false) + : matcher_(new M(*matcher.matcher_, safe)), + match_type_(matcher.match_type_), + sigma_label_(matcher.sigma_label_), + rewrite_both_(matcher.rewrite_both_), + error_(matcher.error_) {} + + virtual ~SigmaMatcher() { + delete matcher_; + } + + virtual SigmaMatcher *Copy(bool safe = false) const { + return new SigmaMatcher(*this, safe); + } + + virtual MatchType Type(bool test) const { return matcher_->Type(test); } + + void SetState(StateId s) { + matcher_->SetState(s); + has_sigma_ = + sigma_label_ != kNoLabel ? matcher_->Find(sigma_label_) : false; + } + + bool Find(Label match_label) { + match_label_ = match_label; + if (match_label == sigma_label_ && sigma_label_ != kNoLabel) { + FSTERROR() << "SigmaMatcher::Find: bad label (sigma)"; + error_ = true; + return false; + } + if (matcher_->Find(match_label)) { + sigma_match_ = kNoLabel; + return true; + } else if (has_sigma_ && match_label != 0 && match_label != kNoLabel && + matcher_->Find(sigma_label_)) { + sigma_match_ = match_label; + return true; + } else { + return false; + } + } + + bool Done() const { + return matcher_->Done(); + } + + const Arc& Value() const { + if (sigma_match_ == kNoLabel) { + return matcher_->Value(); + } else { + sigma_arc_ = matcher_->Value(); + if (rewrite_both_) { + if (sigma_arc_.ilabel == sigma_label_) + sigma_arc_.ilabel = sigma_match_; + if (sigma_arc_.olabel == sigma_label_) + sigma_arc_.olabel = sigma_match_; + } else if (match_type_ == MATCH_INPUT) { + sigma_arc_.ilabel = sigma_match_; + } else { + sigma_arc_.olabel = sigma_match_; + } + return sigma_arc_; + } + } + + void Next() { + matcher_->Next(); + if (matcher_->Done() && has_sigma_ && (sigma_match_ == kNoLabel) && + (match_label_ > 0)) { + matcher_->Find(sigma_label_); + sigma_match_ = match_label_; + } + } + + virtual const FST &GetFst() const { return matcher_->GetFst(); } + + virtual uint64 Properties(uint64 props) const; + +private: + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + M *matcher_; + MatchType match_type_; // Type of match requested + Label sigma_label_; // Label that represents the sigma transition + bool rewrite_both_; // Rewrite both sides when both are 'sigma_label_' + bool has_sigma_; // Are there sigmas at the current state? + Label sigma_match_; // Current label that matches sigma transition + mutable Arc sigma_arc_; // Arc to return when sigma match + Label match_label_; // Label being matched + bool error_; // Error encountered + + void operator=(const SigmaMatcher &); // disallow +}; + +template inline +uint64 SigmaMatcher::Properties(uint64 inprops) const { + uint64 outprops = matcher_->Properties(inprops); + if (error_) outprops |= kError; + + if (match_type_ == MATCH_NONE) { + return outprops; + } else if (rewrite_both_) { + return outprops & ~(kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted | + kString); + } else if (match_type_ == MATCH_INPUT) { + return outprops & ~(kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | + kILabelSorted | kNotILabelSorted | + kString | kAcceptor); + } else if (match_type_ == MATCH_OUTPUT) { + return outprops & ~(kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | + kOLabelSorted | kNotOLabelSorted | + kString | kAcceptor); + } else { + // Shouldn't ever get here. + FSTERROR() << "SigmaMatcher:: bad match type: " << match_type_; + return 0; + } +} + + +// For any requested label that doesn't match at a state, this matcher +// considers the *unique* transition that matches the label 'phi_label' +// (phi = 'fail'), and recursively looks for a match at its +// destination. When 'phi_loop' is true, if no match is found but a +// phi self-loop is found, then the phi transition found is returned +// with the phi_label rewritten as the requested label (both sides if +// an acceptor, or if 'rewrite_both' is true and both input and output +// labels of the found transition are 'phi_label'). If 'phi_label' is +// kNoLabel, this special matching is not done. PhiMatcher is +// templated itself on a matcher, which is used to perform the +// underlying matching. By default, the underlying matcher is +// constructed by PhiMatcher. The user can instead pass in this +// object; in that case, PhiMatcher takes its ownership. +// Warning: phi non-determinism not supported (for simplicity). +template +class PhiMatcher : public MatcherBase { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + PhiMatcher(const FST &fst, + MatchType match_type, + Label phi_label = kNoLabel, + bool phi_loop = true, + MatcherRewriteMode rewrite_mode = MATCHER_REWRITE_AUTO, + M *matcher = 0) + : matcher_(matcher ? matcher : new M(fst, match_type)), + match_type_(match_type), + phi_label_(phi_label), + state_(kNoStateId), + phi_loop_(phi_loop), + error_(false) { + if (match_type == MATCH_BOTH) { + FSTERROR() << "PhiMatcher: bad match type"; + match_type_ = MATCH_NONE; + error_ = true; + } + if (phi_label == 0) { + FSTERROR() << "PhiMatcher: 0 cannot be used as phi_label"; + phi_label_ = kNoLabel; + error_ = true; + } + + if (rewrite_mode == MATCHER_REWRITE_AUTO) + rewrite_both_ = fst.Properties(kAcceptor, true); + else if (rewrite_mode == MATCHER_REWRITE_ALWAYS) + rewrite_both_ = true; + else + rewrite_both_ = false; + } + + PhiMatcher(const PhiMatcher &matcher, bool safe = false) + : matcher_(new M(*matcher.matcher_, safe)), + match_type_(matcher.match_type_), + phi_label_(matcher.phi_label_), + rewrite_both_(matcher.rewrite_both_), + state_(kNoStateId), + phi_loop_(matcher.phi_loop_), + error_(matcher.error_) {} + + virtual ~PhiMatcher() { + delete matcher_; + } + + virtual PhiMatcher *Copy(bool safe = false) const { + return new PhiMatcher(*this, safe); + } + + virtual MatchType Type(bool test) const { return matcher_->Type(test); } + + void SetState(StateId s) { + matcher_->SetState(s); + state_ = s; + has_phi_ = phi_label_ != kNoLabel; + } + + bool Find(Label match_label); + + bool Done() const { return matcher_->Done(); } + + const Arc& Value() const { + if ((phi_match_ == kNoLabel) && (phi_weight_ == Weight::One())) { + return matcher_->Value(); + } else { + phi_arc_ = matcher_->Value(); + phi_arc_.weight = Times(phi_weight_, phi_arc_.weight); + if (phi_match_ != kNoLabel) { + if (rewrite_both_) { + if (phi_arc_.ilabel == phi_label_) + phi_arc_.ilabel = phi_match_; + if (phi_arc_.olabel == phi_label_) + phi_arc_.olabel = phi_match_; + } else if (match_type_ == MATCH_INPUT) { + phi_arc_.ilabel = phi_match_; + } else { + phi_arc_.olabel = phi_match_; + } + } + return phi_arc_; + } + } + + void Next() { matcher_->Next(); } + + virtual const FST &GetFst() const { return matcher_->GetFst(); } + + virtual uint64 Properties(uint64 props) const; + +private: + virtual void SetState_(StateId s) { SetState(s); } + virtual bool Find_(Label label) { return Find(label); } + virtual bool Done_() const { return Done(); } + virtual const Arc& Value_() const { return Value(); } + virtual void Next_() { Next(); } + + M *matcher_; + MatchType match_type_; // Type of match requested + Label phi_label_; // Label that represents the phi transition + bool rewrite_both_; // Rewrite both sides when both are 'phi_label_' + bool has_phi_; // Are there possibly phis at the current state? + Label phi_match_; // Current label that matches phi loop + mutable Arc phi_arc_; // Arc to return + StateId state_; // State where looking for matches + Weight phi_weight_; // Product of the weights of phi transitions taken + bool phi_loop_; // When true, phi self-loop are allowed and treated + // as rho (required for Aho-Corasick) + bool error_; // Error encountered + + void operator=(const PhiMatcher &); // disallow +}; + +template inline +bool PhiMatcher::Find(Label match_label) { + if (match_label == phi_label_ && phi_label_ != kNoLabel) { + FSTERROR() << "PhiMatcher::Find: bad label (phi)"; + error_ = true; + return false; + } + matcher_->SetState(state_); + phi_match_ = kNoLabel; + phi_weight_ = Weight::One(); + if (!has_phi_ || match_label == 0 || match_label == kNoLabel) + return matcher_->Find(match_label); + StateId state = state_; + while (!matcher_->Find(match_label)) { + if (!matcher_->Find(phi_label_)) + return false; + if (phi_loop_ && matcher_->Value().nextstate == state) { + phi_match_ = match_label; + return true; + } + phi_weight_ = Times(phi_weight_, matcher_->Value().weight); + state = matcher_->Value().nextstate; + matcher_->Next(); + if (!matcher_->Done()) { + FSTERROR() << "PhiMatcher: phi non-determinism not supported"; + error_ = true; + } + matcher_->SetState(state); + } + return true; +} + +template inline +uint64 PhiMatcher::Properties(uint64 inprops) const { + uint64 outprops = matcher_->Properties(inprops); + if (error_) outprops |= kError; + + if (match_type_ == MATCH_NONE) { + return outprops; + } else if (match_type_ == MATCH_INPUT) { + if (rewrite_both_) { + return outprops & ~(kODeterministic | kNonODeterministic | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } else { + return outprops & ~(kODeterministic | kAcceptor | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } + } else if (match_type_ == MATCH_OUTPUT) { + if (rewrite_both_) { + return outprops & ~(kIDeterministic | kNonIDeterministic | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } else { + return outprops & ~(kIDeterministic | kAcceptor | kString | + kILabelSorted | kNotILabelSorted | + kOLabelSorted | kNotOLabelSorted); + } + } else { + // Shouldn't ever get here. + FSTERROR() << "PhiMatcher:: bad match type: " << match_type_; + return 0; + } +} + + +// +// MULTI-EPS MATCHER FLAGS +// + +// Return multi-epsilon arcs for Find(kNoLabel). +const uint32 kMultiEpsList = 0x00000001; + +// Return a kNolabel loop for Find(multi_eps). +const uint32 kMultiEpsLoop = 0x00000002; + +// MultiEpsMatcher: allows treating multiple non-0 labels as +// non-consuming labels in addition to 0 that is always +// non-consuming. Precise behavior controlled by 'flags' argument. By +// default, the underlying matcher is constructed by +// MultiEpsMatcher. The user can instead pass in this object; in that +// case, MultiEpsMatcher takes its ownership iff 'own_matcher' is +// true. +template +class MultiEpsMatcher { + public: + typedef typename M::FST FST; + typedef typename M::Arc Arc; + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + MultiEpsMatcher(const FST &fst, MatchType match_type, + uint32 flags = (kMultiEpsLoop | kMultiEpsList), + M *matcher = 0, bool own_matcher = true) + : matcher_(matcher ? matcher : new M(fst, match_type)), + flags_(flags), + own_matcher_(matcher ? own_matcher : true) { + if (match_type == MATCH_INPUT) { + loop_.ilabel = kNoLabel; + loop_.olabel = 0; + } else { + loop_.ilabel = 0; + loop_.olabel = kNoLabel; + } + loop_.weight = Weight::One(); + loop_.nextstate = kNoStateId; + } + + MultiEpsMatcher(const MultiEpsMatcher &matcher, bool safe = false) + : matcher_(new M(*matcher.matcher_, safe)), + flags_(matcher.flags_), + own_matcher_(true), + multi_eps_labels_(matcher.multi_eps_labels_), + loop_(matcher.loop_) { + loop_.nextstate = kNoStateId; + } + + ~MultiEpsMatcher() { + if (own_matcher_) + delete matcher_; + } + + MultiEpsMatcher *Copy(bool safe = false) const { + return new MultiEpsMatcher(*this, safe); + } + + MatchType Type(bool test) const { return matcher_->Type(test); } + + void SetState(StateId s) { + matcher_->SetState(s); + loop_.nextstate = s; + } + + bool Find(Label match_label); + + bool Done() const { + return done_; + } + + const Arc& Value() const { + return current_loop_ ? loop_ : matcher_->Value(); + } + + void Next() { + if (!current_loop_) { + matcher_->Next(); + done_ = matcher_->Done(); + if (done_ && multi_eps_iter_ != multi_eps_labels_.End()) { + ++multi_eps_iter_; + while ((multi_eps_iter_ != multi_eps_labels_.End()) && + !matcher_->Find(*multi_eps_iter_)) + ++multi_eps_iter_; + if (multi_eps_iter_ != multi_eps_labels_.End()) + done_ = false; + else + done_ = !matcher_->Find(kNoLabel); + + } + } else { + done_ = true; + } + } + + const FST &GetFst() const { return matcher_->GetFst(); } + + uint64 Properties(uint64 props) const { return matcher_->Properties(props); } + + uint32 Flags() const { return matcher_->Flags(); } + + void AddMultiEpsLabel(Label label) { + if (label == 0) { + FSTERROR() << "MultiEpsMatcher: Bad multi-eps label: 0"; + } else { + multi_eps_labels_.Insert(label); + } + } + + void ClearMultiEpsLabels() { + multi_eps_labels_.Clear(); + } + +private: + // Specialized for 'set' - log lookup + bool IsMultiEps(const set& fst, + const Partition& partition, + uint32 flags = kCompareAll) + : fst_(fst), partition_(partition), flags_(flags) {} + + // compare state x with state y based on sort criteria + bool operator()(const StateId x, const StateId y) const { + // check for final state equivalence + if (flags_ & kCompareFinal) { + const size_t xfinal = fst_.Final(x).Hash(); + const size_t yfinal = fst_.Final(y).Hash(); + if (xfinal < yfinal) return true; + else if (xfinal > yfinal) return false; + } + + if (flags_ & kCompareOutDegree) { + // check for # arcs + if (fst_.NumArcs(x) < fst_.NumArcs(y)) return true; + if (fst_.NumArcs(x) > fst_.NumArcs(y)) return false; + + if (flags_ & kCompareArcs) { + // # arcs are equal, check for arc match + for (ArcIterator > aiter1(fst_, x), aiter2(fst_, y); + !aiter1.Done() && !aiter2.Done(); aiter1.Next(), aiter2.Next()) { + const A& arc1 = aiter1.Value(); + const A& arc2 = aiter2.Value(); + if (arc1.ilabel < arc2.ilabel) return true; + if (arc1.ilabel > arc2.ilabel) return false; + + if (partition_.class_id(arc1.nextstate) < + partition_.class_id(arc2.nextstate)) return true; + if (partition_.class_id(arc1.nextstate) > + partition_.class_id(arc2.nextstate)) return false; + } + } + } + + return false; + } + + private: + const Fst& fst_; + const Partition& partition_; + const uint32 flags_; +}; + +template const uint32 StateComparator::kCompareFinal; +template const uint32 StateComparator::kCompareOutDegree; +template const uint32 StateComparator::kCompareArcs; +template const uint32 StateComparator::kCompareAll; + + +// Computes equivalence classes for cyclic Fsts. For cyclic minimization +// we use the classic HopCroft minimization algorithm, which is of +// +// O(E)log(N), +// +// where E is the number of edges in the machine and N is number of states. +// +// The following paper describes the original algorithm +// An N Log N algorithm for minimizing states in a finite automaton +// by John HopCroft, January 1971 +// +template +class CyclicMinimizer { + public: + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::StateId ClassId; + typedef typename A::Weight Weight; + typedef ReverseArc RevA; + + CyclicMinimizer(const ExpandedFst& fst) { + Initialize(fst); + Compute(fst); + } + + ~CyclicMinimizer() { + delete aiter_queue_; + } + + const Partition& partition() const { + return P_; + } + + // helper classes + private: + typedef ArcIterator > ArcIter; + class ArcIterCompare { + public: + ArcIterCompare(const Partition& partition) + : partition_(partition) {} + + ArcIterCompare(const ArcIterCompare& comp) + : partition_(comp.partition_) {} + + // compare two iterators based on there input labels, and proto state + // (partition class Ids) + bool operator()(const ArcIter* x, const ArcIter* y) const { + const RevA& xarc = x->Value(); + const RevA& yarc = y->Value(); + return (xarc.ilabel > yarc.ilabel); + } + + private: + const Partition& partition_; + }; + + typedef priority_queue, ArcIterCompare> + ArcIterQueue; + + // helper methods + private: + // prepartitions the space into equivalence classes with + // same final weight + // same # arcs per state + // same outgoing arcs + void PrePartition(const Fst& fst) { + VLOG(5) << "PrePartition"; + + typedef map > EquivalenceMap; + StateComparator comp(fst, P_, StateComparator::kCompareFinal); + EquivalenceMap equiv_map(comp); + + StateIterator > siter(fst); + StateId class_id = P_.AddClass(); + P_.Add(siter.Value(), class_id); + equiv_map[siter.Value()] = class_id; + L_.Enqueue(class_id); + for (siter.Next(); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + typename EquivalenceMap::const_iterator it = equiv_map.find(s); + if (it == equiv_map.end()) { + class_id = P_.AddClass(); + P_.Add(s, class_id); + equiv_map[s] = class_id; + L_.Enqueue(class_id); + } else { + P_.Add(s, it->second); + equiv_map[s] = it->second; + } + } + + VLOG(5) << "Initial Partition: " << P_.num_classes(); + } + + // - Create inverse transition Tr_ = rev(fst) + // - loop over states in fst and split on final, creating two blocks + // in the partition corresponding to final, non-final + void Initialize(const Fst& fst) { + // construct Tr + Reverse(fst, &Tr_); + ILabelCompare ilabel_comp; + ArcSort(&Tr_, ilabel_comp); + + // initial split (F, S - F) + P_.Initialize(Tr_.NumStates() - 1); + + // prep partition + PrePartition(fst); + + // allocate arc iterator queue + ArcIterCompare comp(P_); + aiter_queue_ = new ArcIterQueue(comp); + } + + // partition all classes with destination C + void Split(ClassId C) { + // Prep priority queue. Open arc iterator for each state in C, and + // insert into priority queue. + for (PartitionIterator siter(P_, C); + !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (Tr_.NumArcs(s + 1)) + aiter_queue_->push(new ArcIterator >(Tr_, s + 1)); + } + + // Now pop arc iterator from queue, split entering equivalence class + // re-insert updated iterator into queue. + Label prev_label = -1; + while (!aiter_queue_->empty()) { + ArcIterator >* aiter = aiter_queue_->top(); + aiter_queue_->pop(); + if (aiter->Done()) { + delete aiter; + continue; + } + + const RevA& arc = aiter->Value(); + StateId from_state = aiter->Value().nextstate - 1; + Label from_label = arc.ilabel; + if (prev_label != from_label) + P_.FinalizeSplit(&L_); + + StateId from_class = P_.class_id(from_state); + if (P_.class_size(from_class) > 1) + P_.SplitOn(from_state); + + prev_label = from_label; + aiter->Next(); + if (aiter->Done()) + delete aiter; + else + aiter_queue_->push(aiter); + } + P_.FinalizeSplit(&L_); + } + + // Main loop for hopcroft minimization. + void Compute(const Fst& fst) { + // process active classes (FIFO, or FILO) + while (!L_.Empty()) { + ClassId C = L_.Head(); + L_.Dequeue(); + + // split on C, all labels in C + Split(C); + } + } + + // helper data + private: + // Partioning of states into equivalence classes + Partition P_; + + // L = set of active classes to be processed in partition P + Queue L_; + + // reverse transition function + VectorFst Tr_; + + // Priority queue of open arc iterators for all states in the 'splitter' + // equivalence class + ArcIterQueue* aiter_queue_; +}; + + +// Computes equivalence classes for acyclic Fsts. The implementation details +// for this algorithms is documented by the following paper. +// +// Minimization of acyclic deterministic automata in linear time +// Dominque Revuz +// +// Complexity O(|E|) +// +template +class AcyclicMinimizer { + public: + typedef typename A::Label Label; + typedef typename A::StateId StateId; + typedef typename A::StateId ClassId; + typedef typename A::Weight Weight; + + AcyclicMinimizer(const ExpandedFst& fst) { + Initialize(fst); + Refine(fst); + } + + const Partition& partition() { + return partition_; + } + + // helper classes + private: + // DFS visitor to compute the height (distance) to final state. + class HeightVisitor { + public: + HeightVisitor() : max_height_(0), num_states_(0) { } + + // invoked before dfs visit + void InitVisit(const Fst& fst) {} + + // invoked when state is discovered (2nd arg is DFS tree root) + bool InitState(StateId s, StateId root) { + // extend height array and initialize height (distance) to 0 + for (size_t i = height_.size(); i <= s; ++i) + height_.push_back(-1); + + if (s >= num_states_) num_states_ = s + 1; + return true; + } + + // invoked when tree arc examined (to undiscoverted state) + bool TreeArc(StateId s, const A& arc) { + return true; + } + + // invoked when back arc examined (to unfinished state) + bool BackArc(StateId s, const A& arc) { + return true; + } + + // invoked when forward or cross arc examined (to finished state) + bool ForwardOrCrossArc(StateId s, const A& arc) { + if (height_[arc.nextstate] + 1 > height_[s]) + height_[s] = height_[arc.nextstate] + 1; + return true; + } + + // invoked when state finished (parent is kNoStateId for tree root) + void FinishState(StateId s, StateId parent, const A* parent_arc) { + if (height_[s] == -1) height_[s] = 0; + StateId h = height_[s] + 1; + if (parent >= 0) { + if (h > height_[parent]) height_[parent] = h; + if (h > max_height_) max_height_ = h; + } + } + + // invoked after DFS visit + void FinishVisit() {} + + size_t max_height() const { return max_height_; } + + const vector& height() const { return height_; } + + const size_t num_states() const { return num_states_; } + + private: + vector height_; + size_t max_height_; + size_t num_states_; + }; + + // helper methods + private: + // cluster states according to height (distance to final state) + void Initialize(const Fst& fst) { + // compute height (distance to final state) + HeightVisitor hvisitor; + DfsVisit(fst, &hvisitor); + + // create initial partition based on height + partition_.Initialize(hvisitor.num_states()); + partition_.AllocateClasses(hvisitor.max_height() + 1); + const vector& hstates = hvisitor.height(); + for (size_t s = 0; s < hstates.size(); ++s) + partition_.Add(s, hstates[s]); + } + + // refine states based on arc sort (out degree, arc equivalence) + void Refine(const Fst& fst) { + typedef map > EquivalenceMap; + StateComparator comp(fst, partition_); + + // start with tail (height = 0) + size_t height = partition_.num_classes(); + for (size_t h = 0; h < height; ++h) { + EquivalenceMap equiv_classes(comp); + + // sort states within equivalence class + PartitionIterator siter(partition_, h); + equiv_classes[siter.Value()] = h; + for (siter.Next(); !siter.Done(); siter.Next()) { + const StateId s = siter.Value(); + typename EquivalenceMap::const_iterator it = equiv_classes.find(s); + if (it == equiv_classes.end()) + equiv_classes[s] = partition_.AddClass(); + else + equiv_classes[s] = it->second; + } + + // create refined partition + for (siter.Reset(); !siter.Done();) { + const StateId s = siter.Value(); + const StateId old_class = partition_.class_id(s); + const StateId new_class = equiv_classes[s]; + + // a move operation can invalidate the iterator, so + // we first update the iterator to the next element + // before we move the current element out of the list + siter.Next(); + if (old_class != new_class) + partition_.Move(s, new_class); + } + } + } + + private: + Partition partition_; +}; + + +// Given a partition and a mutable fst, merge states of Fst inplace +// (i.e. destructively). Merging works by taking the first state in +// a class of the partition to be the representative state for the class. +// Each arc is then reconnected to this state. All states in the class +// are merged by adding there arcs to the representative state. +template +void MergeStates( + const Partition& partition, MutableFst* fst) { + typedef typename A::StateId StateId; + + vector state_map(partition.num_classes()); + for (size_t i = 0; i < partition.num_classes(); ++i) { + PartitionIterator siter(partition, i); + state_map[i] = siter.Value(); // first state in partition; + } + + // relabel destination states + for (size_t c = 0; c < partition.num_classes(); ++c) { + for (PartitionIterator siter(partition, c); + !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + for (MutableArcIterator > aiter(fst, s); + !aiter.Done(); aiter.Next()) { + A arc = aiter.Value(); + arc.nextstate = state_map[partition.class_id(arc.nextstate)]; + + if (s == state_map[c]) // first state just set destination + aiter.SetValue(arc); + else + fst->AddArc(state_map[c], arc); + } + } + } + fst->SetStart(state_map[partition.class_id(fst->Start())]); + + Connect(fst); +} + +template +void AcceptorMinimize(MutableFst* fst) { + typedef typename A::StateId StateId; + if (!(fst->Properties(kAcceptor | kUnweighted, true))) { + FSTERROR() << "FST is not an unweighted acceptor"; + fst->SetProperties(kError, kError); + return; + } + + // connect fst before minimization, handles disconnected states + Connect(fst); + if (fst->NumStates() == 0) return; + + if (fst->Properties(kAcyclic, true)) { + // Acyclic minimization (revuz) + VLOG(2) << "Acyclic Minimization"; + ArcSort(fst, ILabelCompare()); + AcyclicMinimizer minimizer(*fst); + MergeStates(minimizer.partition(), fst); + + } else { + // Cyclic minimizaton (hopcroft) + VLOG(2) << "Cyclic Minimization"; + CyclicMinimizer > minimizer(*fst); + MergeStates(minimizer.partition(), fst); + } + + // Merge in appropriate semiring + ArcUniqueMapper mapper(*fst); + StateMap(fst, mapper); +} + + +// In place minimization of deterministic weighted automata and transducers. +// For transducers, then the 'sfst' argument is not null, the algorithm +// produces a compact factorization of the minimal transducer. +// +// In the acyclic case, we use an algorithm from Dominique Revuz that +// is linear in the number of arcs (edges) in the machine. +// Complexity = O(E) +// +// In the cyclic case, we use the classical hopcroft minimization. +// Complexity = O(|E|log(|N|) +// +template +void Minimize(MutableFst* fst, + MutableFst* sfst = 0, + float delta = kDelta) { + uint64 props = fst->Properties(kAcceptor | kIDeterministic| + kWeighted | kUnweighted, true); + if (!(props & kIDeterministic)) { + FSTERROR() << "FST is not deterministic"; + fst->SetProperties(kError, kError); + return; + } + + if (!(props & kAcceptor)) { // weighted transducer + VectorFst< GallicArc > gfst; + ArcMap(*fst, &gfst, ToGallicMapper()); + fst->DeleteStates(); + gfst.SetProperties(kAcceptor, kAcceptor); + Push(&gfst, REWEIGHT_TO_INITIAL, delta); + ArcMap(&gfst, QuantizeMapper< GallicArc >(delta)); + EncodeMapper< GallicArc > + encoder(kEncodeLabels | kEncodeWeights, ENCODE); + Encode(&gfst, &encoder); + AcceptorMinimize(&gfst); + Decode(&gfst, encoder); + + if (sfst == 0) { + FactorWeightFst< GallicArc, + GallicFactor > fwfst(gfst); + SymbolTable *osyms = fst->OutputSymbols() ? + fst->OutputSymbols()->Copy() : 0; + ArcMap(fwfst, fst, FromGallicMapper()); + fst->SetOutputSymbols(osyms); + delete osyms; + } else { + sfst->SetOutputSymbols(fst->OutputSymbols()); + GallicToNewSymbolsMapper mapper(sfst); + ArcMap(gfst, fst, &mapper); + fst->SetOutputSymbols(sfst->InputSymbols()); + } + } else if (props & kWeighted) { // weighted acceptor + Push(fst, REWEIGHT_TO_INITIAL, delta); + ArcMap(fst, QuantizeMapper(delta)); + EncodeMapper encoder(kEncodeLabels | kEncodeWeights, ENCODE); + Encode(fst, &encoder); + AcceptorMinimize(fst); + Decode(fst, encoder); + } else { // unweighted acceptor + AcceptorMinimize(fst); + } +} + +} // namespace fst + +#endif // FST_LIB_MINIMIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/mutable-fst.h b/extlibs/openfstwin-1.3.1/include/fst/mutable-fst.h new file mode 100755 index 00000000000..9afcab36194 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/mutable-fst.h @@ -0,0 +1,378 @@ +// mutable-fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Expanded FST augmented with mutators - interface class definition +// and mutable arc iterator interface. +// + +#ifndef FST_LIB_MUTABLE_FST_H__ +#define FST_LIB_MUTABLE_FST_H__ + +#include +#include +#include +#include +using std::vector; + +#include + + +namespace fst { + +template class MutableArcIteratorData; + +// An expanded FST plus mutators (use MutableArcIterator to modify arcs). +template +class MutableFst : public ExpandedFst { + public: + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + virtual MutableFst &operator=(const Fst &fst) = 0; + + MutableFst &operator=(const MutableFst &fst) { + return operator=(static_cast &>(fst)); + } + + virtual void SetStart(StateId) = 0; // Set the initial state + virtual void SetFinal(StateId, Weight) = 0; // Set a state's final weight + virtual void SetProperties(uint64 props, + uint64 mask) = 0; // Set property bits wrt mask + + virtual StateId AddState() = 0; // Add a state, return its ID + virtual void AddArc(StateId, const A &arc) = 0; // Add an arc to state + + virtual void DeleteStates(const vector&) = 0; // Delete some states + virtual void DeleteStates() = 0; // Delete all states + virtual void DeleteArcs(StateId, size_t n) = 0; // Delete some arcs at state + virtual void DeleteArcs(StateId) = 0; // Delete all arcs at state + + virtual void ReserveStates(StateId n) { } // Optional, best effort only. + virtual void ReserveArcs(StateId s, size_t n) { } // Optional, Best effort. + + // Return input label symbol table; return NULL if not specified + virtual const SymbolTable* InputSymbols() const = 0; + // Return output label symbol table; return NULL if not specified + virtual const SymbolTable* OutputSymbols() const = 0; + + // Return input label symbol table; return NULL if not specified + virtual SymbolTable* MutableInputSymbols() = 0; + // Return output label symbol table; return NULL if not specified + virtual SymbolTable* MutableOutputSymbols() = 0; + + // Set input label symbol table; NULL signifies not unspecified + virtual void SetInputSymbols(const SymbolTable* isyms) = 0; + // Set output label symbol table; NULL signifies not unspecified + virtual void SetOutputSymbols(const SymbolTable* osyms) = 0; + + // Get a copy of this MutableFst. See Fst<>::Copy() for further doc. + virtual MutableFst *Copy(bool safe = false) const = 0; + + // Read an MutableFst from an input stream; return NULL on error. + static MutableFst *Read(istream &strm, const FstReadOptions &opts) { + FstReadOptions ropts(opts); + FstHeader hdr; + if (ropts.header) + hdr = *opts.header; + else { + if (!hdr.Read(strm, opts.source)) + return 0; + ropts.header = &hdr; + } + if (!(hdr.Properties() & kMutable)) { + LOG(ERROR) << "MutableFst::Read: Not an MutableFst: " << ropts.source; + return 0; + } + FstRegister *registr = FstRegister::GetRegister(); + const typename FstRegister::Reader reader = + registr->GetReader(hdr.FstType()); + if (!reader) { + LOG(ERROR) << "MutableFst::Read: Unknown FST type \"" << hdr.FstType() + << "\" (arc type = \"" << A::Type() + << "\"): " << ropts.source; + return 0; + } + Fst *fst = reader(strm, ropts); + if (!fst) return 0; + return static_cast *>(fst); + } + + // Read a MutableFst from a file; return NULL on error. + // Empty filename reads from standard input. If 'convert' is true, + // convert to a mutable FST of type 'convert_type' if file is + // a non-mutable FST. + static MutableFst *Read(const string &filename, bool convert = false, + const string &convert_type = "vector") { + if (convert == false) { + if (!filename.empty()) { + ifstream strm(filename.c_str(), ifstream::in | ifstream::binary); + if (!strm) { + LOG(ERROR) << "MutableFst::Read: Can't open file: " << filename; + return 0; + } + return Read(strm, FstReadOptions(filename)); + } else { + return Read(std::cin, FstReadOptions("standard input")); + } + } else { // Converts to 'convert_type' if not mutable. + Fst *ifst = Fst::Read(filename); + if (!ifst) return 0; + if (ifst->Properties(kMutable, false)) { + return static_cast(ifst); + } else { + Fst *ofst = Convert(*ifst, convert_type); + delete ifst; + if (!ofst) return 0; + if (!ofst->Properties(kMutable, false)) + LOG(ERROR) << "MutableFst: bad convert type: " << convert_type; + return static_cast(ofst); + } + } + } + + // For generic mutuble arc iterator construction; not normally called + // directly by users. + virtual void InitMutableArcIterator(StateId s, + MutableArcIteratorData *) = 0; +}; + +// Mutable arc iterator interface, templated on the Arc definition; used +// for mutable Arc iterator specializations that are returned by +// the InitMutableArcIterator MutableFst method. +template +class MutableArcIteratorBase : public ArcIteratorBase { + public: + typedef A Arc; + + void SetValue(const A &arc) { SetValue_(arc); } // Set current arc's content + + private: + virtual void SetValue_(const A &arc) = 0; +}; + +template +struct MutableArcIteratorData { + MutableArcIteratorBase *base; // Specific iterator +}; + +// Generic mutable arc iterator, templated on the FST definition +// - a wrapper around pointer to specific one. +// Here is a typical use: \code +// for (MutableArcIterator aiter(&fst, s)); +// !aiter.Done(); +// aiter.Next()) { +// StdArc arc = aiter.Value(); +// arc.ilabel = 7; +// aiter.SetValue(arc); +// ... +// } \endcode +// This version requires function calls. +template +class MutableArcIterator { + public: + typedef F FST; + typedef typename F::Arc Arc; + typedef typename Arc::StateId StateId; + + MutableArcIterator(F *fst, StateId s) { + fst->InitMutableArcIterator(s, &data_); + } + ~MutableArcIterator() { delete data_.base; } + + bool Done() const { return data_.base->Done(); } + const Arc& Value() const { return data_.base->Value(); } + void Next() { data_.base->Next(); } + size_t Position() const { return data_.base->Position(); } + void Reset() { data_.base->Reset(); } + void Seek(size_t a) { data_.base->Seek(a); } + void SetValue(const Arc &a) { data_.base->SetValue(a); } + uint32 Flags() const { return data_.base->Flags(); } + void SetFlags(uint32 f, uint32 m) { + return data_.base->SetFlags(f, m); + } + + private: + MutableArcIteratorData data_; + DISALLOW_COPY_AND_ASSIGN(MutableArcIterator); +}; + + +namespace internal { + +// MutableFst case - abstract methods. +template inline +typename A::Weight Final(const MutableFst &fst, typename A::StateId s) { + return fst.Final(s); +} + +template inline +ssize_t NumArcs(const MutableFst &fst, typename A::StateId s) { + return fst.NumArcs(s); +} + +template inline +ssize_t NumInputEpsilons(const MutableFst &fst, typename A::StateId s) { + return fst.NumInputEpsilons(s); +} + +template inline +ssize_t NumOutputEpsilons(const MutableFst &fst, typename A::StateId s) { + return fst.NumOutputEpsilons(s); +} + +} // namespace internal + + +// A useful alias when using StdArc. +typedef MutableFst StdMutableFst; + + +// This is a helper class template useful for attaching a MutableFst +// interface to its implementation, handling reference counting and +// copy-on-write. +template > +class ImplToMutableFst : public ImplToExpandedFst { + public: + typedef typename I::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + using ImplToFst::GetImpl; + using ImplToFst::SetImpl; + + virtual void SetStart(StateId s) { + MutateCheck(); + GetImpl()->SetStart(s); + } + + virtual void SetFinal(StateId s, Weight w) { + MutateCheck(); + GetImpl()->SetFinal(s, w); + } + + virtual void SetProperties(uint64 props, uint64 mask) { + // Can skip mutate check if extrinsic properties don't change, + // since it is then safe to update all (shallow) copies + uint64 exprops = kExtrinsicProperties & mask; + if (GetImpl()->Properties(exprops) != (props & exprops)) + MutateCheck(); + GetImpl()->SetProperties(props, mask); + } + + virtual StateId AddState() { + MutateCheck(); + return GetImpl()->AddState(); + } + + virtual void AddArc(StateId s, const Arc &arc) { + MutateCheck(); + GetImpl()->AddArc(s, arc); + } + + virtual void DeleteStates(const vector &dstates) { + MutateCheck(); + GetImpl()->DeleteStates(dstates); + } + + virtual void DeleteStates() { + MutateCheck(); + GetImpl()->DeleteStates(); + } + + virtual void DeleteArcs(StateId s, size_t n) { + MutateCheck(); + GetImpl()->DeleteArcs(s, n); + } + + virtual void DeleteArcs(StateId s) { + MutateCheck(); + GetImpl()->DeleteArcs(s); + } + + virtual void ReserveStates(StateId s) { + MutateCheck(); + GetImpl()->ReserveStates(s); + } + + virtual void ReserveArcs(StateId s, size_t n) { + MutateCheck(); + GetImpl()->ReserveArcs(s, n); + } + + virtual const SymbolTable* InputSymbols() const { + return GetImpl()->InputSymbols(); + } + + virtual const SymbolTable* OutputSymbols() const { + return GetImpl()->OutputSymbols(); + } + + virtual SymbolTable* MutableInputSymbols() { + MutateCheck(); + return GetImpl()->InputSymbols(); + } + + virtual SymbolTable* MutableOutputSymbols() { + MutateCheck(); + return GetImpl()->OutputSymbols(); + } + + virtual void SetInputSymbols(const SymbolTable* isyms) { + MutateCheck(); + GetImpl()->SetInputSymbols(isyms); + } + + virtual void SetOutputSymbols(const SymbolTable* osyms) { + MutateCheck(); + GetImpl()->SetOutputSymbols(osyms); + } + + protected: + ImplToMutableFst() : ImplToExpandedFst() {} + + ImplToMutableFst(I *impl) : ImplToExpandedFst(impl) {} + + + ImplToMutableFst(const ImplToMutableFst &fst) + : ImplToExpandedFst(fst) {} + + ImplToMutableFst(const ImplToMutableFst &fst, bool safe) + : ImplToExpandedFst(fst, safe) {} + + void MutateCheck() { + // Copy on write + if (GetImpl()->RefCount() > 1) + SetImpl(new I(*this)); + } + + private: + // Disallow + ImplToMutableFst &operator=(const ImplToMutableFst &fst); + + ImplToMutableFst &operator=(const Fst &fst) { + FSTERROR() << "ImplToMutableFst: Assignment operator disallowed"; + GetImpl()->SetProperties(kError, kError); + return *this; + } +}; + + +} // namespace fst + +#endif // FST_LIB_MUTABLE_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/pair-weight.h b/extlibs/openfstwin-1.3.1/include/fst/pair-weight.h new file mode 100755 index 00000000000..7d8aa118ac2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/pair-weight.h @@ -0,0 +1,280 @@ +// pair-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: shumash@google.com (Masha Maria Shugrina) +// +// \file +// Pair weight templated base class for weight classes that +// contain two weights (e.g. Product, Lexicographic) + +#ifndef FST_LIB_PAIR_WEIGHT_H_ +#define FST_LIB_PAIR_WEIGHT_H_ + +#include +#include +#include + +#include + + +DECLARE_string(fst_weight_parentheses); +DECLARE_string(fst_weight_separator); + +namespace fst { + +template class PairWeight; +template +istream &operator>>(istream &strm, PairWeight &w); + +template +class PairWeight { + public: + friend istream &operator>>(istream&, PairWeight&); + + typedef PairWeight + ReverseWeight; + + PairWeight() {} + + PairWeight(const PairWeight& w) : value1_(w.value1_), value2_(w.value2_) {} + + PairWeight(W1 w1, W2 w2) : value1_(w1), value2_(w2) {} + + static const PairWeight &Zero() { + static const PairWeight zero(W1::Zero(), W2::Zero()); + return zero; + } + + static const PairWeight &One() { + static const PairWeight one(W1::One(), W2::One()); + return one; + } + + static const PairWeight &NoWeight() { + static const PairWeight no_weight(W1::NoWeight(), W2::NoWeight()); + return no_weight; + } + + istream &Read(istream &strm) { + value1_.Read(strm); + return value2_.Read(strm); + } + + ostream &Write(ostream &strm) const { + value1_.Write(strm); + return value2_.Write(strm); + } + + PairWeight &operator=(const PairWeight &w) { + value1_ = w.Value1(); + value2_ = w.Value2(); + return *this; + } + + bool Member() const { return value1_.Member() && value2_.Member(); } + + size_t Hash() const { + size_t h1 = value1_.Hash(); + size_t h2 = value2_.Hash(); + const int lshift = 5; + const int rshift = CHAR_BIT * sizeof(size_t) - 5; + return h1 << lshift ^ h1 >> rshift ^ h2; + } + + PairWeight Quantize(float delta = kDelta) const { + return PairWeight(value1_.Quantize(delta), + value2_.Quantize(delta)); + } + + ReverseWeight Reverse() const { + return ReverseWeight(value1_.Reverse(), value2_.Reverse()); + } + + const W1& Value1() const { return value1_; } + + const W2& Value2() const { return value2_; } + + protected: + void SetValue1(const W1 &w) { value1_ = w; } + void SetValue2(const W2 &w) { value2_ = w; } + + // Reads PairWeight when there are not parentheses around pair terms + inline static istream &ReadNoParen( + istream &strm, PairWeight& w, char separator) { + int c; + do { + c = strm.get(); + } while (isspace(c)); + + string s1; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s1 += c; + c = strm.get(); + } + istringstream strm1(s1); + W1 w1 = W1::Zero(); + strm1 >> w1; + + // read second element + W2 w2 = W2::Zero(); + strm >> w2; + + w = PairWeight(w1, w2); + return strm; + } + + // Reads PairWeight when there are parentheses around pair terms + inline static istream &ReadWithParen( + istream &strm, PairWeight& w, + char separator, char open_paren, char close_paren) { + int c; + do { + c = strm.get(); + } while (isspace(c)); + if (c != open_paren) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::failbit); + return strm; + } + c = strm.get(); + + // read first element + stack parens; + string s1; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s1 += c; + // if parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream strm1(s1); + W1 w1 = W1::Zero(); + strm1 >> w1; + + // read second element + string s2; + c = strm.get(); + while (c != EOF) { + s2 += c; + c = strm.get(); + } + if (s2.empty() || (s2[s2.size() - 1] != close_paren)) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::failbit); + return strm; + } + + s2.erase(s2.size() - 1, 1); + istringstream strm2(s2); + W2 w2 = W2::Zero(); + strm2 >> w2; + + w = PairWeight(w1, w2); + return strm; + } + + private: + W1 value1_; + W2 value2_; + +}; + +template +inline bool operator==(const PairWeight &w, + const PairWeight &v) { + return w.Value1() == v.Value1() && w.Value2() == v.Value2(); +} + +template +inline bool operator!=(const PairWeight &w1, + const PairWeight &w2) { + return w1.Value1() != w2.Value1() || w1.Value2() != w2.Value2(); +} + + +template +inline bool ApproxEqual(const PairWeight &w1, + const PairWeight &w2, + float delta = kDelta) { + return ApproxEqual(w1.Value1(), w2.Value1(), delta) && + ApproxEqual(w1.Value2(), w2.Value2(), delta); +} + +template +inline ostream &operator<<(ostream &strm, const PairWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + if (FLAGS_fst_weight_parentheses.empty()) + return strm << w.Value1() << separator << w.Value2(); + + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + char open_paren = FLAGS_fst_weight_parentheses[0]; + char close_paren = FLAGS_fst_weight_parentheses[1]; + return strm << open_paren << w.Value1() << separator + << w.Value2() << close_paren ; +} + +template +inline istream &operator>>(istream &strm, PairWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + bool read_parens = !FLAGS_fst_weight_parentheses.empty(); + if (read_parens) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + return PairWeight::ReadWithParen( + strm, w, separator, FLAGS_fst_weight_parentheses[0], + FLAGS_fst_weight_parentheses[1]); + } else { + return PairWeight::ReadNoParen(strm, w, separator); + } +} + +} // namespace fst + +#endif // FST_LIB_PAIR_WEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/partition.h b/extlibs/openfstwin-1.3.1/include/fst/partition.h new file mode 100755 index 00000000000..dcee67bd4da --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/partition.h @@ -0,0 +1,290 @@ +// partition.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file Functions and classes to create a partition of states +// + +#ifndef FST_LIB_PARTITION_H__ +#define FST_LIB_PARTITION_H__ + +#include +using std::vector; +#include + + +#include + + + +namespace fst { + +template class PartitionIterator; + +// \class Partition +// \brief Defines a partitioning of states. Typically used to represent +// equivalence classes for Fst operations like minimization. +// +template +class Partition { + friend class PartitionIterator; + + struct Element { + Element() : value(0), next(0), prev(0) {} + Element(T v) : value(v), next(0), prev(0) {} + + T value; + Element* next; + Element* prev; + }; + + public: + Partition() {} + + Partition(T num_states) { + Initialize(num_states); + } + + ~Partition() { + for (size_t i = 0; i < elements_.size(); ++i) + delete elements_[i]; + } + + // Create an empty partition for num_states. At initialization time + // all elements are not assigned to a class (i.e class_index = -1). + // Initialize just creates num_states of elements. All element + // operations are then done by simply disconnecting the element from + // it current class and placing it at the head of the next class. + void Initialize(size_t num_states) { + for (size_t i = 0; i < elements_.size(); ++i) + delete elements_[i]; + elements_.clear(); + classes_.clear(); + class_index_.clear(); + + elements_.resize(num_states); + class_index_.resize(num_states, -1); + class_size_.reserve(num_states); + for (size_t i = 0; i < num_states; ++i) + elements_[i] = new Element(i); + num_states_ = num_states; + } + + // Add a class, resize classes_ and class_size_ resource by 1. + size_t AddClass() { + size_t num_classes = classes_.size(); + classes_.resize(num_classes + 1, 0); + class_size_.resize(num_classes + 1, 0); + class_split_.resize(num_classes + 1, 0); + split_size_.resize(num_classes + 1, 0); + return num_classes; + } + + void AllocateClasses(T num_classes) { + size_t n = classes_.size() + num_classes; + classes_.resize(n, 0); + class_size_.resize(n, 0); + class_split_.resize(n, 0); + split_size_.resize(n, 0); + } + + // Add element_id to class_id. The Add method is used to initialize + // partition. Once elements have been added to a class, you need to + // use the Move() method move an element from once class to another. + void Add(T element_id, T class_id) { + Element* element = elements_[element_id]; + + if (classes_[class_id]) + classes_[class_id]->prev = element; + element->next = classes_[class_id]; + element->prev = 0; + classes_[class_id] = element; + + class_index_[element_id] = class_id; + class_size_[class_id]++; + } + + // Move and element_id to class_id. Disconnects (removes) element + // from it current class and + void Move(T element_id, T class_id) { + T old_class_id = class_index_[element_id]; + + Element* element = elements_[element_id]; + if (element->next) element->next->prev = element->prev; + if (element->prev) element->prev->next = element->next; + else classes_[old_class_id] = element->next; + + Add(element_id, class_id); + class_size_[old_class_id]--; + } + + // split class on the element_id + void SplitOn(T element_id) { + T class_id = class_index_[element_id]; + if (class_size_[class_id] == 1) return; + + // first time class is split + if (split_size_[class_id] == 0) + visited_classes_.push_back(class_id); + + // increment size of split (set of element at head of chain) + split_size_[class_id]++; + + // update split point + if (class_split_[class_id] == 0) + class_split_[class_id] = classes_[class_id]; + if (class_split_[class_id] == elements_[element_id]) + class_split_[class_id] = elements_[element_id]->next; + + // move to head of chain in same class + Move(element_id, class_id); + } + + // Finalize class_id, split if required, and update class_splits, + // class indices of the newly created class. Returns the new_class id + // or -1 if no new class was created. + T SplitRefine(T class_id) { + // only split if necessary + if (class_size_[class_id] == split_size_[class_id]) { + class_split_[class_id] = 0; + split_size_[class_id] = 0; + return -1; + } else { + + T new_class = AddClass(); + size_t remainder = class_size_[class_id] - split_size_[class_id]; + if (remainder < split_size_[class_id]) { // add smaller + Element* split_el = class_split_[class_id]; + classes_[new_class] = split_el; + class_size_[class_id] = split_size_[class_id]; + class_size_[new_class] = remainder; + split_el->prev->next = 0; + split_el->prev = 0; + } else { + Element* split_el = class_split_[class_id]; + classes_[new_class] = classes_[class_id]; + class_size_[class_id] = remainder; + class_size_[new_class] = split_size_[class_id]; + split_el->prev->next = 0; + split_el->prev = 0; + classes_[class_id] = split_el; + } + + // update class index for element in new class + for (Element* el = classes_[new_class]; el; el = el->next) + class_index_[el->value] = new_class; + + class_split_[class_id] = 0; + split_size_[class_id] = 0; + + return new_class; + } + } + + // Once all states have been processed for a particular class C, we + // can finalize the split. FinalizeSplit() will update each block in the + // partition, create new once and update the queue of active classes + // that require further refinement. + template + void FinalizeSplit(Queue* L) { + for (size_t i = 0; i < visited_classes_.size(); ++i) { + T new_class = SplitRefine(visited_classes_[i]); + if (new_class != -1 && L) + L->Enqueue(new_class); + } + visited_classes_.clear(); + } + + + const T class_id(T element_id) const { + return class_index_[element_id]; + } + + const vector& class_sizes() const { + return class_size_; + } + + const size_t class_size(T class_id) const { + return class_size_[class_id]; + } + + const T num_classes() const { + return classes_.size(); + } + + + private: + int num_states_; + + // container of all elements (owner of ptrs) + vector elements_; + + // linked list of elements belonging to class + vector classes_; + + // pointer to split point for each class + vector class_split_; + + // class index of element + vector class_index_; + + // class sizes + vector class_size_; + + // size of split for each class + vector split_size_; + + // set of visited classes to be used in split refine + vector visited_classes_; +}; + + +// iterate over members of a class in a partition +template +class PartitionIterator { + typedef typename Partition::Element Element; + public: + PartitionIterator(const Partition& partition, T class_id) + : p_(partition), + element_(p_.classes_[class_id]), + class_id_(class_id) {} + + bool Done() { + return (element_ == 0); + } + + const T Value() { + return (element_->value); + } + + void Next() { + element_ = element_->next; + } + + void Reset() { + element_ = p_.classes_[class_id_]; + } + + private: + const Partition& p_; + + const Element* element_; + + T class_id_; +}; +} // namespace fst + +#endif // FST_LIB_PARTITION_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/power-weight.h b/extlibs/openfstwin-1.3.1/include/fst/power-weight.h new file mode 100755 index 00000000000..256928d71d6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/power-weight.h @@ -0,0 +1,159 @@ +// power-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Cartesian power weight semiring operation definitions. + +#ifndef FST_LIB_POWER_WEIGHT_H__ +#define FST_LIB_POWER_WEIGHT_H__ + +#include +#include + + +namespace fst { + +// Cartesian power semiring: W ^ n +// Forms: +// - a left semimodule when W is a left semiring, +// - a right semimodule when W is a right semiring, +// - a bisemimodule when W is a semiring, +// the free semimodule of rank n over W +// The Times operation is overloaded to provide the +// left and right scalar products. +template +class PowerWeight : public TupleWeight { + public: + using TupleWeight::Zero; + using TupleWeight::One; + using TupleWeight::NoWeight; + using TupleWeight::Quantize; + using TupleWeight::Reverse; + + typedef PowerWeight ReverseWeight; + + PowerWeight() {} + + PowerWeight(const TupleWeight &w) : TupleWeight(w) {} + + template + PowerWeight(Iterator begin, Iterator end) : TupleWeight(begin, end) {} + + static const PowerWeight &Zero() { + static const PowerWeight zero(TupleWeight::Zero()); + return zero; + } + + static const PowerWeight &One() { + static const PowerWeight one(TupleWeight::One()); + return one; + } + + static const PowerWeight &NoWeight() { + static const PowerWeight no_weight(TupleWeight::NoWeight()); + return no_weight; + } + + static const string &Type() { + static string type; + if (type.empty()) { + string power; + Int64ToStr(n, &power); + type = W::Type() + "_^" + power; + } + return type; + } + + static uint64 Properties() { + uint64 props = W::Properties(); + return props & (kLeftSemiring | kRightSemiring | + kCommutative | kIdempotent); + } + + PowerWeight Quantize(float delta = kDelta) const { + return TupleWeight::Quantize(delta); + } + + ReverseWeight Reverse() const { + return TupleWeight::Reverse(); + } +}; + + +// Semiring plus operation +template +inline PowerWeight Plus(const PowerWeight &w1, + const PowerWeight &w2) { + PowerWeight w; + for (size_t i = 0; i < n; ++i) + w.SetValue(i, Plus(w1.Value(i), w2.Value(i))); + return w; +} + +// Semiring times operation +template +inline PowerWeight Times(const PowerWeight &w1, + const PowerWeight &w2) { + PowerWeight w; + for (size_t i = 0; i < n; ++i) + w.SetValue(i, Times(w1.Value(i), w2.Value(i))); + return w; +} + +// Semiring divide operation +template +inline PowerWeight Divide(const PowerWeight &w1, + const PowerWeight &w2, + DivideType type = DIVIDE_ANY) { + PowerWeight w; + for (size_t i = 0; i < n; ++i) + w.SetValue(i, Divide(w1.Value(i), w2.Value(i), type)); + return w; +} + +// Semimodule left scalar product +template +inline PowerWeight Times(const W &s, const PowerWeight &w) { + PowerWeight sw; + for (size_t i = 0; i < n; ++i) + sw.SetValue(i, Times(s, w.Value(i))); + return w; +} + +// Semimodule right scalar product +template +inline PowerWeight Times(const PowerWeight &w, const W &s) { + PowerWeight ws; + for (size_t i = 0; i < n; ++i) + ws.SetValue(i, Times(w.Value(i), s)); + return w; +} + +// Semimodule dot product +template +inline W DotProduct(const PowerWeight &w1, + const PowerWeight &w2) { + W w = W::Zero(); + for (size_t i = 0; i < n; ++i) + w = Plus(w, Times(w1.Value(i), w2.Value(i))); + return w; +} + + +} // namespace fst + +#endif // FST_LIB_POWER_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/product-weight.h b/extlibs/openfstwin-1.3.1/include/fst/product-weight.h new file mode 100755 index 00000000000..16dede8a048 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/product-weight.h @@ -0,0 +1,115 @@ +// product-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Product weight set and associated semiring operation definitions. + +#ifndef FST_LIB_PRODUCT_WEIGHT_H__ +#define FST_LIB_PRODUCT_WEIGHT_H__ + +#include +#include + +#include +#include + + +namespace fst { + +// Product semiring: W1 * W2 +template +class ProductWeight : public PairWeight { + public: + using PairWeight::Zero; + using PairWeight::One; + using PairWeight::NoWeight; + using PairWeight::Quantize; + using PairWeight::Reverse; + + typedef ProductWeight + ReverseWeight; + + ProductWeight() {} + + ProductWeight(const PairWeight& w) : PairWeight(w) {} + + ProductWeight(W1 w1, W2 w2) : PairWeight(w1, w2) {} + + static const ProductWeight &Zero() { + static const ProductWeight zero(PairWeight::Zero()); + return zero; + } + + static const ProductWeight &One() { + static const ProductWeight one(PairWeight::One()); + return one; + } + + static const ProductWeight &NoWeight() { + static const ProductWeight no_weight( + PairWeight::NoWeight()); + return no_weight; + } + + static const string &Type() { + static const string type = W1::Type() + "_X_" + W2::Type(); + return type; + } + + static uint64 Properties() { + uint64 props1 = W1::Properties(); + uint64 props2 = W2::Properties(); + return props1 & props2 & (kLeftSemiring | kRightSemiring | + kCommutative | kIdempotent); + } + + ProductWeight Quantize(float delta = kDelta) const { + return PairWeight::Quantize(delta); + } + + ReverseWeight Reverse() const { + return PairWeight::Reverse(); + } + + +}; + +template +inline ProductWeight Plus(const ProductWeight &w, + const ProductWeight &v) { + return ProductWeight(Plus(w.Value1(), v.Value1()), + Plus(w.Value2(), v.Value2())); +} + +template +inline ProductWeight Times(const ProductWeight &w, + const ProductWeight &v) { + return ProductWeight(Times(w.Value1(), v.Value1()), + Times(w.Value2(), v.Value2())); +} + +template +inline ProductWeight Divide(const ProductWeight &w, + const ProductWeight &v, + DivideType typ = DIVIDE_ANY) { + return ProductWeight(Divide(w.Value1(), v.Value1(), typ), + Divide(w.Value2(), v.Value2(), typ)); +} + +} // namespace fst + +#endif // FST_LIB_PRODUCT_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/project.h b/extlibs/openfstwin-1.3.1/include/fst/project.h new file mode 100755 index 00000000000..07946c35b87 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/project.h @@ -0,0 +1,148 @@ +// project.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to project an Fst on to its domain or range. + +#ifndef FST_LIB_PROJECT_H__ +#define FST_LIB_PROJECT_H__ + +#include +#include + + +namespace fst { + +// This specifies whether to project on input or output. +enum ProjectType { PROJECT_INPUT = 1, PROJECT_OUTPUT = 2 }; + + +// Mapper to implement projection per arc. +template class ProjectMapper { + public: + explicit ProjectMapper(ProjectType project_type) + : project_type_(project_type) {} + + A operator()(const A &arc) { + typename A::Label label = project_type_ == PROJECT_INPUT + ? arc.ilabel : arc.olabel; + return A(label, label, arc.weight, arc.nextstate); + } + + MapFinalAction FinalAction() const { return MAP_NO_SUPERFINAL; } + + MapSymbolsAction InputSymbolsAction() const { + return project_type_ == PROJECT_INPUT ? MAP_COPY_SYMBOLS : + MAP_CLEAR_SYMBOLS; + } + + MapSymbolsAction OutputSymbolsAction() const { + return project_type_ == PROJECT_OUTPUT ? MAP_COPY_SYMBOLS : + MAP_CLEAR_SYMBOLS; + } + + uint64 Properties(uint64 props) { + return ProjectProperties(props, project_type_ == PROJECT_INPUT); + } + + + private: + ProjectType project_type_; +}; + + +// Projects an FST onto its domain or range by either copying each arcs' +// input label to the output label or vice versa. This version modifies +// its input. +// +// Complexity: +// - Time: O(V + E) +// - Space: O(1) +// where V = # of states and E = # of arcs. +template inline +void Project(MutableFst *fst, ProjectType project_type) { + ArcMap(fst, ProjectMapper(project_type)); + if (project_type == PROJECT_INPUT) + fst->SetOutputSymbols(fst->InputSymbols()); + if (project_type == PROJECT_OUTPUT) + fst->SetInputSymbols(fst->OutputSymbols()); +} + + +// Projects an FST onto its domain or range by either copying each arc's +// input label to the output label or vice versa. This version is a delayed +// Fst. +// +// Complexity: +// - Time: O(v + e) +// - Space: O(1) +// where v = # of states visited, e = # of arcs visited. Constant +// time and to visit an input state or arc is assumed and exclusive +// of caching. +template +class ProjectFst : public ArcMapFst > { + public: + typedef A Arc; + typedef ProjectMapper C; + typedef ArcMapFstImpl< A, A, ProjectMapper > Impl; + using ImplToFst::GetImpl; + + ProjectFst(const Fst &fst, ProjectType project_type) + : ArcMapFst(fst, C(project_type)) { + if (project_type == PROJECT_INPUT) + GetImpl()->SetOutputSymbols(fst.InputSymbols()); + if (project_type == PROJECT_OUTPUT) + GetImpl()->SetInputSymbols(fst.OutputSymbols()); + } + + // See Fst<>::Copy() for doc. + ProjectFst(const ProjectFst &fst, bool safe = false) + : ArcMapFst(fst, safe) {} + + // Get a copy of this ProjectFst. See Fst<>::Copy() for further doc. + virtual ProjectFst *Copy(bool safe = false) const { + return new ProjectFst(*this, safe); + } +}; + + +// Specialization for ProjectFst. +template +class StateIterator< ProjectFst > + : public StateIterator< ArcMapFst > > { + public: + explicit StateIterator(const ProjectFst &fst) + : StateIterator< ArcMapFst > >(fst) {} +}; + + +// Specialization for ProjectFst. +template +class ArcIterator< ProjectFst > + : public ArcIterator< ArcMapFst > > { + public: + ArcIterator(const ProjectFst &fst, typename A::StateId s) + : ArcIterator< ArcMapFst > >(fst, s) {} +}; + + +// Useful alias when using StdArc. +typedef ProjectFst StdProjectFst; + +} // namespace fst + +#endif // FST_LIB_PROJECT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/properties.h b/extlibs/openfstwin-1.3.1/include/fst/properties.h new file mode 100755 index 00000000000..11365f114a9 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/properties.h @@ -0,0 +1,460 @@ +// properties.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: Michael Riley +// \file +// FST property bits. + +#ifndef FST_LIB_PROPERTIES_H__ +#define FST_LIB_PROPERTIES_H__ + +#include +#include +using std::vector; + +#include + +namespace fst { + +// The property bits here assert facts about an FST. If individual +// bits are added, then the composite properties below, the property +// functions and property names in properties.cc, and +// TestProperties() in test-properties.h should be updated. + +// +// BINARY PROPERTIES +// +// For each property below, there is a single bit. If it is set, +// the property is true. If it is not set, the property is false. +// + +// The Fst is an ExpandedFst +const uint64 kExpanded = 0x0000000000000001ULL; + +// The Fst is a MutableFst +const uint64 kMutable = 0x0000000000000002ULL; + +// An error was detected while constructing/using the FST +const uint64 kError = 0x0000000000000004ULL; + +// +// TRINARY PROPERTIES +// +// For each of these properties below there is a pair of property bits +// - one positive and one negative. If the positive bit is set, the +// property is true. If the negative bit is set, the property is +// false. If neither is set, the property has unknown value. Both +// should never be simultaneously set. The individual positive and +// negative bit pairs should be adjacent with the positive bit +// at an odd and lower position. + +// ilabel == olabel for each arc +const uint64 kAcceptor = 0x0000000000010000ULL; +// ilabel != olabel for some arc +const uint64 kNotAcceptor = 0x0000000000020000ULL; + +// ilabels unique leaving each state +const uint64 kIDeterministic = 0x0000000000040000ULL; +// ilabels not unique leaving some state +const uint64 kNonIDeterministic = 0x0000000000080000ULL; + +// olabels unique leaving each state +const uint64 kODeterministic = 0x0000000000100000ULL; +// olabels not unique leaving some state +const uint64 kNonODeterministic = 0x0000000000200000ULL; + +// FST has input/output epsilons +const uint64 kEpsilons = 0x0000000000400000ULL; +// FST has no input/output epsilons +const uint64 kNoEpsilons = 0x0000000000800000ULL; + +// FST has input epsilons +const uint64 kIEpsilons = 0x0000000001000000ULL; +// FST has no input epsilons +const uint64 kNoIEpsilons = 0x0000000002000000ULL; + +// FST has output epsilons +const uint64 kOEpsilons = 0x0000000004000000ULL; +// FST has no output epsilons +const uint64 kNoOEpsilons = 0x0000000008000000ULL; + +// ilabels sorted wrt < for each state +const uint64 kILabelSorted = 0x0000000010000000ULL; +// ilabels not sorted wrt < for some state +const uint64 kNotILabelSorted = 0x0000000020000000ULL; + +// olabels sorted wrt < for each state +const uint64 kOLabelSorted = 0x0000000040000000ULL; +// olabels not sorted wrt < for some state +const uint64 kNotOLabelSorted = 0x0000000080000000ULL; + +// Non-trivial arc or final weights +const uint64 kWeighted = 0x0000000100000000ULL; +// Only trivial arc and final weights +const uint64 kUnweighted = 0x0000000200000000ULL; + +// FST has cycles +const uint64 kCyclic = 0x0000000400000000ULL; +// FST has no cycles +const uint64 kAcyclic = 0x0000000800000000ULL; + +// FST has cycles containing the initial state +const uint64 kInitialCyclic = 0x0000001000000000ULL; +// FST has no cycles containing the initial state +const uint64 kInitialAcyclic = 0x0000002000000000ULL; + +// FST is topologically sorted +const uint64 kTopSorted = 0x0000004000000000ULL; +// FST is not topologically sorted +const uint64 kNotTopSorted = 0x0000008000000000ULL; + +// All states reachable from the initial state +const uint64 kAccessible = 0x0000010000000000ULL; +// Not all states reachable from the initial state +const uint64 kNotAccessible = 0x0000020000000000ULL; + +// All states can reach a final state +const uint64 kCoAccessible = 0x0000040000000000ULL; +// Not all states can reach a final state +const uint64 kNotCoAccessible = 0x0000080000000000ULL; + +// If NumStates() > 0, then state 0 is initial, state NumStates()-1 is +// final, there is a transition from each non-final state i to +// state i+1, and there are no other transitions. +const uint64 kString = 0x0000100000000000ULL; + +// Not a string FST +const uint64 kNotString = 0x0000200000000000ULL; + +// +// COMPOSITE PROPERTIES +// + +// Properties of an empty machine +const uint64 kNullProperties + = kAcceptor | kIDeterministic | kODeterministic | kNoEpsilons | + kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted | + kUnweighted | kAcyclic | kInitialAcyclic | kTopSorted | + kAccessible | kCoAccessible | kString; + +// Properties that are preserved when an FST is copied +const uint64 kCopyProperties + = kError | kAcceptor | kNotAcceptor | kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons | + kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons | + kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properites that are intrinsic to the FST +const uint64 kIntrinsicProperties + = kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properites that are (potentially) extrinsic to the FST +const uint64 kExtrinsicProperties = kError; + +// Properties that are preserved when an FST start state is set +const uint64 kSetStartProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kWeighted | + kUnweighted | kCyclic | kAcyclic | kTopSorted | kNotTopSorted | + kCoAccessible | kNotCoAccessible; + +// Properties that are preserved when an FST final weight is set +const uint64 kSetFinalProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kCyclic | + kAcyclic | kInitialCyclic | kInitialAcyclic | kTopSorted | + kNotTopSorted | kAccessible | kNotAccessible; + +// Properties that are preserved when an FST state is added +const uint64 kAddStateProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kWeighted | + kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kNotAccessible | + kNotCoAccessible | kNotString; + +// Properties that are preserved when an FST arc is added +const uint64 kAddArcProperties = kExpanded | kMutable | kError | kNotAcceptor | + kNonIDeterministic | kNonODeterministic | kEpsilons | kIEpsilons | + kOEpsilons | kNotILabelSorted | kNotOLabelSorted | kWeighted | + kCyclic | kInitialCyclic | kNotTopSorted | kAccessible | kCoAccessible; + +// Properties that are preserved when an FST arc is set +const uint64 kSetArcProperties = kExpanded | kMutable | kError; + +// Properties that are preserved when FST states are deleted +const uint64 kDeleteStatesProperties + = kExpanded | kMutable | kError | kAcceptor | kIDeterministic | + kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | + kInitialAcyclic | kTopSorted; + +// Properties that are preserved when FST arcs are deleted +const uint64 kDeleteArcsProperties + = kExpanded | kMutable | kError | kAcceptor | kIDeterministic | + kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | + kInitialAcyclic | kTopSorted | kNotAccessible | kNotCoAccessible; + +// Properties that are preserved when an FST's states are reordered +const uint64 kStateSortProperties = kExpanded | kMutable | kError | kAcceptor | + kNotAcceptor | kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons | + kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons | + kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted + | kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kAccessible | kNotAccessible | kCoAccessible | + kNotCoAccessible; + +// Properties that are preserved when an FST's arcs are reordered +const uint64 kArcSortProperties = + kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properties that are preserved when an FST's input labels are changed. +const uint64 kILabelInvariantProperties = + kExpanded | kMutable | kError | kODeterministic | kNonODeterministic | + kOEpsilons | kNoOEpsilons | kOLabelSorted | kNotOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible | + kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when an FST's output labels are changed. +const uint64 kOLabelInvariantProperties = + kExpanded | kMutable | kError | kIDeterministic | kNonIDeterministic | + kIEpsilons | kNoIEpsilons | kILabelSorted | kNotILabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible | + kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when an FST's weights are changed. +// This assumes that the set of states that are non-final is not changed. +const uint64 kWeightInvariantProperties = + kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | + kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible | + kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when a superfinal state is added +// and an FSTs final weights are directed to it via new transitions. +const uint64 kAddSuperFinalProperties = kExpanded | kMutable | kError | + kAcceptor | kNotAcceptor | kNonIDeterministic | kNonODeterministic | + kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted | kNotOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kNotTopSorted | kNotAccessible | kCoAccessible | + kNotCoAccessible | kNotString; + +// Properties that are preserved when a superfinal state is removed +// and the epsilon transitions directed to it are made final weights. +const uint64 kRmSuperFinalProperties = kExpanded | kMutable | kError | + kAcceptor | kNotAcceptor | kIDeterministic | kODeterministic | + kNoEpsilons | kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kAccessible | kCoAccessible | + kNotCoAccessible | kString; + +// All binary properties +const uint64 kBinaryProperties = 0x0000000000000007ULL; + +// All trinary properties +const uint64 kTrinaryProperties = 0x00003fffffff0000ULL; + +// +// COMPUTED PROPERTIES +// + +// 1st bit of trinary properties +const uint64 kPosTrinaryProperties = + kTrinaryProperties & 0x5555555555555555ULL; + +// 2nd bit of trinary properties +const uint64 kNegTrinaryProperties = + kTrinaryProperties & 0xaaaaaaaaaaaaaaaaULL; + +// All properties +const uint64 kFstProperties = kBinaryProperties | kTrinaryProperties; + +// +// PROPERTY FUNCTIONS and STRING NAMES (defined in properties.cc) +// + +// Below are functions for getting property bit vectors when executing +// mutating fst operations. +OPENFSTDLL inline uint64 SetStartProperties(uint64 inprops); //ChangedPD +template +uint64 SetFinalProperties(uint64 inprops, Weight old_weight, + Weight new_weight); +inline uint64 AddStateProperties(uint64 inprops); +template +uint64 AddArcProperties(uint64 inprops, typename A::StateId s, const A &arc, + const A *prev_arc); +OPENFSTDLL inline uint64 DeleteStatesProperties(uint64 inprops); //ChangedPD +OPENFSTDLL inline uint64 DeleteAllStatesProperties(uint64 inprops, uint64 staticProps); //ChangedPD +OPENFSTDLL inline uint64 DeleteArcsProperties(uint64 inprops); //ChangedPD + +OPENFSTDLL uint64 ClosureProperties(uint64 inprops, bool star, bool delayed = false); //ChangedPD +OPENFSTDLL uint64 ComplementProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 ComposeProperties(uint64 inprops1, uint64 inprops2); //ChangedPD +OPENFSTDLL uint64 ConcatProperties(uint64 inprops1, uint64 inprops2, //ChangedPD + bool delayed = false); +OPENFSTDLL uint64 DeterminizeProperties(uint64 inprops, bool has_subsequential_label); //ChangedPD +OPENFSTDLL uint64 FactorWeightProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 InvertProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 ProjectProperties(uint64 inprops, bool project_input); //ChangedPD +OPENFSTDLL uint64 RandGenProperties(uint64 inprops, bool weighted); //ChangedPD +OPENFSTDLL uint64 RelabelProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 ReplaceProperties(const vector& inprops, //ChangedPD + ssize_t root, + bool epsilon_on_replace, + bool no_empty_fst); +OPENFSTDLL uint64 ReverseProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 ReweightProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 RmEpsilonProperties(uint64 inprops, bool delayed = false); //ChangedPD +OPENFSTDLL uint64 ShortestPathProperties(uint64 props); //ChangedPD +OPENFSTDLL uint64 SynchronizeProperties(uint64 inprops); //ChangedPD +OPENFSTDLL uint64 UnionProperties(uint64 inprops1, uint64 inprops2, bool delayed = false); //ChangedPD + +// Definitions of inlined functions. + +uint64 SetStartProperties(uint64 inprops) { + uint64 outprops = inprops & kSetStartProperties; + if (inprops & kAcyclic) { + outprops |= kInitialAcyclic; + } + return outprops; +} + +uint64 AddStateProperties(uint64 inprops) { + return inprops & kAddStateProperties; +} + +uint64 DeleteStatesProperties(uint64 inprops) { + return inprops & kDeleteStatesProperties; +} + +uint64 DeleteAllStatesProperties(uint64 inprops, uint64 staticprops) { + uint64 outprops = inprops & kError; + return outprops | kNullProperties | staticprops; +} + +uint64 DeleteArcsProperties(uint64 inprops) { + return inprops & kDeleteArcsProperties; +} + +// Definitions of template functions. + +// +template +uint64 SetFinalProperties(uint64 inprops, Weight old_weight, + Weight new_weight) { + uint64 outprops = inprops; + if (old_weight != Weight::Zero() && old_weight != Weight::One()) { + outprops &= ~kWeighted; + } + if (new_weight != Weight::Zero() && new_weight != Weight::One()) { + outprops |= kWeighted; + outprops &= ~kUnweighted; + } + outprops &= kSetFinalProperties | kWeighted | kUnweighted; + return outprops; +} + +/// Gets the properties for the MutableFst::AddArc method. +/// +/// \param inprops the current properties of the fst +/// \param s the id of the state to which an arc is being added +/// \param arc the arc being added to the state with the specified id +/// \param prev_arc the previously-added (or "last") arc of state s, or NULL if +/// s currently has no arcs +template +uint64 AddArcProperties(uint64 inprops, typename A::StateId s, + const A &arc, const A *prev_arc) { + uint64 outprops = inprops; + if (arc.ilabel != arc.olabel) { + outprops |= kNotAcceptor; + outprops &= ~kAcceptor; + } + if (arc.ilabel == 0) { + outprops |= kIEpsilons; + outprops &= ~kNoIEpsilons; + if (arc.olabel == 0) { + outprops |= kEpsilons; + outprops &= ~kNoEpsilons; + } + } + if (arc.olabel == 0) { + outprops |= kOEpsilons; + outprops &= ~kNoOEpsilons; + } + if (prev_arc != 0) { + if (prev_arc->ilabel > arc.ilabel) { + outprops |= kNotILabelSorted; + outprops &= ~kILabelSorted; + } + if (prev_arc->olabel > arc.olabel) { + outprops |= kNotOLabelSorted; + outprops &= ~kOLabelSorted; + } + } + if (arc.weight != A::Weight::Zero() && arc.weight != A::Weight::One()) { + outprops |= kWeighted; + outprops &= ~kUnweighted; + } + if (arc.nextstate <= s) { + outprops |= kNotTopSorted; + outprops &= ~kTopSorted; + } + outprops &= kAddArcProperties | kAcceptor | + kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kTopSorted; + if (outprops & kTopSorted) { + outprops |= kAcyclic | kInitialAcyclic; + } + return outprops; +} + +extern const char *PropertyNames[]; + +} // namespace fst + +#endif // FST_LIB_PROPERTIES_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/properties.h.bak b/extlibs/openfstwin-1.3.1/include/fst/properties.h.bak new file mode 100755 index 00000000000..8fab16ff3cd --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/properties.h.bak @@ -0,0 +1,460 @@ +// properties.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: Michael Riley +// \file +// FST property bits. + +#ifndef FST_LIB_PROPERTIES_H__ +#define FST_LIB_PROPERTIES_H__ + +#include +#include +using std::vector; + +#include + +namespace fst { + +// The property bits here assert facts about an FST. If individual +// bits are added, then the composite properties below, the property +// functions and property names in properties.cc, and +// TestProperties() in test-properties.h should be updated. + +// +// BINARY PROPERTIES +// +// For each property below, there is a single bit. If it is set, +// the property is true. If it is not set, the property is false. +// + +// The Fst is an ExpandedFst +const uint64 kExpanded = 0x0000000000000001ULL; + +// The Fst is a MutableFst +const uint64 kMutable = 0x0000000000000002ULL; + +// An error was detected while constructing/using the FST +const uint64 kError = 0x0000000000000004ULL; + +// +// TRINARY PROPERTIES +// +// For each of these properties below there is a pair of property bits +// - one positive and one negative. If the positive bit is set, the +// property is true. If the negative bit is set, the property is +// false. If neither is set, the property has unknown value. Both +// should never be simultaneously set. The individual positive and +// negative bit pairs should be adjacent with the positive bit +// at an odd and lower position. + +// ilabel == olabel for each arc +const uint64 kAcceptor = 0x0000000000010000ULL; +// ilabel != olabel for some arc +const uint64 kNotAcceptor = 0x0000000000020000ULL; + +// ilabels unique leaving each state +const uint64 kIDeterministic = 0x0000000000040000ULL; +// ilabels not unique leaving some state +const uint64 kNonIDeterministic = 0x0000000000080000ULL; + +// olabels unique leaving each state +const uint64 kODeterministic = 0x0000000000100000ULL; +// olabels not unique leaving some state +const uint64 kNonODeterministic = 0x0000000000200000ULL; + +// FST has input/output epsilons +const uint64 kEpsilons = 0x0000000000400000ULL; +// FST has no input/output epsilons +const uint64 kNoEpsilons = 0x0000000000800000ULL; + +// FST has input epsilons +const uint64 kIEpsilons = 0x0000000001000000ULL; +// FST has no input epsilons +const uint64 kNoIEpsilons = 0x0000000002000000ULL; + +// FST has output epsilons +const uint64 kOEpsilons = 0x0000000004000000ULL; +// FST has no output epsilons +const uint64 kNoOEpsilons = 0x0000000008000000ULL; + +// ilabels sorted wrt < for each state +const uint64 kILabelSorted = 0x0000000010000000ULL; +// ilabels not sorted wrt < for some state +const uint64 kNotILabelSorted = 0x0000000020000000ULL; + +// olabels sorted wrt < for each state +const uint64 kOLabelSorted = 0x0000000040000000ULL; +// olabels not sorted wrt < for some state +const uint64 kNotOLabelSorted = 0x0000000080000000ULL; + +// Non-trivial arc or final weights +const uint64 kWeighted = 0x0000000100000000ULL; +// Only trivial arc and final weights +const uint64 kUnweighted = 0x0000000200000000ULL; + +// FST has cycles +const uint64 kCyclic = 0x0000000400000000ULL; +// FST has no cycles +const uint64 kAcyclic = 0x0000000800000000ULL; + +// FST has cycles containing the initial state +const uint64 kInitialCyclic = 0x0000001000000000ULL; +// FST has no cycles containing the initial state +const uint64 kInitialAcyclic = 0x0000002000000000ULL; + +// FST is topologically sorted +const uint64 kTopSorted = 0x0000004000000000ULL; +// FST is not topologically sorted +const uint64 kNotTopSorted = 0x0000008000000000ULL; + +// All states reachable from the initial state +const uint64 kAccessible = 0x0000010000000000ULL; +// Not all states reachable from the initial state +const uint64 kNotAccessible = 0x0000020000000000ULL; + +// All states can reach a final state +const uint64 kCoAccessible = 0x0000040000000000ULL; +// Not all states can reach a final state +const uint64 kNotCoAccessible = 0x0000080000000000ULL; + +// If NumStates() > 0, then state 0 is initial, state NumStates()-1 is +// final, there is a transition from each non-final state i to +// state i+1, and there are no other transitions. +const uint64 kString = 0x0000100000000000ULL; + +// Not a string FST +const uint64 kNotString = 0x0000200000000000ULL; + +// +// COMPOSITE PROPERTIES +// + +// Properties of an empty machine +const uint64 kNullProperties + = kAcceptor | kIDeterministic | kODeterministic | kNoEpsilons | + kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted | + kUnweighted | kAcyclic | kInitialAcyclic | kTopSorted | + kAccessible | kCoAccessible | kString; + +// Properties that are preserved when an FST is copied +const uint64 kCopyProperties + = kError | kAcceptor | kNotAcceptor | kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons | + kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons | + kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properites that are intrinsic to the FST +const uint64 kIntrinsicProperties + = kExpanded | kMutable | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properites that are (potentially) extrinsic to the FST +const uint64 kExtrinsicProperties = kError; + +// Properties that are preserved when an FST start state is set +const uint64 kSetStartProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kWeighted | + kUnweighted | kCyclic | kAcyclic | kTopSorted | kNotTopSorted | + kCoAccessible | kNotCoAccessible; + +// Properties that are preserved when an FST final weight is set +const uint64 kSetFinalProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kCyclic | + kAcyclic | kInitialCyclic | kInitialAcyclic | kTopSorted | + kNotTopSorted | kAccessible | kNotAccessible; + +// Properties that are preserved when an FST state is added +const uint64 kAddStateProperties + = kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | + kIDeterministic | kNonIDeterministic | kODeterministic | + kNonODeterministic | kEpsilons | kNoEpsilons | kIEpsilons | + kNoIEpsilons | kOEpsilons | kNoOEpsilons | kILabelSorted | + kNotILabelSorted | kOLabelSorted | kNotOLabelSorted | kWeighted | + kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kNotAccessible | + kNotCoAccessible | kNotString; + +// Properties that are preserved when an FST arc is added +const uint64 kAddArcProperties = kExpanded | kMutable | kError | kNotAcceptor | + kNonIDeterministic | kNonODeterministic | kEpsilons | kIEpsilons | + kOEpsilons | kNotILabelSorted | kNotOLabelSorted | kWeighted | + kCyclic | kInitialCyclic | kNotTopSorted | kAccessible | kCoAccessible; + +// Properties that are preserved when an FST arc is set +const uint64 kSetArcProperties = kExpanded | kMutable | kError; + +// Properties that are preserved when FST states are deleted +const uint64 kDeleteStatesProperties + = kExpanded | kMutable | kError | kAcceptor | kIDeterministic | + kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | + kInitialAcyclic | kTopSorted; + +// Properties that are preserved when FST arcs are deleted +const uint64 kDeleteArcsProperties + = kExpanded | kMutable | kError | kAcceptor | kIDeterministic | + kODeterministic | kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kAcyclic | + kInitialAcyclic | kTopSorted | kNotAccessible | kNotCoAccessible; + +// Properties that are preserved when an FST's states are reordered +const uint64 kStateSortProperties = kExpanded | kMutable | kError | kAcceptor | + kNotAcceptor | kIDeterministic | kNonIDeterministic | + kODeterministic | kNonODeterministic | kEpsilons | kNoEpsilons | + kIEpsilons | kNoIEpsilons | kOEpsilons | kNoOEpsilons | + kILabelSorted | kNotILabelSorted | kOLabelSorted | kNotOLabelSorted + | kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kAccessible | kNotAccessible | kCoAccessible | + kNotCoAccessible; + +// Properties that are preserved when an FST's arcs are reordered +const uint64 kArcSortProperties = + kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kWeighted | kUnweighted | kCyclic | kAcyclic | + kInitialCyclic | kInitialAcyclic | kTopSorted | kNotTopSorted | + kAccessible | kNotAccessible | kCoAccessible | kNotCoAccessible | + kString | kNotString; + +// Properties that are preserved when an FST's input labels are changed. +const uint64 kILabelInvariantProperties = + kExpanded | kMutable | kError | kODeterministic | kNonODeterministic | + kOEpsilons | kNoOEpsilons | kOLabelSorted | kNotOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible | + kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when an FST's output labels are changed. +const uint64 kOLabelInvariantProperties = + kExpanded | kMutable | kError | kIDeterministic | kNonIDeterministic | + kIEpsilons | kNoIEpsilons | kILabelSorted | kNotILabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kNotTopSorted | kAccessible | + kNotAccessible | kCoAccessible | kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when an FST's weights are changed. +// This assumes that the set of states that are non-final is not changed. +const uint64 kWeightInvariantProperties = + kExpanded | kMutable | kError | kAcceptor | kNotAcceptor | kIDeterministic | + kNonIDeterministic | kODeterministic | kNonODeterministic | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | kOEpsilons | + kNoOEpsilons | kILabelSorted | kNotILabelSorted | kOLabelSorted | + kNotOLabelSorted | kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | + kTopSorted | kNotTopSorted | kAccessible | kNotAccessible | kCoAccessible | + kNotCoAccessible | kString | kNotString; + +// Properties that are preserved when a superfinal state is added +// and an FSTs final weights are directed to it via new transitions. +const uint64 kAddSuperFinalProperties = kExpanded | kMutable | kError | + kAcceptor | kNotAcceptor | kNonIDeterministic | kNonODeterministic | + kEpsilons | kIEpsilons | kOEpsilons | kNotILabelSorted | kNotOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kNotTopSorted | kNotAccessible | kCoAccessible | + kNotCoAccessible | kNotString; + +// Properties that are preserved when a superfinal state is removed +// and the epsilon transitions directed to it are made final weights. +const uint64 kRmSuperFinalProperties = kExpanded | kMutable | kError | + kAcceptor | kNotAcceptor | kIDeterministic | kODeterministic | + kNoEpsilons | kNoIEpsilons | kNoOEpsilons | kILabelSorted | kOLabelSorted | + kWeighted | kUnweighted | kCyclic | kAcyclic | kInitialCyclic | + kInitialAcyclic | kTopSorted | kAccessible | kCoAccessible | + kNotCoAccessible | kString; + +// All binary properties +const uint64 kBinaryProperties = 0x0000000000000007ULL; + +// All trinary properties +const uint64 kTrinaryProperties = 0x00003fffffff0000ULL; + +// +// COMPUTED PROPERTIES +// + +// 1st bit of trinary properties +const uint64 kPosTrinaryProperties = + kTrinaryProperties & 0x5555555555555555ULL; + +// 2nd bit of trinary properties +const uint64 kNegTrinaryProperties = + kTrinaryProperties & 0xaaaaaaaaaaaaaaaaULL; + +// All properties +const uint64 kFstProperties = kBinaryProperties | kTrinaryProperties; + +// +// PROPERTY FUNCTIONS and STRING NAMES (defined in properties.cc) +// + +// Below are functions for getting property bit vectors when executing +// mutating fst operations. +inline uint64 SetStartProperties(uint64 inprops); +template +uint64 SetFinalProperties(uint64 inprops, Weight old_weight, + Weight new_weight); +inline uint64 AddStateProperties(uint64 inprops); +template +uint64 AddArcProperties(uint64 inprops, typename A::StateId s, const A &arc, + const A *prev_arc); +inline uint64 DeleteStatesProperties(uint64 inprops); +inline uint64 DeleteAllStatesProperties(uint64 inprops, uint64 staticProps); +inline uint64 DeleteArcsProperties(uint64 inprops); + +uint64 ClosureProperties(uint64 inprops, bool star, bool delayed = false); +uint64 ComplementProperties(uint64 inprops); +uint64 ComposeProperties(uint64 inprops1, uint64 inprops2); +uint64 ConcatProperties(uint64 inprops1, uint64 inprops2, + bool delayed = false); +uint64 DeterminizeProperties(uint64 inprops, bool has_subsequential_label); +uint64 FactorWeightProperties(uint64 inprops); +uint64 InvertProperties(uint64 inprops); +uint64 ProjectProperties(uint64 inprops, bool project_input); +uint64 RandGenProperties(uint64 inprops, bool weighted); +uint64 RelabelProperties(uint64 inprops); +uint64 ReplaceProperties(const vector& inprops, + ssize_t root, + bool epsilon_on_replace, + bool no_empty_fst); +uint64 ReverseProperties(uint64 inprops); +uint64 ReweightProperties(uint64 inprops); +uint64 RmEpsilonProperties(uint64 inprops, bool delayed = false); +uint64 ShortestPathProperties(uint64 props); +uint64 SynchronizeProperties(uint64 inprops); +uint64 UnionProperties(uint64 inprops1, uint64 inprops2, bool delayed = false); + +// Definitions of inlined functions. + +uint64 SetStartProperties(uint64 inprops) { + uint64 outprops = inprops & kSetStartProperties; + if (inprops & kAcyclic) { + outprops |= kInitialAcyclic; + } + return outprops; +} + +uint64 AddStateProperties(uint64 inprops) { + return inprops & kAddStateProperties; +} + +uint64 DeleteStatesProperties(uint64 inprops) { + return inprops & kDeleteStatesProperties; +} + +uint64 DeleteAllStatesProperties(uint64 inprops, uint64 staticprops) { + uint64 outprops = inprops & kError; + return outprops | kNullProperties | staticprops; +} + +uint64 DeleteArcsProperties(uint64 inprops) { + return inprops & kDeleteArcsProperties; +} + +// Definitions of template functions. + +// +template +uint64 SetFinalProperties(uint64 inprops, Weight old_weight, + Weight new_weight) { + uint64 outprops = inprops; + if (old_weight != Weight::Zero() && old_weight != Weight::One()) { + outprops &= ~kWeighted; + } + if (new_weight != Weight::Zero() && new_weight != Weight::One()) { + outprops |= kWeighted; + outprops &= ~kUnweighted; + } + outprops &= kSetFinalProperties | kWeighted | kUnweighted; + return outprops; +} + +/// Gets the properties for the MutableFst::AddArc method. +/// +/// \param inprops the current properties of the fst +/// \param s the id of the state to which an arc is being added +/// \param arc the arc being added to the state with the specified id +/// \param prev_arc the previously-added (or "last") arc of state s, or NULL if +/// s currently has no arcs +template +uint64 AddArcProperties(uint64 inprops, typename A::StateId s, + const A &arc, const A *prev_arc) { + uint64 outprops = inprops; + if (arc.ilabel != arc.olabel) { + outprops |= kNotAcceptor; + outprops &= ~kAcceptor; + } + if (arc.ilabel == 0) { + outprops |= kIEpsilons; + outprops &= ~kNoIEpsilons; + if (arc.olabel == 0) { + outprops |= kEpsilons; + outprops &= ~kNoEpsilons; + } + } + if (arc.olabel == 0) { + outprops |= kOEpsilons; + outprops &= ~kNoOEpsilons; + } + if (prev_arc != 0) { + if (prev_arc->ilabel > arc.ilabel) { + outprops |= kNotILabelSorted; + outprops &= ~kILabelSorted; + } + if (prev_arc->olabel > arc.olabel) { + outprops |= kNotOLabelSorted; + outprops &= ~kOLabelSorted; + } + } + if (arc.weight != A::Weight::Zero() && arc.weight != A::Weight::One()) { + outprops |= kWeighted; + outprops &= ~kUnweighted; + } + if (arc.nextstate <= s) { + outprops |= kNotTopSorted; + outprops &= ~kTopSorted; + } + outprops &= kAddArcProperties | kAcceptor | + kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kTopSorted; + if (outprops & kTopSorted) { + outprops |= kAcyclic | kInitialAcyclic; + } + return outprops; +} + +extern const char *PropertyNames[]; + +} // namespace fst + +#endif // FST_LIB_PROPERTIES_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/prune.h b/extlibs/openfstwin-1.3.1/include/fst/prune.h new file mode 100755 index 00000000000..5ea5b4dd927 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/prune.h @@ -0,0 +1,339 @@ +// prune.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions implementing pruning. + +#ifndef FST_LIB_PRUNE_H__ +#define FST_LIB_PRUNE_H__ + +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +template +class PruneOptions { + public: + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + // Pruning weight threshold. + Weight weight_threshold; + // Pruning state threshold. + StateId state_threshold; + // Arc filter. + ArcFilter filter; + // If non-zero, passes in pre-computed shortest distance to final states. + const vector *distance; + // Determines the degree of convergence required when computing shortest + // distances. + float delta; + + explicit PruneOptions(const Weight& w, StateId s, ArcFilter f, + vector *d = 0, float e = kDelta) + : weight_threshold(w), + state_threshold(s), + filter(f), + distance(d), + delta(e) {} + private: + PruneOptions(); // disallow +}; + + +template +class PruneCompare { + public: + typedef S StateId; + typedef W Weight; + + PruneCompare(const vector &idistance, + const vector &fdistance) + : idistance_(idistance), fdistance_(fdistance) {} + + bool operator()(const StateId x, const StateId y) const { + Weight wx = Times(x < idistance_.size() ? idistance_[x] : Weight::Zero(), + x < fdistance_.size() ? fdistance_[x] : Weight::Zero()); + Weight wy = Times(y < idistance_.size() ? idistance_[y] : Weight::Zero(), + y < fdistance_.size() ? fdistance_[y] : Weight::Zero()); + return less_(wx, wy); + } + + private: + const vector &idistance_; + const vector &fdistance_; + NaturalLess less_; +}; + + + +// Pruning algorithm: this version modifies its input and it takes an +// options class as an argment. Delete states and arcs in 'fst' that +// do not belong to a successful path whose weight is no more than +// the weight of the shortest path Times() 'opts.weight_threshold'. +// When 'opts.state_threshold != kNoStateId', the resulting transducer +// will restricted further to have at most 'opts.state_threshold' +// states. Weights need to be commutative and have the path +// property. The weight 'w' of any cycle needs to be bounded, i.e., +// 'Plus(w, W::One()) = One()'. +template +void Prune(MutableFst *fst, + const PruneOptions &opts) { + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + if ((Weight::Properties() & (kPath | kCommutative)) + != (kPath | kCommutative)) { + FSTERROR() << "Prune: Weight needs to have the path property and" + << " be commutative: " + << Weight::Type(); + fst->SetProperties(kError, kError); + return; + } + StateId ns = fst->NumStates(); + if (ns == 0) return; + vector idistance(ns, Weight::Zero()); + vector tmp; + if (!opts.distance) { + tmp.reserve(ns); + ShortestDistance(*fst, &tmp, true, opts.delta); + } + const vector *fdistance = opts.distance ? opts.distance : &tmp; + + if ((opts.state_threshold == 0) || + (fdistance->size() <= fst->Start()) || + ((*fdistance)[fst->Start()] == Weight::Zero())) { + fst->DeleteStates(); + return; + } + PruneCompare compare(idistance, *fdistance); + Heap< StateId, PruneCompare, false> heap(compare); + vector visited(ns, false); + vector enqueued(ns, kNoKey); + vector dead; + dead.push_back(fst->AddState()); + NaturalLess less; + Weight limit = Times((*fdistance)[fst->Start()], opts.weight_threshold); + + StateId num_visited = 0; + StateId s = fst->Start(); + if (!less(limit, (*fdistance)[s])) { + idistance[s] = Weight::One(); + enqueued[s] = heap.Insert(s); + ++num_visited; + } + + while (!heap.Empty()) { + s = heap.Top(); + heap.Pop(); + enqueued[s] = kNoKey; + visited[s] = true; + if (less(limit, Times(idistance[s], fst->Final(s)))) + fst->SetFinal(s, Weight::Zero()); + for (MutableArcIterator< MutableFst > ait(fst, s); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + if (!opts.filter(arc)) continue; + Weight weight = Times(Times(idistance[s], arc.weight), + arc.nextstate < fdistance->size() + ? (*fdistance)[arc.nextstate] + : Weight::Zero()); + if (less(limit, weight)) { + arc.nextstate = dead[0]; + ait.SetValue(arc); + continue; + } + if (less(Times(idistance[s], arc.weight), idistance[arc.nextstate])) + idistance[arc.nextstate] = Times(idistance[s], arc.weight); + if (visited[arc.nextstate]) continue; + if ((opts.state_threshold != kNoStateId) && + (num_visited >= opts.state_threshold)) + continue; + if (enqueued[arc.nextstate] == kNoKey) { + enqueued[arc.nextstate] = heap.Insert(arc.nextstate); + ++num_visited; + } else { + heap.Update(enqueued[arc.nextstate], arc.nextstate); + } + } + } + for (size_t i = 0; i < visited.size(); ++i) + if (!visited[i]) dead.push_back(i); + fst->DeleteStates(dead); +} + + +// Pruning algorithm: this version modifies its input and simply takes +// the pruning threshold as an argument. Delete states and arcs in +// 'fst' that do not belong to a successful path whose weight is no +// more than the weight of the shortest path Times() +// 'weight_threshold'. When 'state_threshold != kNoStateId', the +// resulting transducer will be restricted further to have at most +// 'opts.state_threshold' states. Weights need to be commutative and +// have the path property. The weight 'w' of any cycle needs to be +// bounded, i.e., 'Plus(w, W::One()) = One()'. +template +void Prune(MutableFst *fst, + typename Arc::Weight weight_threshold, + typename Arc::StateId state_threshold = kNoStateId, + double delta = kDelta) { + PruneOptions > opts(weight_threshold, state_threshold, + AnyArcFilter(), 0, delta); + Prune(fst, opts); +} + + +// Pruning algorithm: this version writes the pruned input Fst to an +// output MutableFst and it takes an options class as an argument. +// 'ofst' contains states and arcs that belong to a successful path in +// 'ifst' whose weight is no more than the weight of the shortest path +// Times() 'opts.weight_threshold'. When 'opts.state_threshold != +// kNoStateId', 'ofst' will be restricted further to have at most +// 'opts.state_threshold' states. Weights need to be commutative and +// have the path property. The weight 'w' of any cycle needs to be +// bounded, i.e., 'Plus(w, W::One()) = One()'. +template +void Prune(const Fst &ifst, + MutableFst *ofst, + const PruneOptions &opts) { + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + if ((Weight::Properties() & (kPath | kCommutative)) + != (kPath | kCommutative)) { + FSTERROR() << "Prune: Weight needs to have the path property and" + << " be commutative: " + << Weight::Type(); + ofst->SetProperties(kError, kError); + return; + } + ofst->DeleteStates(); + ofst->SetInputSymbols(ifst.InputSymbols()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + if (ifst.Start() == kNoStateId) + return; + NaturalLess less; + if (less(opts.weight_threshold, Weight::One()) || + (opts.state_threshold == 0)) + return; + vector idistance; + vector tmp; + if (!opts.distance) + ShortestDistance(ifst, &tmp, true, opts.delta); + const vector *fdistance = opts.distance ? opts.distance : &tmp; + + if ((fdistance->size() <= ifst.Start()) || + ((*fdistance)[ifst.Start()] == Weight::Zero())) { + return; + } + PruneCompare compare(idistance, *fdistance); + Heap< StateId, PruneCompare, false> heap(compare); + vector copy; + vector enqueued; + vector visited; + + StateId s = ifst.Start(); + Weight limit = Times(s < fdistance->size() ? (*fdistance)[s] : Weight::Zero(), + opts.weight_threshold); + while (copy.size() <= s) + copy.push_back(kNoStateId); + copy[s] = ofst->AddState(); + ofst->SetStart(copy[s]); + while (idistance.size() <= s) + idistance.push_back(Weight::Zero()); + idistance[s] = Weight::One(); + while (enqueued.size() <= s) { + enqueued.push_back(kNoKey); + visited.push_back(false); + } + enqueued[s] = heap.Insert(s); + + while (!heap.Empty()) { + s = heap.Top(); + heap.Pop(); + enqueued[s] = kNoKey; + visited[s] = true; + if (!less(limit, Times(idistance[s], ifst.Final(s)))) + ofst->SetFinal(copy[s], ifst.Final(s)); + for (ArcIterator< Fst > ait(ifst, s); + !ait.Done(); + ait.Next()) { + const Arc &arc = ait.Value(); + if (!opts.filter(arc)) continue; + Weight weight = Times(Times(idistance[s], arc.weight), + arc.nextstate < fdistance->size() + ? (*fdistance)[arc.nextstate] + : Weight::Zero()); + if (less(limit, weight)) continue; + if ((opts.state_threshold != kNoStateId) && + (ofst->NumStates() >= opts.state_threshold)) + continue; + while (idistance.size() <= arc.nextstate) + idistance.push_back(Weight::Zero()); + if (less(Times(idistance[s], arc.weight), + idistance[arc.nextstate])) + idistance[arc.nextstate] = Times(idistance[s], arc.weight); + while (copy.size() <= arc.nextstate) + copy.push_back(kNoStateId); + if (copy[arc.nextstate] == kNoStateId) + copy[arc.nextstate] = ofst->AddState(); + ofst->AddArc(copy[s], Arc(arc.ilabel, arc.olabel, arc.weight, + copy[arc.nextstate])); + while (enqueued.size() <= arc.nextstate) { + enqueued.push_back(kNoKey); + visited.push_back(false); + } + if (visited[arc.nextstate]) continue; + if (enqueued[arc.nextstate] == kNoKey) + enqueued[arc.nextstate] = heap.Insert(arc.nextstate); + else + heap.Update(enqueued[arc.nextstate], arc.nextstate); + } + } +} + + +// Pruning algorithm: this version writes the pruned input Fst to an +// output MutableFst and simply takes the pruning threshold as an +// argument. 'ofst' contains states and arcs that belong to a +// successful path in 'ifst' whose weight is no more than +// the weight of the shortest path Times() 'weight_threshold'. When +// 'state_threshold != kNoStateId', 'ofst' will be restricted further +// to have at most 'opts.state_threshold' states. Weights need to be +// commutative and have the path property. The weight 'w' of any cycle +// needs to be bounded, i.e., 'Plus(w, W::One()) = W::One()'. +template +void Prune(const Fst &ifst, + MutableFst *ofst, + typename Arc::Weight weight_threshold, + typename Arc::StateId state_threshold = kNoStateId, + float delta = kDelta) { + PruneOptions > opts(weight_threshold, state_threshold, + AnyArcFilter(), 0, delta); + Prune(ifst, ofst, opts); +} + +} // namespace fst + +#endif // FST_LIB_PRUNE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/push.h b/extlibs/openfstwin-1.3.1/include/fst/push.h new file mode 100755 index 00000000000..1f7a8faa91a --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/push.h @@ -0,0 +1,175 @@ +// push.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Class to reweight/push an FST. + +#ifndef FST_LIB_PUSH_H__ +#define FST_LIB_PUSH_H__ + +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +// Private helper functions for Push +namespace internal { + +// Compute the total weight (sum of the weights of all accepting paths) from +// the output of ShortestDistance. 'distance' is the shortest distance from the +// initial state when 'reverse == false' and to the final states when +// 'reverse == true'. +template +typename Arc::Weight ComputeTotalWeight( + const Fst &fst, + const vector &distance, + bool reverse) { + if (reverse) + return fst.Start() < distance.size() ? + distance[fst.Start()] : Arc::Weight::Zero(); + + typename Arc::Weight sum = Arc::Weight::Zero(); + for (typename Arc::StateId s = 0; s < distance.size(); ++s) + sum = Plus(sum, Times(distance[s], fst.Final(s))); + return sum; +} + +// Divide the weight of every accepting path by 'w'. The weight 'w' is +// divided at the final states if 'at_final == true' and at the +// initial state otherwise. +template +void RemoveWeight(MutableFst *fst, typename Arc::Weight w, bool at_final) { + if ((w == Arc::Weight::One()) || (w == Arc::Weight::Zero())) + return; + + if (at_final) { + // Remove 'w' from the final states + for (StateIterator< MutableFst > sit(*fst); + !sit.Done(); + sit.Next()) + fst->SetFinal(sit.Value(), + Divide(fst->Final(sit.Value()), w, DIVIDE_RIGHT)); + } else { // at_final == false + // Remove 'w' from the initial state + typename Arc::StateId start = fst->Start(); + for (MutableArcIterator > ait(fst, start); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + arc.weight = Divide(arc.weight, w, DIVIDE_LEFT); + ait.SetValue(arc); + } + fst->SetFinal(start, Divide(fst->Final(start), w, DIVIDE_LEFT)); + } +} +} // namespace internal + +// Pushes the weights in FST in the direction defined by TYPE. If +// pushing towards the initial state, the sum of the weight of the +// outgoing transitions and final weight at a non-initial state is +// equal to One() in the resulting machine. If pushing towards the +// final state, the same property holds on the reverse machine. +// +// Weight needs to be left distributive when pushing towards the +// initial state and right distributive when pushing towards the final +// states. +template +void Push(MutableFst *fst, + ReweightType type, + float delta = kDelta, + bool remove_total_weight = false) { + vector distance; + ShortestDistance(*fst, &distance, type == REWEIGHT_TO_INITIAL, delta); + typename Arc::Weight total_weight = Arc::Weight::One(); + if (remove_total_weight) + total_weight = internal::ComputeTotalWeight(*fst, distance, + type == REWEIGHT_TO_INITIAL); + Reweight(fst, distance, type); + if (remove_total_weight) + internal::RemoveWeight(fst, total_weight, type == REWEIGHT_TO_FINAL); +} + +const uint32 kPushWeights = 0x0001; +const uint32 kPushLabels = 0x0002; +const uint32 kPushRemoveTotalWeight = 0x0004; +const uint32 kPushRemoveCommonAffix = 0x0008; + +// OFST obtained from IFST by pushing weights and/or labels according +// to PTYPE in the direction defined by RTYPE. Weight needs to be +// left distributive when pushing weights towards the initial state +// and right distributive when pushing weights towards the final +// states. +template +void Push(const Fst &ifst, + MutableFst *ofst, + uint32 ptype, + float delta = kDelta) { + + if ((ptype & (kPushWeights | kPushLabels)) == kPushWeights) { + *ofst = ifst; + Push(ofst, rtype, delta, ptype & kPushRemoveTotalWeight); + } else if (ptype & kPushLabels) { + const StringType stype = rtype == REWEIGHT_TO_INITIAL + ? STRING_LEFT + : STRING_RIGHT; + vector::Weight> gdistance; + VectorFst > gfst; + ArcMap(ifst, &gfst, ToGallicMapper()); + if (ptype & kPushWeights ) { + ShortestDistance(gfst, &gdistance, rtype == REWEIGHT_TO_INITIAL, delta); + } else { + ArcMapFst > + uwfst(ifst, RmWeightMapper()); + ArcMapFst, ToGallicMapper > + guwfst(uwfst, ToGallicMapper()); + ShortestDistance(guwfst, &gdistance, rtype == REWEIGHT_TO_INITIAL, delta); + } + typename GallicArc::Weight total_weight = + GallicArc::Weight::One(); + if (ptype & (kPushRemoveTotalWeight | kPushRemoveCommonAffix)) { + total_weight = internal::ComputeTotalWeight( + gfst, gdistance, rtype == REWEIGHT_TO_INITIAL); + total_weight = typename GallicArc::Weight( + ptype & kPushRemoveCommonAffix ? total_weight.Value1() + : StringWeight::One(), + ptype & kPushRemoveTotalWeight ? total_weight.Value2() + : Arc::Weight::One()); + } + Reweight(&gfst, gdistance, rtype); + if (ptype & (kPushRemoveTotalWeight | kPushRemoveCommonAffix)) + internal::RemoveWeight(&gfst, total_weight, rtype == REWEIGHT_TO_FINAL); + FactorWeightFst< GallicArc, GallicFactor > fwfst(gfst); + ArcMap(fwfst, ofst, FromGallicMapper()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + } else { + LOG(WARNING) << "Push: pushing type is set to 0: " + << "pushing neither labels nor weights."; + *ofst = ifst; + } +} + +} // namespace fst + +#endif /* FST_LIB_PUSH_H_ */ diff --git a/extlibs/openfstwin-1.3.1/include/fst/queue.h b/extlibs/openfstwin-1.3.1/include/fst/queue.h new file mode 100755 index 00000000000..707dffc0ebf --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/queue.h @@ -0,0 +1,889 @@ +// queue.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions and classes for various Fst state queues with +// a unified interface. + +#ifndef FST_LIB_QUEUE_H__ +#define FST_LIB_QUEUE_H__ + +#include +#include +using std::vector; + +#include +#include +#include +#include + + +namespace fst { + +// template +// class Queue { +// public: +// typedef typename S StateId; +// +// // Ctr: may need args (e.g., Fst, comparator) for some queues +// Queue(...); +// // Returns the head of the queue +// StateId Head() const; +// // Inserts a state +// void Enqueue(StateId s); +// // Removes the head of the queue +// void Dequeue(); +// // Updates ordering of state s when weight changes, if necessary +// void Update(StateId s); +// // Does the queue contain no elements? +// bool Empty() const; +// // Remove all states from queue +// void Clear(); +// }; + +// State queue types. +enum QueueType { + TRIVIAL_QUEUE = 0, // Single state queue + FIFO_QUEUE = 1, // First-in, first-out queue + LIFO_QUEUE = 2, // Last-in, first-out queue + SHORTEST_FIRST_QUEUE = 3, // Shortest-first queue + TOP_ORDER_QUEUE = 4, // Topologically-ordered queue + STATE_ORDER_QUEUE = 5, // State-ID ordered queue + SCC_QUEUE = 6, // Component graph top-ordered meta-queue + AUTO_QUEUE = 7, // Auto-selected queue + OTHER_QUEUE = 8 + }; + + +// QueueBase, templated on the StateId, is the base class shared by the +// queues considered by AutoQueue. +template +class QueueBase { + public: + typedef S StateId; + + QueueBase(QueueType type) : queue_type_(type), error_(false) {} + virtual ~QueueBase() {} + StateId Head() const { return Head_(); } + void Enqueue(StateId s) { Enqueue_(s); } + void Dequeue() { Dequeue_(); } + void Update(StateId s) { Update_(s); } + bool Empty() const { return Empty_(); } + void Clear() { Clear_(); } + QueueType Type() { return queue_type_; } + bool Error() const { return error_; } + void SetError(bool error) { error_ = error; } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const = 0; + virtual void Enqueue_(StateId s) = 0; + virtual void Dequeue_() = 0; + virtual void Update_(StateId s) = 0; + virtual bool Empty_() const = 0; + virtual void Clear_() = 0; + + QueueType queue_type_; + bool error_; +}; + + +// Trivial queue discipline, templated on the StateId. You may enqueue +// at most one state at a time. It is used for strongly connected components +// with only one state and no self loops. +template +class TrivialQueue : public QueueBase { +public: + typedef S StateId; + + TrivialQueue() : QueueBase(TRIVIAL_QUEUE), front_(kNoStateId) {} + StateId Head() const { return front_; } + void Enqueue(StateId s) { front_ = s; } + void Dequeue() { front_ = kNoStateId; } + void Update(StateId s) {} + bool Empty() const { return front_ == kNoStateId; } + void Clear() { front_ = kNoStateId; } + + +private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } + + StateId front_; +}; + + +// First-in, first-out queue discipline, templated on the StateId. +template +class FifoQueue : public QueueBase, public deque { + public: + using deque::back; + using deque::push_front; + using deque::pop_back; + using deque::empty; + using deque::clear; + + typedef S StateId; + + FifoQueue() : QueueBase(FIFO_QUEUE) {} + StateId Head() const { return back(); } + void Enqueue(StateId s) { push_front(s); } + void Dequeue() { pop_back(); } + void Update(StateId s) {} + bool Empty() const { return empty(); } + void Clear() { clear(); } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } +}; + + +// Last-in, first-out queue discipline, templated on the StateId. +template +class LifoQueue : public QueueBase, public deque { + public: + using deque::front; + using deque::push_front; + using deque::pop_front; + using deque::empty; + using deque::clear; + + typedef S StateId; + + LifoQueue() : QueueBase(LIFO_QUEUE) {} + StateId Head() const { return front(); } + void Enqueue(StateId s) { push_front(s); } + void Dequeue() { pop_front(); } + void Update(StateId s) {} + bool Empty() const { return empty(); } + void Clear() { clear(); } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } +}; + + +// Shortest-first queue discipline, templated on the StateId and +// comparison function object. Comparison function object COMP is +// used to compare two StateIds. If a (single) state's order changes, +// it can be reordered in the queue with a call to Update(). +// If 'update == false', call to Update() does not reorder the queue. +template +class ShortestFirstQueue : public QueueBase { + public: + typedef S StateId; + typedef C Compare; + + ShortestFirstQueue(C comp) + : QueueBase(SHORTEST_FIRST_QUEUE), heap_(comp) {} + + StateId Head() const { return heap_.Top(); } + + void Enqueue(StateId s) { + if (update) { + for (StateId i = key_.size(); i <= s; ++i) + key_.push_back(kNoKey); + key_[s] = heap_.Insert(s); + } else { + heap_.Insert(s); + } + } + + void Dequeue() { + if (update) + key_[heap_.Pop()] = kNoKey; + else + heap_.Pop(); + } + + void Update(StateId s) { + if (!update) + return; + if (s >= key_.size() || key_[s] == kNoKey) { + Enqueue(s); + } else { + heap_.Update(key_[s], s); + } + } + + bool Empty() const { return heap_.Empty(); } + + void Clear() { + heap_.Clear(); + if (update) key_.clear(); + } + + private: + Heap heap_; + vector key_; + + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } +}; + + +// Given a vector that maps from states to weights and a Less +// comparison function object between weights, this class defines a +// comparison function object between states. +template +class StateWeightCompare { + public: + typedef L Less; + typedef typename L::Weight Weight; + typedef S StateId; + + StateWeightCompare(const vector& weights, const L &less) + : weights_(weights), less_(less) {} + + bool operator()(const S x, const S y) const { + return less_(weights_[x], weights_[y]); + } + + private: + const vector& weights_; + L less_; +}; + + +// Shortest-first queue discipline, templated on the StateId and Weight, is +// specialized to use the weight's natural order for the comparison function. +template +class NaturalShortestFirstQueue : + public ShortestFirstQueue > > { + public: + typedef StateWeightCompare > C; + + NaturalShortestFirstQueue(const vector &distance) : + ShortestFirstQueue(C(distance, less_)) {} + + private: + NaturalLess less_; +}; + +// Topological-order queue discipline, templated on the StateId. +// States are ordered in the queue topologically. The FST must be acyclic. +template +class TopOrderQueue : public QueueBase { + public: + typedef S StateId; + + // This constructor computes the top. order. It accepts an arc filter + // to limit the transitions considered in that computation (e.g., only + // the epsilon graph). + template + TopOrderQueue(const Fst &fst, ArcFilter filter) + : QueueBase(TOP_ORDER_QUEUE), front_(0), back_(kNoStateId), + order_(0), state_(0) { + bool acyclic; + TopOrderVisitor top_order_visitor(&order_, &acyclic); + DfsVisit(fst, &top_order_visitor, filter); + if (!acyclic) { + FSTERROR() << "TopOrderQueue: fst is not acyclic."; + QueueBase::SetError(true); + } + state_.resize(order_.size(), kNoStateId); + } + + // This constructor is passed the top. order, useful when we know it + // beforehand. + TopOrderQueue(const vector &order) + : QueueBase(TOP_ORDER_QUEUE), front_(0), back_(kNoStateId), + order_(order), state_(order.size(), kNoStateId) {} + + StateId Head() const { return state_[front_]; } + + void Enqueue(StateId s) { + if (front_ > back_) front_ = back_ = order_[s]; + else if (order_[s] > back_) back_ = order_[s]; + else if (order_[s] < front_) front_ = order_[s]; + state_[order_[s]] = s; + } + + void Dequeue() { + state_[front_] = kNoStateId; + while ((front_ <= back_) && (state_[front_] == kNoStateId)) ++front_; + } + + void Update(StateId s) {} + + bool Empty() const { return front_ > back_; } + + void Clear() { + for (StateId i = front_; i <= back_; ++i) state_[i] = kNoStateId; + back_ = kNoStateId; + front_ = 0; + } + + private: + StateId front_; + StateId back_; + vector order_; + vector state_; + + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } +}; + + +// State order queue discipline, templated on the StateId. +// States are ordered in the queue by state Id. +template +class StateOrderQueue : public QueueBase { +public: + typedef S StateId; + + StateOrderQueue() + : QueueBase(STATE_ORDER_QUEUE), front_(0), back_(kNoStateId) {} + + StateId Head() const { return front_; } + + void Enqueue(StateId s) { + if (front_ > back_) front_ = back_ = s; + else if (s > back_) back_ = s; + else if (s < front_) front_ = s; + while (enqueued_.size() <= s) enqueued_.push_back(false); + enqueued_[s] = true; + } + + void Dequeue() { + enqueued_[front_] = false; + while ((front_ <= back_) && (enqueued_[front_] == false)) ++front_; + } + + void Update(StateId s) {} + + bool Empty() const { return front_ > back_; } + + void Clear() { + for (StateId i = front_; i <= back_; ++i) enqueued_[i] = false; + front_ = 0; + back_ = kNoStateId; + } + +private: + StateId front_; + StateId back_; + vector enqueued_; + + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } + +}; + + +// SCC topological-order meta-queue discipline, templated on the StateId S +// and a queue Q, which is used inside each SCC. It visits the SCC's +// of an FST in topological order. Its constructor is passed the queues to +// to use within an SCC. +template +class SccQueue : public QueueBase { + public: + typedef S StateId; + typedef Q Queue; + + // Constructor takes a vector specifying the SCC number per state + // and a vector giving the queue to use per SCC number. + SccQueue(const vector &scc, vector *queue) + : QueueBase(SCC_QUEUE), queue_(queue), scc_(scc), front_(0), + back_(kNoStateId) {} + + StateId Head() const { + while ((front_ <= back_) && + (((*queue_)[front_] && (*queue_)[front_]->Empty()) + || (((*queue_)[front_] == 0) && + ((front_ > trivial_queue_.size()) + || (trivial_queue_[front_] == kNoStateId))))) + ++front_; + if ((*queue_)[front_]) + return (*queue_)[front_]->Head(); + else + return trivial_queue_[front_]; + } + + void Enqueue(StateId s) { + if (front_ > back_) front_ = back_ = scc_[s]; + else if (scc_[s] > back_) back_ = scc_[s]; + else if (scc_[s] < front_) front_ = scc_[s]; + if ((*queue_)[scc_[s]]) { + (*queue_)[scc_[s]]->Enqueue(s); + } else { + while (trivial_queue_.size() <= scc_[s]) + trivial_queue_.push_back(kNoStateId); + trivial_queue_[scc_[s]] = s; + } + } + + void Dequeue() { + if ((*queue_)[front_]) + (*queue_)[front_]->Dequeue(); + else if (front_ < trivial_queue_.size()) + trivial_queue_[front_] = kNoStateId; + } + + void Update(StateId s) { + if ((*queue_)[scc_[s]]) + (*queue_)[scc_[s]]->Update(s); + } + + bool Empty() const { + if (front_ < back_) // Queue scc # back_ not empty unless back_==front_ + return false; + else if (front_ > back_) + return true; + else if ((*queue_)[front_]) + return (*queue_)[front_]->Empty(); + else + return (front_ > trivial_queue_.size()) + || (trivial_queue_[front_] == kNoStateId); + } + + void Clear() { + for (StateId i = front_; i <= back_; ++i) + if ((*queue_)[i]) + (*queue_)[i]->Clear(); + else if (i < trivial_queue_.size()) + trivial_queue_[i] = kNoStateId; + front_ = 0; + back_ = kNoStateId; + } + +private: + vector *queue_; + const vector &scc_; + mutable StateId front_; + StateId back_; + vector trivial_queue_; + + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } + + DISALLOW_COPY_AND_ASSIGN(SccQueue); +}; + + +// Automatic queue discipline, templated on the StateId. It selects a +// queue discipline for a given FST based on its properties. +template +class AutoQueue : public QueueBase { +public: + typedef S StateId; + + // This constructor takes a state distance vector that, if non-null and if + // the Weight type has the path property, will entertain the + // shortest-first queue using the natural order w.r.t to the distance. + template + AutoQueue(const Fst &fst, const vector *distance, + ArcFilter filter) : QueueBase(AUTO_QUEUE) { + typedef typename Arc::Weight Weight; + typedef StateWeightCompare< StateId, NaturalLess > Compare; + + // First check if the FST is known to have these properties. + uint64 props = fst.Properties(kAcyclic | kCyclic | + kTopSorted | kUnweighted, false); + if ((props & kTopSorted) || fst.Start() == kNoStateId) { + queue_ = new StateOrderQueue(); + VLOG(2) << "AutoQueue: using state-order discipline"; + } else if (props & kAcyclic) { + queue_ = new TopOrderQueue(fst, filter); + VLOG(2) << "AutoQueue: using top-order discipline"; + } else if ((props & kUnweighted) && (Weight::Properties() & kIdempotent)) { + queue_ = new LifoQueue(); + VLOG(2) << "AutoQueue: using LIFO discipline"; + } else { + uint64 properties; + // Decompose into strongly-connected components. + SccVisitor scc_visitor(&scc_, 0, 0, &properties); + DfsVisit(fst, &scc_visitor, filter); + StateId nscc = *max_element(scc_.begin(), scc_.end()) + 1; + vector queue_types(nscc); + NaturalLess *less = 0; + Compare *comp = 0; + if (distance && (Weight::Properties() & kPath)) { + less = new NaturalLess; + comp = new Compare(*distance, *less); + } + // Find the queue type to use per SCC. + bool unweighted; + bool all_trivial; + SccQueueType(fst, scc_, &queue_types, filter, less, &all_trivial, + &unweighted); + // If unweighted and semiring is idempotent, use lifo queue. + if (unweighted) { + queue_ = new LifoQueue(); + VLOG(2) << "AutoQueue: using LIFO discipline"; + delete comp; + delete less; + return; + } + // If all the scc are trivial, FST is acyclic and the scc# gives + // the topological order. + if (all_trivial) { + queue_ = new TopOrderQueue(scc_); + VLOG(2) << "AutoQueue: using top-order discipline"; + delete comp; + delete less; + return; + } + VLOG(2) << "AutoQueue: using SCC meta-discipline"; + queues_.resize(nscc); + for (StateId i = 0; i < nscc; ++i) { + switch(queue_types[i]) { + case TRIVIAL_QUEUE: + queues_[i] = 0; + VLOG(3) << "AutoQueue: SCC #" << i + << ": using trivial discipline"; + break; + case SHORTEST_FIRST_QUEUE: + queues_[i] = new ShortestFirstQueue(*comp); + VLOG(3) << "AutoQueue: SCC #" << i << + ": using shortest-first discipline"; + break; + case LIFO_QUEUE: + queues_[i] = new LifoQueue(); + VLOG(3) << "AutoQueue: SCC #" << i + << ": using LIFO disciplle"; + break; + case FIFO_QUEUE: + default: + queues_[i] = new FifoQueue(); + VLOG(3) << "AutoQueue: SCC #" << i + << ": using FIFO disciplle"; + break; + } + } + queue_ = new SccQueue< StateId, QueueBase >(scc_, &queues_); + delete comp; + delete less; + } + } + + ~AutoQueue() { + for (StateId i = 0; i < queues_.size(); ++i) + delete queues_[i]; + delete queue_; + } + + StateId Head() const { return queue_->Head(); } + + void Enqueue(StateId s) { queue_->Enqueue(s); } + + void Dequeue() { queue_->Dequeue(); } + + void Update(StateId s) { queue_->Update(s); } + + bool Empty() const { return queue_->Empty(); } + + void Clear() { queue_->Clear(); } + + + private: + QueueBase *queue_; + vector< QueueBase* > queues_; + vector scc_; + + template + static void SccQueueType(const Fst &fst, + const vector &scc, + vector *queue_types, + ArcFilter filter, Less *less, + bool *all_trivial, bool *unweighted); + + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + + virtual void Enqueue_(StateId s) { Enqueue(s); } + + virtual void Dequeue_() { Dequeue(); } + + virtual void Update_(StateId s) { Update(s); } + + virtual bool Empty_() const { return Empty(); } + + virtual void Clear_() { return Clear(); } + + DISALLOW_COPY_AND_ASSIGN(AutoQueue); +}; + + +// Examines the states in an Fst's strongly connected components and +// determines which type of queue to use per SCC. Stores result in +// vector QUEUE_TYPES, which is assumed to have length equal to the +// number of SCCs. An arc filter is used to limit the transitions +// considered (e.g., only the epsilon graph). ALL_TRIVIAL is set +// to true if every queue is the trivial queue. UNWEIGHTED is set to +// true if the semiring is idempotent and all the arc weights are equal to +// Zero() or One(). +template +template +void AutoQueue::SccQueueType(const Fst &fst, + const vector &scc, + vector *queue_type, + ArcFilter filter, Less *less, + bool *all_trivial, bool *unweighted) { + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + *all_trivial = true; + *unweighted = true; + + for (StateId i = 0; i < queue_type->size(); ++i) + (*queue_type)[i] = TRIVIAL_QUEUE; + + for (StateIterator< Fst > sit(fst); !sit.Done(); sit.Next()) { + StateId state = sit.Value(); + for (ArcIterator< Fst > ait(fst, state); + !ait.Done(); + ait.Next()) { + const Arc &arc = ait.Value(); + if (!filter(arc)) continue; + if (scc[state] == scc[arc.nextstate]) { + QueueType &type = (*queue_type)[scc[state]]; + if (!less || ((*less)(arc.weight, Weight::One()))) + type = FIFO_QUEUE; + else if ((type == TRIVIAL_QUEUE) || (type == LIFO_QUEUE)) { + if (!(Weight::Properties() & kIdempotent) || + (arc.weight != Weight::Zero() && arc.weight != Weight::One())) + type = SHORTEST_FIRST_QUEUE; + else + type = LIFO_QUEUE; + } + if (type != TRIVIAL_QUEUE) *all_trivial = false; + } + if (!(Weight::Properties() & kIdempotent) || + (arc.weight != Weight::Zero() && arc.weight != Weight::One())) + *unweighted = false; + } + } +} + + +// An A* estimate is a function object that maps from a state ID to a +// an estimate of the shortest distance to the final states. +// The trivial A* estimate is always One(). +template +struct TrivialAStarEstimate { + W operator()(S s) const { return W::One(); } +}; + + +// Given a vector that maps from states to weights representing the +// shortest distance from the initial state, a Less comparison +// function object between weights, and an estimate E of the +// shortest distance to the final states, this class defines a +// comparison function object between states. +template +class AStarWeightCompare { + public: + typedef L Less; + typedef typename L::Weight Weight; + typedef S StateId; + + AStarWeightCompare(const vector& weights, const L &less, + const E &estimate) + : weights_(weights), less_(less), estimate_(estimate) {} + + bool operator()(const S x, const S y) const { + Weight wx = Times(weights_[x], estimate_(x)); + Weight wy = Times(weights_[y], estimate_(y)); + return less_(wx, wy); + } + + private: + const vector& weights_; + L less_; + const E &estimate_; +}; + + +// A* queue discipline, templated on the StateId, Weight and an +// estimate E of the shortest distance to the final states, is specialized +// to use the weight's natural order for the comparison function. +template +class NaturalAStarQueue : + public ShortestFirstQueue, E> > { + public: + typedef AStarWeightCompare, E> C; + + NaturalAStarQueue(const vector &distance, const E &estimate) : + ShortestFirstQueue(C(distance, less_, estimate)) {} + + private: + NaturalLess less_; +}; + + +// A state equivalence class is a function object that +// maps from a state ID to an equivalence class (state) ID. +// The trivial equivalence class maps a state to itself. +template +struct TrivialStateEquivClass { + S operator()(S s) const { return s; } +}; + + +// Pruning queue discipline: Enqueues a state 's' only when its +// shortest distance (so far), as specified by 'distance', is less +// than (as specified by 'comp') the shortest distance Times() the +// 'threshold' to any state in the same equivalence class, as +// specified by the function object 'class_func'. The underlying +// queue discipline is specified by 'queue'. The ownership of 'queue' +// is given to this class. +template +class PruneQueue : public QueueBase { + public: + typedef typename Q::StateId StateId; + typedef typename L::Weight Weight; + + PruneQueue(const vector &distance, Q *queue, L comp, + const C &class_func, Weight threshold) + : QueueBase(OTHER_QUEUE), + distance_(distance), + queue_(queue), + less_(comp), + class_func_(class_func), + threshold_(threshold) {} + + ~PruneQueue() { delete queue_; } + + StateId Head() const { return queue_->Head(); } + + void Enqueue(StateId s) { + StateId c = class_func_(s); + if (c >= class_distance_.size()) + class_distance_.resize(c + 1, Weight::Zero()); + if (less_(distance_[s], class_distance_[c])) + class_distance_[c] = distance_[s]; + + // Enqueue only if below threshold limit + Weight limit = Times(class_distance_[c], threshold_); + if (less_(distance_[s], limit)) + queue_->Enqueue(s); + } + + void Dequeue() { queue_->Dequeue(); } + + void Update(StateId s) { + StateId c = class_func_(s); + if (less_(distance_[s], class_distance_[c])) + class_distance_[c] = distance_[s]; + queue_->Update(s); + } + + bool Empty() const { return queue_->Empty(); } + void Clear() { queue_->Clear(); } + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual StateId Head_() const { return Head(); } + virtual void Enqueue_(StateId s) { Enqueue(s); } + virtual void Dequeue_() { Dequeue(); } + virtual void Update_(StateId s) { Update(s); } + virtual bool Empty_() const { return Empty(); } + virtual void Clear_() { return Clear(); } + + const vector &distance_; // shortest distance to state + Q *queue_; + L less_; + const C &class_func_; // eqv. class function object + Weight threshold_; // pruning weight threshold + vector class_distance_; // shortest distance to class + + DISALLOW_COPY_AND_ASSIGN(PruneQueue); +}; + + +// Pruning queue discipline (see above) using the weight's natural +// order for the comparison function. The ownership of 'queue' is +// given to this class. +template +class NaturalPruneQueue : + public PruneQueue, C> { + public: + typedef typename Q::StateId StateId; + typedef W Weight; + + NaturalPruneQueue(const vector &distance, Q *queue, + const C &class_func_, Weight threshold) : + PruneQueue, C>(distance, queue, less_, + class_func_, threshold) {} + + private: + NaturalLess less_; +}; + + +} // namespace fst + +#endif diff --git a/extlibs/openfstwin-1.3.1/include/fst/randequivalent.h b/extlibs/openfstwin-1.3.1/include/fst/randequivalent.h new file mode 100755 index 00000000000..1aaccf7dff3 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/randequivalent.h @@ -0,0 +1,135 @@ +// randequivalent.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Tests if two FSTS are equivalent by checking if random +// strings from one FST are transduced the same by both FSTs. + +#ifndef FST_RANDEQUIVALENT_H__ +#define FST_RANDEQUIVALENT_H__ + +#include +#include +#include +#include +#include +#include + + +namespace fst { + +// Test if two FSTs are equivalent by randomly generating 'num_paths' +// paths (as specified by the RandGenOptions 'opts') in these FSTs. +// +// For each randomly generated path, the algorithm computes for each +// of the two FSTs the sum of the weights of all the successful paths +// sharing the same input and output labels as the considered randomly +// generated path and checks that these two values are within +// 'delta'. Returns optional error value (when FLAGS_error_fatal = false). +template +bool RandEquivalent(const Fst &fst1, const Fst &fst2, + ssize_t num_paths, float delta, + const RandGenOptions &opts, + bool *error = 0) { + typedef typename Arc::Weight Weight; + if (error) *error = false; + + // Check that the symbol table are compatible + if (!CompatSymbols(fst1.InputSymbols(), fst2.InputSymbols()) || + !CompatSymbols(fst1.OutputSymbols(), fst2.OutputSymbols())) { + FSTERROR() << "RandEquivalent: input/output symbol tables of 1st " + << "argument do not match input/output symbol tables of 2nd " + << "argument"; + if (error) *error = true; + return false; + } + + ILabelCompare icomp; + OLabelCompare ocomp; + VectorFst sfst1(fst1); + VectorFst sfst2(fst2); + Connect(&sfst1); + Connect(&sfst2); + ArcSort(&sfst1, icomp); + ArcSort(&sfst2, icomp); + + bool ret = true; + for (ssize_t n = 0; n < num_paths; ++n) { + VectorFst path; + const Fst &fst = rand() % 2 ? sfst1 : sfst2; + RandGen(fst, &path, opts); + + VectorFst ipath(path); + VectorFst opath(path); + Project(&ipath, PROJECT_INPUT); + Project(&opath, PROJECT_OUTPUT); + + VectorFst cfst1, pfst1; + Compose(ipath, sfst1, &cfst1); + ArcSort(&cfst1, ocomp); + Compose(cfst1, opath, &pfst1); + // Give up if there are epsilon cycles in a non-idempotent semiring + if (!(Weight::Properties() & kIdempotent) && + pfst1.Properties(kCyclic, true)) + continue; + Weight sum1 = ShortestDistance(pfst1); + + VectorFst cfst2, pfst2; + Compose(ipath, sfst2, &cfst2); + ArcSort(&cfst2, ocomp); + Compose(cfst2, opath, &pfst2); + // Give up if there are epsilon cycles in a non-idempotent semiring + if (!(Weight::Properties() & kIdempotent) && + pfst2.Properties(kCyclic, true)) + continue; + Weight sum2 = ShortestDistance(pfst2); + + if (!ApproxEqual(sum1, sum2, delta)) { + VLOG(1) << "Sum1 = " << sum1; + VLOG(1) << "Sum2 = " << sum2; + ret = false; + break; + } + } + + if (fst1.Properties(kError, false) || fst2.Properties(kError, false)) { + if (error) *error = true; + return false; + } + + return ret; +} + + +// Test if two FSTs are equivalent by randomly generating 'num_paths' paths +// of length no more than 'path_length' using the seed 'seed' in these FSTs. +// Returns optional error value (when FLAGS_error_fatal = false). +template +bool RandEquivalent(const Fst &fst1, const Fst &fst2, + ssize_t num_paths, float delta = kDelta, + int seed = time(0), int path_length = INT_MAX, + bool *error = 0) { + UniformArcSelector uniform_selector(seed); + RandGenOptions< UniformArcSelector > + opts(uniform_selector, path_length); + return RandEquivalent(fst1, fst2, num_paths, delta, opts, error); +} + + +} // namespace fst + +#endif // FST_LIB_RANDEQUIVALENT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/randgen.h b/extlibs/openfstwin-1.3.1/include/fst/randgen.h new file mode 100755 index 00000000000..82ddffa7d06 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/randgen.h @@ -0,0 +1,712 @@ +// randgen.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes and functions to generate random paths through an FST. + +#ifndef FST_LIB_RANDGEN_H__ +#define FST_LIB_RANDGEN_H__ + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace fst { + +// +// ARC SELECTORS - these function objects are used to select a random +// transition to take from an FST's state. They should return a number +// N s.t. 0 <= N <= NumArcs(). If N < NumArcs(), then the N-th +// transition is selected. If N == NumArcs(), then the final weight at +// that state is selected (i.e., the 'super-final' transition is selected). +// It can be assumed these will not be called unless either there +// are transitions leaving the state and/or the state is final. +// + +// Randomly selects a transition using the uniform distribution. +template +struct UniformArcSelector { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + UniformArcSelector(int seed = time(0)) { srand(seed); } + + size_t operator()(const Fst &fst, StateId s) const { + double r = rand()/(RAND_MAX + 1.0); + size_t n = fst.NumArcs(s); + if (fst.Final(s) != Weight::Zero()) + ++n; + return static_cast(r * n); + } +}; + + +// Randomly selects a transition w.r.t. the weights treated as negative +// log probabilities after normalizing for the total weight leaving +// the state. Weight::zero transitions are disregarded. +// Assumes Weight::Value() accesses the floating point +// representation of the weight. +template +class LogProbArcSelector { + public: + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + LogProbArcSelector(int seed = time(0)) { srand(seed); } + + size_t operator()(const Fst &fst, StateId s) const { + // Find total weight leaving state + double sum = 0.0; + for (ArcIterator< Fst > aiter(fst, s); !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + sum += exp(-to_log_weight_(arc.weight).Value()); + } + sum += exp(-to_log_weight_(fst.Final(s)).Value()); + + double r = rand()/(RAND_MAX + 1.0); + double p = 0.0; + int n = 0; + for (ArcIterator< Fst > aiter(fst, s); !aiter.Done(); + aiter.Next(), ++n) { + const A &arc = aiter.Value(); + p += exp(-to_log_weight_(arc.weight).Value()); + if (p > r * sum) return n; + } + return n; + } + + private: + WeightConvert to_log_weight_; +}; + +// Convenience definitions +typedef LogProbArcSelector StdArcSelector; +typedef LogProbArcSelector LogArcSelector; + + +// Same as LogProbArcSelector but use CacheLogAccumulator to cache +// the cummulative weight computations. +template +class FastLogProbArcSelector : public LogProbArcSelector { + public: + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + using LogProbArcSelector::operator(); + + FastLogProbArcSelector(int seed = time(0)) + : LogProbArcSelector(seed), + seed_(seed) {} + + size_t operator()(const Fst &fst, StateId s, + CacheLogAccumulator *accumulator) const { + accumulator->SetState(s); + ArcIterator< Fst > aiter(fst, s); + // Find total weight leaving state + double sum = to_log_weight_(accumulator->Sum(fst.Final(s), &aiter, 0, + fst.NumArcs(s))).Value(); + double r = -log(rand()/(RAND_MAX + 1.0)); + return accumulator->LowerBound(r + sum, &aiter); + } + + int Seed() const { return seed_; } + private: + int seed_; + WeightConvert to_log_weight_; +}; + +// Random path state info maintained by RandGenFst and passed to samplers. +template +struct RandState { + typedef typename A::StateId StateId; + + StateId state_id; // current input FST state + size_t nsamples; // # of samples to be sampled at this state + size_t length; // length of path to this random state + size_t select; // previous sample arc selection + const RandState *parent; // previous random state on this path + + RandState(StateId s, size_t n, size_t l, size_t k, const RandState *p) + : state_id(s), nsamples(n), length(l), select(k), parent(p) {} + + RandState() + : state_id(kNoStateId), nsamples(0), length(0), select(0), parent(0) {} +}; + +// This class, given an arc selector, samples, with raplacement, +// multiple random transitions from an FST's state. This is a generic +// version with a straight-forward use of the arc selector. +// Specializations may be defined for arc selectors for greater +// efficiency or special behavior. +template +class ArcSampler { + public: + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + // The 'max_length' may be interpreted (including ignored) by a + // sampler as it chooses. This generic version interprets this literally. + ArcSampler(const Fst &fst, const S &arc_selector, + int max_length = INT_MAX) + : fst_(fst), + arc_selector_(arc_selector), + max_length_(max_length) {} + + // Allow updating Fst argument; pass only if changed. + ArcSampler(const ArcSampler &sampler, const Fst *fst = 0) + : fst_(fst ? *fst : sampler.fst_), + arc_selector_(sampler.arc_selector_), + max_length_(sampler.max_length_) { + Reset(); + } + + // Samples 'rstate.nsamples' from state 'state_id'. The 'rstate.length' is + // the length of the path to 'rstate'. Returns true if samples were + // collected. No samples may be collected if either there are no (including + // 'super-final') transitions leaving that state or if the + // 'max_length' has been deemed reached. Use the iterator members to + // read the samples. The samples will be in their original order. + bool Sample(const RandState &rstate) { + sample_map_.clear(); + if ((fst_.NumArcs(rstate.state_id) == 0 && + fst_.Final(rstate.state_id) == Weight::Zero()) || + rstate.length == max_length_) { + Reset(); + return false; + } + + for (size_t i = 0; i < rstate.nsamples; ++i) + ++sample_map_[arc_selector_(fst_, rstate.state_id)]; + Reset(); + return true; + } + + // More samples? + bool Done() const { return sample_iter_ == sample_map_.end(); } + + // Gets the next sample. + void Next() { ++sample_iter_; } + + // Returns a pair (N, K) where 0 <= N <= NumArcs(s) and 0 < K <= nsamples. + // If N < NumArcs(s), then the N-th transition is specified. + // If N == NumArcs(s), then the final weight at that state is + // specified (i.e., the 'super-final' transition is specified). + // For the specified transition, K repetitions have been sampled. + pair Value() const { return *sample_iter_; } + + void Reset() { sample_iter_ = sample_map_.begin(); } + + bool Error() const { return false; } + + private: + const Fst &fst_; + const S &arc_selector_; + int max_length_; + + // Stores (N, K) as described for Value(). + map sample_map_; + map::const_iterator sample_iter_; + + // disallow + ArcSampler & operator=(const ArcSampler &s); +}; + + +// Specialization for FastLogProbArcSelector. +template +class ArcSampler > { + public: + typedef FastLogProbArcSelector S; + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + typedef CacheLogAccumulator C; + + ArcSampler(const Fst &fst, const S &arc_selector, int max_length = INT_MAX) + : fst_(fst), + arc_selector_(arc_selector), + max_length_(max_length), + accumulator_(new C()) { + accumulator_->Init(fst); + } + + ArcSampler(const ArcSampler &sampler, const Fst *fst = 0) + : fst_(fst ? *fst : sampler.fst_), + arc_selector_(sampler.arc_selector_), + max_length_(sampler.max_length_) { + if (fst) { + accumulator_ = new C(); + accumulator_->Init(*fst); + } else { // shallow copy + accumulator_ = new C(*sampler.accumulator_); + } + } + + ~ArcSampler() { + delete accumulator_; + } + + bool Sample(const RandState &rstate) { + sample_map_.clear(); + if ((fst_.NumArcs(rstate.state_id) == 0 && + fst_.Final(rstate.state_id) == Weight::Zero()) || + rstate.length == max_length_) { + Reset(); + return false; + } + + for (size_t i = 0; i < rstate.nsamples; ++i) + ++sample_map_[arc_selector_(fst_, rstate.state_id, accumulator_)]; + Reset(); + return true; + } + + bool Done() const { return sample_iter_ == sample_map_.end(); } + void Next() { ++sample_iter_; } + pair Value() const { return *sample_iter_; } + void Reset() { sample_iter_ = sample_map_.begin(); } + + bool Error() const { return accumulator_->Error(); } + + private: + const Fst &fst_; + const S &arc_selector_; + int max_length_; + + // Stores (N, K) as described for Value(). + map sample_map_; + map::const_iterator sample_iter_; + C *accumulator_; + + // disallow + ArcSampler & operator=(const ArcSampler &s); +}; + + +// Options for random path generation with RandGenFst. The template argument +// is an arc sampler, typically class 'ArcSampler' above. Ownership of +// the sampler is taken by RandGenFst. +template +struct RandGenFstOptions : public CacheOptions { + S *arc_sampler; // How to sample transitions at a state + size_t npath; // # of paths to generate + bool weighted; // Output tree weighted by path count; o.w. + // output unweighted DAG + bool remove_total_weight; // Remove total weight when output is weighted. + + RandGenFstOptions(const CacheOptions &copts, S *samp, + size_t n = 1, bool w = true, bool rw = false) + : CacheOptions(copts), + arc_sampler(samp), + npath(n), + weighted(w), + remove_total_weight(rw) {} +}; + + +// Implementation of RandGenFst. +template +class RandGenFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::AddArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef B Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + RandGenFstImpl(const Fst &fst, const RandGenFstOptions &opts) + : CacheImpl(opts), + fst_(fst.Copy()), + arc_sampler_(opts.arc_sampler), + npath_(opts.npath), + weighted_(opts.weighted), + remove_total_weight_(opts.remove_total_weight), + superfinal_(kNoLabel) { + SetType("randgen"); + + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(RandGenProperties(props, weighted_), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + RandGenFstImpl(const RandGenFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + arc_sampler_(new S(*impl.arc_sampler_, fst_)), + npath_(impl.npath_), + weighted_(impl.weighted_), + superfinal_(kNoLabel) { + SetType("randgen"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~RandGenFstImpl() { + for (int i = 0; i < state_table_.size(); ++i) + delete state_table_[i]; + delete fst_; + delete arc_sampler_; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + StateId start = state_table_.size(); + SetStart(start); + RandState *rstate = new RandState(s, npath_, 0, 0, 0); + state_table_.push_back(rstate); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Expand(s); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && + (fst_->Properties(kError, false) || arc_sampler_->Error())) { + SetProperties(kError, kError); + } + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void Expand(StateId s) { + if (s == superfinal_) { + SetFinal(s, Weight::One()); + SetArcs(s); + return; + } + + SetFinal(s, Weight::Zero()); + const RandState &rstate = *state_table_[s]; + arc_sampler_->Sample(rstate); + ArcIterator< Fst > aiter(*fst_, rstate.state_id); + size_t narcs = fst_->NumArcs(rstate.state_id); + for (;!arc_sampler_->Done(); arc_sampler_->Next()) { + const pair &sample_pair = arc_sampler_->Value(); + size_t pos = sample_pair.first; + size_t count = sample_pair.second; + double prob = static_cast(count)/rstate.nsamples; + if (pos < narcs) { // regular transition + aiter.Seek(sample_pair.first); + const A &aarc = aiter.Value(); + Weight weight = weighted_ ? to_weight_(-log(prob)) : Weight::One(); + B barc(aarc.ilabel, aarc.olabel, weight, state_table_.size()); + AddArc(s, barc); + RandState *nrstate = + new RandState(aarc.nextstate, count, rstate.length + 1, + pos, &rstate); + state_table_.push_back(nrstate); + } else { // super-final transition + if (weighted_) { + Weight weight = remove_total_weight_ ? + to_weight_(-log(prob)) : to_weight_(-log(prob * npath_)); + SetFinal(s, weight); + } else { + if (superfinal_ == kNoLabel) { + superfinal_ = state_table_.size(); + RandState *nrstate = new RandState(kNoStateId, 0, 0, 0, 0); + state_table_.push_back(nrstate); + } + for (size_t n = 0; n < count; ++n) { + B barc(0, 0, Weight::One(), superfinal_); + AddArc(s, barc); + } + } + } + } + SetArcs(s); + } + + private: + Fst *fst_; + S *arc_sampler_; + size_t npath_; + vector *> state_table_; + bool weighted_; + bool remove_total_weight_; + StateId superfinal_; + WeightConvert to_weight_; + + void operator=(const RandGenFstImpl &); // disallow +}; + + +// Fst class to randomly generate paths through an FST; details controlled +// by RandGenOptionsFst. Output format is a tree weighted by the +// path count. +template +class RandGenFst : public ImplToFst< RandGenFstImpl > { + public: + friend class ArcIterator< RandGenFst >; + friend class StateIterator< RandGenFst >; + typedef B Arc; + typedef S Sampler; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef RandGenFstImpl Impl; + + RandGenFst(const Fst &fst, const RandGenFstOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + RandGenFst(const RandGenFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this RandGenFst. See Fst<>::Copy() for further doc. + virtual RandGenFst *Copy(bool safe = false) const { + return new RandGenFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RandGenFst &fst); // Disallow +}; + + + +// Specialization for RandGenFst. +template +class StateIterator< RandGenFst > + : public CacheStateIterator< RandGenFst > { + public: + explicit StateIterator(const RandGenFst &fst) + : CacheStateIterator< RandGenFst >(fst, fst.GetImpl()) {} + + private: + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for RandGenFst. +template +class ArcIterator< RandGenFst > + : public CacheArcIterator< RandGenFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RandGenFst &fst, StateId s) + : CacheArcIterator< RandGenFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void RandGenFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< RandGenFst >(*this); +} + +// Options for random path generation. +template +struct RandGenOptions { + const S &arc_selector; // How an arc is selected at a state + int max_length; // Maximum path length + size_t npath; // # of paths to generate + bool weighted; // Output is tree weighted by path count; o.w. + // output unweighted union of paths. + bool remove_total_weight; // Remove total weight when output is weighted. + + RandGenOptions(const S &sel, int len = INT_MAX, size_t n = 1, + bool w = false, bool rw = false) + : arc_selector(sel), + max_length(len), + npath(n), + weighted(w), + remove_total_weight(rw) {} +}; + + +template +class RandGenVisitor { + public: + typedef typename IArc::Weight Weight; + typedef typename IArc::StateId StateId; + + RandGenVisitor(MutableFst *ofst) : ofst_(ofst) {} + + void InitVisit(const Fst &ifst) { + ifst_ = &ifst; + + ofst_->DeleteStates(); + ofst_->SetInputSymbols(ifst.InputSymbols()); + ofst_->SetOutputSymbols(ifst.OutputSymbols()); + if (ifst.Properties(kError, false)) + ofst_->SetProperties(kError, kError); + path_.clear(); + } + + bool InitState(StateId s, StateId root) { return true; } + + bool TreeArc(StateId s, const IArc &arc) { + if (ifst_->Final(arc.nextstate) == Weight::Zero()) { + path_.push_back(arc); + } else { + OutputPath(); + } + return true; + } + + bool BackArc(StateId s, const IArc &arc) { + FSTERROR() << "RandGenVisitor: cyclic input"; + ofst_->SetProperties(kError, kError); + return false; + } + + bool ForwardOrCrossArc(StateId s, const IArc &arc) { + OutputPath(); + return true; + } + + void FinishState(StateId s, StateId p, const IArc *) { + if (p != kNoStateId && ifst_->Final(s) == Weight::Zero()) + path_.pop_back(); + } + + void FinishVisit() {} + + private: + void OutputPath() { + if (ofst_->Start() == kNoStateId) { + StateId start = ofst_->AddState(); + ofst_->SetStart(start); + } + + StateId src = ofst_->Start(); + for (size_t i = 0; i < path_.size(); ++i) { + StateId dest = ofst_->AddState(); + OArc arc(path_[i].ilabel, path_[i].olabel, Weight::One(), dest); + ofst_->AddArc(src, arc); + src = dest; + } + ofst_->SetFinal(src, Weight::One()); + } + + const Fst *ifst_; + MutableFst *ofst_; + vector path_; + + DISALLOW_COPY_AND_ASSIGN(RandGenVisitor); +}; + + +// Randomly generate paths through an FST; details controlled by +// RandGenOptions. +template +void RandGen(const Fst &ifst, MutableFst *ofst, + const RandGenOptions &opts) { + typedef ArcSampler Sampler; + typedef RandGenFst RandFst; + typedef typename OArc::StateId StateId; + typedef typename OArc::Weight Weight; + + Sampler* arc_sampler = new Sampler(ifst, opts.arc_selector, opts.max_length); + RandGenFstOptions fopts(CacheOptions(true, 0), arc_sampler, + opts.npath, opts.weighted, + opts.remove_total_weight); + RandFst rfst(ifst, fopts); + if (opts.weighted) { + *ofst = rfst; + } else { + RandGenVisitor rand_visitor(ofst); + DfsVisit(rfst, &rand_visitor); + } +} + +// Randomly generate a path through an FST with the uniform distribution +// over the transitions. +template +void RandGen(const Fst &ifst, MutableFst *ofst) { + UniformArcSelector uniform_selector; + RandGenOptions< UniformArcSelector > opts(uniform_selector); + RandGen(ifst, ofst, opts); +} + +} // namespace fst + +#endif // FST_LIB_RANDGEN_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/random-weight.h b/extlibs/openfstwin-1.3.1/include/fst/random-weight.h new file mode 100755 index 00000000000..0ccd95d3d47 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/random-weight.h @@ -0,0 +1,348 @@ +// random-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Function objects to generate random weights in various semirings +// for testing purposes. + +#ifndef FST_LIB_RANDOM_WEIGHT_H__ +#define FST_LIB_RANDOM_WEIGHT_H__ + +#include +#include +#include +using std::vector; + + +#include +#include +#include +#include +#include +#include +#include + + +namespace fst { + +// The boolean 'allow_zero' below determines whether Zero() and zero +// divisors should be returned in the random weight generation. + +// This function object returns TropicalWeightTpl's that are random integers +// chosen from [0, kNumRandomWeights). +template +class TropicalWeightGenerator_ { + public: + typedef TropicalWeightTpl Weight; + + TropicalWeightGenerator_(int seed = time(0), bool allow_zero = true) + : allow_zero_(allow_zero) { + srand(seed); + } + + Weight operator() () const { + int n = rand() % (kNumRandomWeights + allow_zero_); + if (allow_zero_ && n == kNumRandomWeights) + return Weight::Zero(); + + return Weight(static_cast(n)); + } + + private: + // The number of alternative random weights. + static const int kNumRandomWeights = 5; + + bool allow_zero_; // permit Zero() and zero divisors +}; + +template const int TropicalWeightGenerator_::kNumRandomWeights; + +typedef TropicalWeightGenerator_ TropicalWeightGenerator; + + +// This function object returns LogWeightTpl's that are random integers +// chosen from [0, kNumRandomWeights). +template +class LogWeightGenerator_ { + public: + typedef LogWeightTpl Weight; + + LogWeightGenerator_(int seed = time(0), bool allow_zero = true) + : allow_zero_(allow_zero) { + srand(seed); + } + + Weight operator() () const { + int n = rand() % (kNumRandomWeights + allow_zero_); + if (allow_zero_ && n == kNumRandomWeights) + return Weight::Zero(); + + return Weight(static_cast(n)); + } + + private: + // Number of alternative random weights. + static const int kNumRandomWeights = 5; + + bool allow_zero_; // permit Zero() and zero divisors +}; + +template const int LogWeightGenerator_::kNumRandomWeights; + +typedef LogWeightGenerator_ LogWeightGenerator; + + +// This function object returns MinMaxWeightTpl's that are random integers +// chosen from (-kNumRandomWeights, kNumRandomWeights) in addition to +// One(), and Zero() if zero is allowed. +template +class MinMaxWeightGenerator_ { + public: + typedef MinMaxWeightTpl Weight; + + MinMaxWeightGenerator_(int seed = time(0), bool allow_zero = true) + : allow_zero_(allow_zero) { + srand(seed); + } + + Weight operator() () const { + int n = (rand() % (2*kNumRandomWeights + allow_zero_)) - kNumRandomWeights; + if (allow_zero_ && n == kNumRandomWeights) + return Weight::Zero(); + else if (n == -kNumRandomWeights) + return Weight::One(); + + return Weight(static_cast(n)); + } + + private: + // Parameters controlling the number of alternative random weights. + static const int kNumRandomWeights = 5; + + bool allow_zero_; // permit Zero() and zero divisors +}; + +template const int MinMaxWeightGenerator_::kNumRandomWeights; + +typedef MinMaxWeightGenerator_ MinMaxWeightGenerator; + + +// This function object returns StringWeights that are random integer +// strings chosen from {1,...,kAlphabetSize}^{0,kMaxStringLength} U { Zero } +template +class StringWeightGenerator { + public: + typedef StringWeight Weight; + + StringWeightGenerator(int seed = time(0), bool allow_zero = true) + : allow_zero_(allow_zero) { + srand(seed); + } + + Weight operator() () const { + int n = rand() % (kMaxStringLength + allow_zero_); + if (allow_zero_ && n == kMaxStringLength) + return Weight::Zero(); + + vector v; + for (int i = 0; i < n; ++i) + v.push_back(rand() % kAlphabetSize + 1); + return Weight(v.begin(), v.end()); + } + + private: + // Alphabet size for random weights. + static const int kAlphabetSize = 5; + // Number of alternative random weights. + static const int kMaxStringLength = 5; + + bool allow_zero_; // permit Zero() and zero +}; + +template +const int StringWeightGenerator::kAlphabetSize; +template +const int StringWeightGenerator::kMaxStringLength; + + +// This function object returns a weight generator over the product of the +// weights (by default) for the generators G1 and G2. +template > +class ProductWeightGenerator { + public: + typedef typename G1::Weight W1; + typedef typename G2::Weight W2; + typedef W Weight; + + ProductWeightGenerator(int seed = time(0), bool allow_zero = true) + : generator1_(seed, allow_zero), generator2_(seed, allow_zero) {} + + Weight operator() () const { + W1 w1 = generator1_(); + W2 w2 = generator2_(); + return Weight(w1, w2); + } + + private: + G1 generator1_; + G2 generator2_; +}; + + +// This function object returns a weight generator for a lexicographic weight +// composed out of weights for the generators G1 and G2. For lexicographic +// weights, we cannot generate zeroes for the two subweights separately: +// weights are members iff both members are zero or both members are non-zero. +template +class LexicographicWeightGenerator { + public: + typedef typename G1::Weight W1; + typedef typename G2::Weight W2; + typedef LexicographicWeight Weight; + + LexicographicWeightGenerator(int seed = time(0), bool allow_zero = true) + : generator1_(seed, false), generator2_(seed, false), + allow_zero_(allow_zero) {} + + Weight operator() () const { + if (allow_zero_) { + int n = rand() % (kNumRandomWeights + allow_zero_); + if (n == kNumRandomWeights) + return Weight(W1::Zero(), W2::Zero()); + } + W1 w1 = generator1_(); + W2 w2 = generator2_(); + return Weight(w1, w2); + } + + private: + G1 generator1_; + G2 generator2_; + static const int kNumRandomWeights = 5; + bool allow_zero_; +}; + +template +const int LexicographicWeightGenerator::kNumRandomWeights; + + +// Product generator of a string weight generator and an +// arbitrary weight generator. +template +class GallicWeightGenerator + : public ProductWeightGenerator, G> { + + public: + typedef ProductWeightGenerator, G> PG; + typedef typename G::Weight W; + typedef GallicWeight Weight; + + GallicWeightGenerator(int seed = time(0), bool allow_zero = true) + : PG(seed, allow_zero) {} + + GallicWeightGenerator(const PG &pg) : PG(pg) {} +}; + +// This function object returms a weight generator over the catersian power +// of rank n of the weights for the generator G. +template +class PowerWeightGenerator { + public: + typedef typename G::Weight W; + typedef PowerWeight Weight; + + PowerWeightGenerator(int seed = time(0), bool allow_zero = true) + : generator_(seed, allow_zero) {} + + Weight operator()() const { + Weight w; + for (size_t i = 0; i < n; ++i) { + W r = generator_(); + w.SetValue(i, r); + } + return w; + } + + private: + G generator_; +}; + +// This function object returns SignedLogWeightTpl's that are +// random integers chosen from [0, kNumRandomWeights). +// The sign is randomly chosen as well. +template +class SignedLogWeightGenerator_ { + public: + typedef SignedLogWeightTpl Weight; + + SignedLogWeightGenerator_(int seed = time(0), bool allow_zero = true) + : allow_zero_(allow_zero) { + srand(seed); + } + + Weight operator() () const { + int m = rand() % 2; + int n = rand() % (kNumRandomWeights + allow_zero_); + + return SignedLogWeightTpl( + (m == 0) ? + TropicalWeight(-1.0) : + TropicalWeight(1.0), + (allow_zero_ && n == kNumRandomWeights) ? + LogWeightTpl::Zero() : + LogWeightTpl(static_cast(n))); + } + + private: + // Number of alternative random weights. + static const int kNumRandomWeights = 5; + bool allow_zero_; // permit Zero() and zero divisors +}; + +template const int SignedLogWeightGenerator_::kNumRandomWeights; + +typedef SignedLogWeightGenerator_ SignedLogWeightGenerator; + +// This function object returms a weight generator over the catersian power +// of rank n of the weights for the generator G. +template +class SparsePowerWeightGenerator { + public: + typedef typename G::Weight W; + typedef SparsePowerWeight Weight; + + SparsePowerWeightGenerator(int seed = time(0), bool allow_zero = true) + : generator_(seed, allow_zero) {} + + Weight operator()() const { + Weight w; + for (size_t i = 1; i <= n; ++i) { + W r = generator_(); + K p = i; + w.Push(p, r, true); + } + return w; + } + + private: + G generator_; +}; + +} // namespace fst + +#endif // FST_LIB_RANDOM_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rational.h b/extlibs/openfstwin-1.3.1/include/fst/rational.h new file mode 100755 index 00000000000..94049af8c2c --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rational.h @@ -0,0 +1,330 @@ +// rational.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// An Fst implementation and base interface for delayed unions, +// concatenations and closures. + +#ifndef FST_LIB_RATIONAL_H__ +#define FST_LIB_RATIONAL_H__ + +#include +#include +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +typedef CacheOptions RationalFstOptions; + +// This specifies whether to add the empty string. +enum ClosureType { CLOSURE_STAR = 0, // T* -> add the empty string + CLOSURE_PLUS = 1 }; // T+ -> don't add the empty string + +template class RationalFst; +template void Union(RationalFst *fst1, const Fst &fst2); +template void Concat(RationalFst *fst1, const Fst &fst2); +template void Concat(const Fst &fst1, RationalFst *fst2); +template void Closure(RationalFst *fst, ClosureType closure_type); + + +// Implementation class for delayed unions, concatenations and closures. +template +class RationalFstImpl : public FstImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + explicit RationalFstImpl(const RationalFstOptions &opts) + : nonterminals_(0), + replace_(0), + replace_options_(opts, 0) { + SetType("rational"); + fst_tuples_.push_back(make_pair*>(0, 0)); //ChangedPD + } + + RationalFstImpl(const RationalFstImpl &impl) + : rfst_(impl.rfst_), + nonterminals_(impl.nonterminals_), + + replace_(impl.replace_ ? impl.replace_->Copy(true) : 0), + replace_options_(impl.replace_options_) { + SetType("rational"); + fst_tuples_.reserve(impl.fst_tuples_.size()); + for (size_t i = 0; i < impl.fst_tuples_.size(); ++i) + fst_tuples_.push_back(make_pair(impl.fst_tuples_[i].first, + impl.fst_tuples_[i].second + ? impl.fst_tuples_[i].second->Copy(true) + : 0)); + } + + virtual ~RationalFstImpl() { + for (size_t i = 0; i < fst_tuples_.size(); ++i) + if (fst_tuples_[i].second) + delete fst_tuples_[i].second; + if (replace_) + delete replace_; + } + + StateId Start() { return Replace()->Start(); } + + Weight Final(StateId s) { return Replace()->Final(s); } + + size_t NumArcs(StateId s) { return Replace()->NumArcs(s); } + + size_t NumInputEpsilons(StateId s) { + return Replace()->NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + return Replace()->NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && Replace()->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + // Implementation of UnionFst(fst1,fst2) + void InitUnion(const Fst &fst1, const Fst &fst2) { + if (replace_) + delete replace_; + uint64 props1 = fst1.Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + SetInputSymbols(fst1.InputSymbols()); + SetOutputSymbols(fst1.OutputSymbols()); + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(1, Weight::One()); + rfst_.SetInputSymbols(fst1.InputSymbols()); + rfst_.SetOutputSymbols(fst1.OutputSymbols()); + nonterminals_ = 2; + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(0, A(0, -2, Weight::One(), 1)); + fst_tuples_.push_back(make_pair(-1, fst1.Copy())); + fst_tuples_.push_back(make_pair(-2, fst2.Copy())); + SetProperties(UnionProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of ConcatFst(fst1,fst2) + void InitConcat(const Fst &fst1, const Fst &fst2) { + if (replace_) + delete replace_; + uint64 props1 = fst1.Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + SetInputSymbols(fst1.InputSymbols()); + SetOutputSymbols(fst1.OutputSymbols()); + rfst_.AddState(); + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(2, Weight::One()); + rfst_.SetInputSymbols(fst1.InputSymbols()); + rfst_.SetOutputSymbols(fst1.OutputSymbols()); + nonterminals_ = 2; + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(1, A(0, -2, Weight::One(), 2)); + fst_tuples_.push_back(make_pair(-1, fst1.Copy())); + fst_tuples_.push_back(make_pair(-2, fst2.Copy())); + SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of ClosureFst(fst, closure_type) + void InitClosure(const Fst &fst, ClosureType closure_type) { + if (replace_) + delete replace_; + uint64 props = fst.Properties(kFstProperties, false); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + if (closure_type == CLOSURE_STAR) { + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(0, Weight::One()); + rfst_.AddArc(0, A(0, -1, Weight::One(), 0)); + } else { + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(1, Weight::One()); + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(1, A(0, 0, Weight::One(), 0)); + } + rfst_.SetInputSymbols(fst.InputSymbols()); + rfst_.SetOutputSymbols(fst.OutputSymbols()); + fst_tuples_.push_back(make_pair(-1, fst.Copy())); + nonterminals_ = 1; + SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), + kCopyProperties); + } + + // Implementation of Union(Fst &, RationalFst *) + void AddUnion(const Fst &fst) { + if (replace_) + delete replace_; + uint64 props1 = FstImpl::Properties(); + uint64 props2 = fst.Properties(kFstProperties, false); + VectorFst afst; + afst.AddState(); + afst.AddState(); + afst.SetStart(0); + afst.SetFinal(1, Weight::One()); + ++nonterminals_; + afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); + Union(&rfst_, afst); + fst_tuples_.push_back(make_pair(-nonterminals_, fst.Copy())); + SetProperties(UnionProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of Concat(Fst &, RationalFst *) + void AddConcat(const Fst &fst, bool append) { + if (replace_) + delete replace_; + uint64 props1 = FstImpl::Properties(); + uint64 props2 = fst.Properties(kFstProperties, false); + VectorFst afst; + afst.AddState(); + afst.AddState(); + afst.SetStart(0); + afst.SetFinal(1, Weight::One()); + ++nonterminals_; + afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); + if (append) + Concat(&rfst_, afst); + else + Concat(afst, &rfst_); + fst_tuples_.push_back(make_pair(-nonterminals_, fst.Copy())); + SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of Closure(RationalFst *, closure_type) + void AddClosure(ClosureType closure_type) { + if (replace_) + delete replace_; + uint64 props = FstImpl::Properties(); + Closure(&rfst_, closure_type); + SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), + kCopyProperties); + } + + // Returns the underlying ReplaceFst. + ReplaceFst *Replace() const { + if (!replace_) { + fst_tuples_[0].second = rfst_.Copy(); + replace_ = new ReplaceFst(fst_tuples_, replace_options_); + } + return replace_; + } + + private: + VectorFst rfst_; // rational topology machine; uses neg. nonterminals + Label nonterminals_; // # of nonterminals used + // Contains the nonterminals and their corresponding FSTs. + mutable vector*> > fst_tuples_; + mutable ReplaceFst *replace_; // Underlying ReplaceFst + ReplaceFstOptions replace_options_; // Options for creating 'replace_' + + void operator=(const RationalFstImpl &impl); // disallow +}; + +// Parent class for the delayed rational operations - delayed union, +// concatenation, and closure. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RationalFst : public ImplToFst< RationalFstImpl > { + public: + friend class StateIterator< RationalFst >; + friend class ArcIterator< RationalFst >; + friend void Union<>(RationalFst *fst1, const Fst &fst2); + friend void Concat<>(RationalFst *fst1, const Fst &fst2); + friend void Concat<>(const Fst &fst1, RationalFst *fst2); + friend void Closure<>(RationalFst *fst, ClosureType closure_type); + + typedef A Arc; + typedef typename A::StateId StateId; + typedef RationalFstImpl Impl; + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->Replace()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->Replace()->InitArcIterator(s, data); + } + + protected: + RationalFst() + : ImplToFst(new Impl(RationalFstOptions())) {} + + explicit RationalFst(const RationalFstOptions &opts) + : ImplToFst(new Impl(opts)) {} + + // See Fst<>::Copy() for doc. + RationalFst(const RationalFst &fst , bool safe = false) + : ImplToFst(fst, safe) {} + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RationalFst &fst); // disallow +}; + + +// Specialization for RationalFst. +template +class StateIterator< RationalFst > + : public StateIterator< ReplaceFst > { + public: + explicit StateIterator(const RationalFst &fst) + : StateIterator< ReplaceFst >(*(fst.GetImpl()->Replace())) {} +}; + + +// Specialization for RationalFst. +template +class ArcIterator< RationalFst > + : public CacheArcIterator< ReplaceFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RationalFst &fst, StateId s) + : ArcIterator< ReplaceFst >(*(fst.GetImpl()->Replace()), s) {} +}; + +} // namespace fst + +#endif // FST_LIB_RATIONAL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rational.h.bak b/extlibs/openfstwin-1.3.1/include/fst/rational.h.bak new file mode 100755 index 00000000000..96aa00d5491 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rational.h.bak @@ -0,0 +1,330 @@ +// rational.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// An Fst implementation and base interface for delayed unions, +// concatenations and closures. + +#ifndef FST_LIB_RATIONAL_H__ +#define FST_LIB_RATIONAL_H__ + +#include +#include +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +typedef CacheOptions RationalFstOptions; + +// This specifies whether to add the empty string. +enum ClosureType { CLOSURE_STAR = 0, // T* -> add the empty string + CLOSURE_PLUS = 1 }; // T+ -> don't add the empty string + +template class RationalFst; +template void Union(RationalFst *fst1, const Fst &fst2); +template void Concat(RationalFst *fst1, const Fst &fst2); +template void Concat(const Fst &fst1, RationalFst *fst2); +template void Closure(RationalFst *fst, ClosureType closure_type); + + +// Implementation class for delayed unions, concatenations and closures. +template +class RationalFstImpl : public FstImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + explicit RationalFstImpl(const RationalFstOptions &opts) + : nonterminals_(0), + replace_(0), + replace_options_(opts, 0) { + SetType("rational"); + fst_tuples_.push_back(pair*>(0, 0)); + } + + RationalFstImpl(const RationalFstImpl &impl) + : rfst_(impl.rfst_), + nonterminals_(impl.nonterminals_), + + replace_(impl.replace_ ? impl.replace_->Copy(true) : 0), + replace_options_(impl.replace_options_) { + SetType("rational"); + fst_tuples_.reserve(impl.fst_tuples_.size()); + for (size_t i = 0; i < impl.fst_tuples_.size(); ++i) + fst_tuples_.push_back(make_pair(impl.fst_tuples_[i].first, + impl.fst_tuples_[i].second + ? impl.fst_tuples_[i].second->Copy(true) + : 0)); + } + + virtual ~RationalFstImpl() { + for (size_t i = 0; i < fst_tuples_.size(); ++i) + if (fst_tuples_[i].second) + delete fst_tuples_[i].second; + if (replace_) + delete replace_; + } + + StateId Start() { return Replace()->Start(); } + + Weight Final(StateId s) { return Replace()->Final(s); } + + size_t NumArcs(StateId s) { return Replace()->NumArcs(s); } + + size_t NumInputEpsilons(StateId s) { + return Replace()->NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + return Replace()->NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && Replace()->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + // Implementation of UnionFst(fst1,fst2) + void InitUnion(const Fst &fst1, const Fst &fst2) { + if (replace_) + delete replace_; + uint64 props1 = fst1.Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + SetInputSymbols(fst1.InputSymbols()); + SetOutputSymbols(fst1.OutputSymbols()); + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(1, Weight::One()); + rfst_.SetInputSymbols(fst1.InputSymbols()); + rfst_.SetOutputSymbols(fst1.OutputSymbols()); + nonterminals_ = 2; + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(0, A(0, -2, Weight::One(), 1)); + fst_tuples_.push_back(make_pair(-1, fst1.Copy())); + fst_tuples_.push_back(make_pair(-2, fst2.Copy())); + SetProperties(UnionProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of ConcatFst(fst1,fst2) + void InitConcat(const Fst &fst1, const Fst &fst2) { + if (replace_) + delete replace_; + uint64 props1 = fst1.Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + SetInputSymbols(fst1.InputSymbols()); + SetOutputSymbols(fst1.OutputSymbols()); + rfst_.AddState(); + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(2, Weight::One()); + rfst_.SetInputSymbols(fst1.InputSymbols()); + rfst_.SetOutputSymbols(fst1.OutputSymbols()); + nonterminals_ = 2; + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(1, A(0, -2, Weight::One(), 2)); + fst_tuples_.push_back(make_pair(-1, fst1.Copy())); + fst_tuples_.push_back(make_pair(-2, fst2.Copy())); + SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of ClosureFst(fst, closure_type) + void InitClosure(const Fst &fst, ClosureType closure_type) { + if (replace_) + delete replace_; + uint64 props = fst.Properties(kFstProperties, false); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + if (closure_type == CLOSURE_STAR) { + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(0, Weight::One()); + rfst_.AddArc(0, A(0, -1, Weight::One(), 0)); + } else { + rfst_.AddState(); + rfst_.AddState(); + rfst_.SetStart(0); + rfst_.SetFinal(1, Weight::One()); + rfst_.AddArc(0, A(0, -1, Weight::One(), 1)); + rfst_.AddArc(1, A(0, 0, Weight::One(), 0)); + } + rfst_.SetInputSymbols(fst.InputSymbols()); + rfst_.SetOutputSymbols(fst.OutputSymbols()); + fst_tuples_.push_back(make_pair(-1, fst.Copy())); + nonterminals_ = 1; + SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), + kCopyProperties); + } + + // Implementation of Union(Fst &, RationalFst *) + void AddUnion(const Fst &fst) { + if (replace_) + delete replace_; + uint64 props1 = FstImpl::Properties(); + uint64 props2 = fst.Properties(kFstProperties, false); + VectorFst afst; + afst.AddState(); + afst.AddState(); + afst.SetStart(0); + afst.SetFinal(1, Weight::One()); + ++nonterminals_; + afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); + Union(&rfst_, afst); + fst_tuples_.push_back(make_pair(-nonterminals_, fst.Copy())); + SetProperties(UnionProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of Concat(Fst &, RationalFst *) + void AddConcat(const Fst &fst, bool append) { + if (replace_) + delete replace_; + uint64 props1 = FstImpl::Properties(); + uint64 props2 = fst.Properties(kFstProperties, false); + VectorFst afst; + afst.AddState(); + afst.AddState(); + afst.SetStart(0); + afst.SetFinal(1, Weight::One()); + ++nonterminals_; + afst.AddArc(0, A(0, -nonterminals_, Weight::One(), 1)); + if (append) + Concat(&rfst_, afst); + else + Concat(afst, &rfst_); + fst_tuples_.push_back(make_pair(-nonterminals_, fst.Copy())); + SetProperties(ConcatProperties(props1, props2, true), kCopyProperties); + } + + // Implementation of Closure(RationalFst *, closure_type) + void AddClosure(ClosureType closure_type) { + if (replace_) + delete replace_; + uint64 props = FstImpl::Properties(); + Closure(&rfst_, closure_type); + SetProperties(ClosureProperties(props, closure_type == CLOSURE_STAR, true), + kCopyProperties); + } + + // Returns the underlying ReplaceFst. + ReplaceFst *Replace() const { + if (!replace_) { + fst_tuples_[0].second = rfst_.Copy(); + replace_ = new ReplaceFst(fst_tuples_, replace_options_); + } + return replace_; + } + + private: + VectorFst rfst_; // rational topology machine; uses neg. nonterminals + Label nonterminals_; // # of nonterminals used + // Contains the nonterminals and their corresponding FSTs. + mutable vector*> > fst_tuples_; + mutable ReplaceFst *replace_; // Underlying ReplaceFst + ReplaceFstOptions replace_options_; // Options for creating 'replace_' + + void operator=(const RationalFstImpl &impl); // disallow +}; + +// Parent class for the delayed rational operations - delayed union, +// concatenation, and closure. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RationalFst : public ImplToFst< RationalFstImpl > { + public: + friend class StateIterator< RationalFst >; + friend class ArcIterator< RationalFst >; + friend void Union<>(RationalFst *fst1, const Fst &fst2); + friend void Concat<>(RationalFst *fst1, const Fst &fst2); + friend void Concat<>(const Fst &fst1, RationalFst *fst2); + friend void Closure<>(RationalFst *fst, ClosureType closure_type); + + typedef A Arc; + typedef typename A::StateId StateId; + typedef RationalFstImpl Impl; + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->Replace()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->Replace()->InitArcIterator(s, data); + } + + protected: + RationalFst() + : ImplToFst(new Impl(RationalFstOptions())) {} + + explicit RationalFst(const RationalFstOptions &opts) + : ImplToFst(new Impl(opts)) {} + + // See Fst<>::Copy() for doc. + RationalFst(const RationalFst &fst , bool safe = false) + : ImplToFst(fst, safe) {} + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RationalFst &fst); // disallow +}; + + +// Specialization for RationalFst. +template +class StateIterator< RationalFst > + : public StateIterator< ReplaceFst > { + public: + explicit StateIterator(const RationalFst &fst) + : StateIterator< ReplaceFst >(*(fst.GetImpl()->Replace())) {} +}; + + +// Specialization for RationalFst. +template +class ArcIterator< RationalFst > + : public CacheArcIterator< ReplaceFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RationalFst &fst, StateId s) + : ArcIterator< ReplaceFst >(*(fst.GetImpl()->Replace()), s) {} +}; + +} // namespace fst + +#endif // FST_LIB_RATIONAL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/register.h b/extlibs/openfstwin-1.3.1/include/fst/register.h new file mode 100755 index 00000000000..ea3f4d88c1b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/register.h @@ -0,0 +1,133 @@ +// register.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley), jpr@google.com (Jake Ratkiewicz) +// +// \file +// Classes for registering derived Fsts for generic reading +// + +#ifndef FST_LIB_REGISTER_H__ +#define FST_LIB_REGISTER_H__ + +#include + + +#include +#include +#include +#include +#include +#include + + +#include + +namespace fst { + +template class Fst; +struct FstReadOptions; + +// This class represents a single entry in a FstRegister +template +struct FstRegisterEntry { + typedef Fst *(*Reader)(istream &strm, const FstReadOptions &opts); + typedef Fst *(*Converter)(const Fst &fst); + + Reader reader; + Converter converter; + FstRegisterEntry() : reader(0), converter(0) {} + FstRegisterEntry(Reader r, Converter c) : reader(r), converter(c) { } +}; + +// This class maintains the correspondence between a string describing +// an FST type, and its reader and converter. +template +class FstRegister : public GenericRegister, + FstRegister > { + public: + typedef typename FstRegisterEntry::Reader Reader; + typedef typename FstRegisterEntry::Converter Converter; + + const Reader GetReader(const string &type) const { + return this->GetEntry(type).reader; + } + + const Converter GetConverter(const string &type) const { + return this->GetEntry(type).converter; + } + + protected: + virtual string ConvertKeyToSoFilename(const string& key) const { + string legal_type(key); + + ConvertToLegalCSymbol(&legal_type); + + return legal_type + "-fst.so"; + } +}; + + +// This class registers an Fst type for generic reading and creating. +// The Fst type must have a default constructor and a copy constructor +// from 'Fst' for this to work. +template +class FstRegisterer + : public GenericRegisterer > { + public: + typedef typename F::Arc Arc; + typedef typename FstRegister::Entry Entry; + typedef typename FstRegister::Reader Reader; + + FstRegisterer() : + GenericRegisterer >( + F().Type(), BuildEntry()) { } + + private: + Entry BuildEntry() { + F *(*reader)(istream &strm, + const FstReadOptions &opts) = &F::Read; + + return Entry(reinterpret_cast(reader), + &FstRegisterer::Convert); + } + + static Fst *Convert(const Fst &fst) { return new F(fst); } +}; + + +// Convenience macro to generate static FstRegisterer instance. +#define REGISTER_FST(F, A) \ +static fst::FstRegisterer< F > F ## _ ## A ## _registerer + + +// Converts an fst to type 'type'. +template +Fst *Convert(const Fst &fst, const string &ftype) { + FstRegister *registr = FstRegister::GetRegister(); + const typename FstRegister::Converter + converter = registr->GetConverter(ftype); + if (!converter) { + string atype = A::Type(); + LOG(ERROR) << "Fst::Convert: Unknown FST type \"" << ftype + << "\" (arc type = \"" << atype << "\")"; + return 0; + } + return converter(fst); +} + +} // namespace fst + +#endif // FST_LIB_REGISTER_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/relabel.h b/extlibs/openfstwin-1.3.1/include/fst/relabel.h new file mode 100755 index 00000000000..87e715dd8f8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/relabel.h @@ -0,0 +1,524 @@ +// relabel.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Functions and classes to relabel an Fst (either on input or output) +// +#ifndef FST_LIB_RELABEL_H__ +#define FST_LIB_RELABEL_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include + + +namespace fst { + +// +// Relabels either the input labels or output labels. The old to +// new labels are specified using a vector of pair. +// Any label associations not specified are assumed to be identity +// mapping. +// +// \param fst input fst, must be mutable +// \param ipairs vector of input label pairs indicating old to new mapping +// \param opairs vector of output label pairs indicating old to new mapping +// +template +void Relabel( + MutableFst *fst, + const vector >& ipairs, + const vector >& opairs) { + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + uint64 props = fst->Properties(kFstProperties, false); + + // construct label to label hash. + unordered_map input_map; + for (size_t i = 0; i < ipairs.size(); ++i) { + input_map[ipairs[i].first] = ipairs[i].second; + } + + unordered_map output_map; + for (size_t i = 0; i < opairs.size(); ++i) { + output_map[opairs[i].first] = opairs[i].second; + } + + for (StateIterator > siter(*fst); + !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + for (MutableArcIterator > aiter(fst, s); + !aiter.Done(); aiter.Next()) { + A arc = aiter.Value(); + + // relabel input + // only relabel if relabel pair defined + typename unordered_map::iterator it = + input_map.find(arc.ilabel); + if (it != input_map.end()) { + if (it->second == kNoLabel) { + FSTERROR() << "Input symbol id " << arc.ilabel + << " missing from target vocabulary"; + fst->SetProperties(kError, kError); + return; + } + arc.ilabel = it->second; + } + + // relabel output + it = output_map.find(arc.olabel); + if (it != output_map.end()) { + if (it->second == kNoLabel) { + FSTERROR() << "Output symbol id " << arc.olabel + << " missing from target vocabulary"; + fst->SetProperties(kError, kError); + return; + } + arc.olabel = it->second; + } + + aiter.SetValue(arc); + } + } + + fst->SetProperties(RelabelProperties(props), kFstProperties); +} + +// +// Relabels either the input labels or output labels. The old to +// new labels mappings are specified using an input Symbol set. +// Any label associations not specified are assumed to be identity +// mapping. +// +// \param fst input fst, must be mutable +// \param new_isymbols symbol set indicating new mapping of input symbols +// \param new_osymbols symbol set indicating new mapping of output symbols +// +template +void Relabel(MutableFst *fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols) { + Relabel(fst, + fst->InputSymbols(), new_isymbols, true, + fst->OutputSymbols(), new_osymbols, true); +} + +template +void Relabel(MutableFst *fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + bool attach_new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + bool attach_new_osymbols) { + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + vector > ipairs; + if (old_isymbols && new_isymbols) { + for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done(); + syms_iter.Next()) { + string isymbol = syms_iter.Symbol(); + int isymbol_val = syms_iter.Value(); + int new_isymbol_val = new_isymbols->Find(isymbol); + ipairs.push_back(make_pair(isymbol_val, new_isymbol_val)); + } + if (attach_new_isymbols) + fst->SetInputSymbols(new_isymbols); + } + + vector > opairs; + if (old_osymbols && new_osymbols) { + for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done(); + syms_iter.Next()) { + string osymbol = syms_iter.Symbol(); + int osymbol_val = syms_iter.Value(); + int new_osymbol_val = new_osymbols->Find(osymbol); + opairs.push_back(make_pair(osymbol_val, new_osymbol_val)); + } + if (attach_new_osymbols) + fst->SetOutputSymbols(new_osymbols); + } + + // call relabel using vector of relabel pairs. + Relabel(fst, ipairs, opairs); +} + + +typedef CacheOptions RelabelFstOptions; + +template class RelabelFst; + +// +// \class RelabelFstImpl +// \brief Implementation for delayed relabeling +// +// Relabels an FST from one symbol set to another. Relabeling +// can either be on input or output space. RelabelFst implements +// a delayed version of the relabel. Arcs are relabeled on the fly +// and not cached. I.e each request is recomputed. +// +template +class RelabelFstImpl : public CacheImpl { + friend class StateIterator< RelabelFst >; + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + RelabelFstImpl(const Fst& fst, + const vector >& ipairs, + const vector >& opairs, + const RelabelFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()), + relabel_input_(false), relabel_output_(false) { + uint64 props = fst.Properties(kCopyProperties, false); + SetProperties(RelabelProperties(props)); + SetType("relabel"); + + // create input label map + if (ipairs.size() > 0) { + for (size_t i = 0; i < ipairs.size(); ++i) { + input_map_[ipairs[i].first] = ipairs[i].second; + } + relabel_input_ = true; + } + + // create output label map + if (opairs.size() > 0) { + for (size_t i = 0; i < opairs.size(); ++i) { + output_map_[opairs[i].first] = opairs[i].second; + } + relabel_output_ = true; + } + } + + RelabelFstImpl(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()), + relabel_input_(false), relabel_output_(false) { + SetType("relabel"); + + uint64 props = fst.Properties(kCopyProperties, false); + SetProperties(RelabelProperties(props)); + SetInputSymbols(old_isymbols); + SetOutputSymbols(old_osymbols); + + if (old_isymbols && new_isymbols && + old_isymbols->LabeledCheckSum() != new_isymbols->LabeledCheckSum()) { + for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done(); + syms_iter.Next()) { + input_map_[syms_iter.Value()] = new_isymbols->Find(syms_iter.Symbol()); + } + SetInputSymbols(new_isymbols); + relabel_input_ = true; + } + + if (old_osymbols && new_osymbols && + old_osymbols->LabeledCheckSum() != new_osymbols->LabeledCheckSum()) { + for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done(); + syms_iter.Next()) { + output_map_[syms_iter.Value()] = + new_osymbols->Find(syms_iter.Symbol()); + } + SetOutputSymbols(new_osymbols); + relabel_output_ = true; + } + } + + RelabelFstImpl(const RelabelFstImpl& impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + input_map_(impl.input_map_), + output_map_(impl.output_map_), + relabel_input_(impl.relabel_input_), + relabel_output_(impl.relabel_output_) { + SetType("relabel"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~RelabelFstImpl() { delete fst_; } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + SetStart(s); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + SetFinal(s, fst_->Final(s)); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData* data) { + if (!HasArcs(s)) { + Expand(s); + } + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + for (ArcIterator > aiter(*fst_, s); !aiter.Done(); aiter.Next()) { + A arc = aiter.Value(); + + // relabel input + if (relabel_input_) { + typename unordered_map::iterator it = + input_map_.find(arc.ilabel); + if (it != input_map_.end()) { arc.ilabel = it->second; } + } + + // relabel output + if (relabel_output_) { + typename unordered_map::iterator it = + output_map_.find(arc.olabel); + if (it != output_map_.end()) { arc.olabel = it->second; } + } + + PushArc(s, arc); + } + SetArcs(s); + } + + + private: + const Fst *fst_; + + unordered_map input_map_; + unordered_map output_map_; + bool relabel_input_; + bool relabel_output_; + + void operator=(const RelabelFstImpl &); // disallow +}; + + +// +// \class RelabelFst +// \brief Delayed implementation of arc relabeling +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RelabelFst : public ImplToFst< RelabelFstImpl > { + public: + friend class ArcIterator< RelabelFst >; + friend class StateIterator< RelabelFst >; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef RelabelFstImpl Impl; + + RelabelFst(const Fst& fst, + const vector >& ipairs, + const vector >& opairs) + : ImplToFst(new Impl(fst, ipairs, opairs, RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const vector >& ipairs, + const vector >& opairs, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, ipairs, opairs, opts)) {} + + RelabelFst(const Fst& fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols) + : ImplToFst(new Impl(fst, fst.InputSymbols(), new_isymbols, + fst.OutputSymbols(), new_osymbols, + RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, fst.InputSymbols(), new_isymbols, + fst.OutputSymbols(), new_osymbols, opts)) {} + + RelabelFst(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols) + : ImplToFst(new Impl(fst, old_isymbols, new_isymbols, old_osymbols, + new_osymbols, RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, old_isymbols, new_isymbols, old_osymbols, + new_osymbols, opts)) {} + + // See Fst<>::Copy() for doc. + RelabelFst(const RelabelFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this RelabelFst. See Fst<>::Copy() for further doc. + virtual RelabelFst *Copy(bool safe = false) const { + return new RelabelFst(*this, safe); + } + + virtual void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + return GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RelabelFst &fst); // disallow +}; + +// Specialization for RelabelFst. +template +class StateIterator< RelabelFst > : public StateIteratorBase { + public: + typedef typename A::StateId StateId; + + explicit StateIterator(const RelabelFst &fst) + : impl_(fst.GetImpl()), siter_(*impl_->fst_), s_(0) {} + + bool Done() const { return siter_.Done(); } + + StateId Value() const { return s_; } + + void Next() { + if (!siter_.Done()) { + ++s_; + siter_.Next(); + } + } + + void Reset() { + s_ = 0; + siter_.Reset(); + } + + private: + bool Done_() const { return Done(); } + StateId Value_() const { return Value(); } + void Next_() { Next(); } + void Reset_() { Reset(); } + + const RelabelFstImpl *impl_; + StateIterator< Fst > siter_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for RelabelFst. +template +class ArcIterator< RelabelFst > + : public CacheArcIterator< RelabelFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RelabelFst &fst, StateId s) + : CacheArcIterator< RelabelFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void RelabelFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< RelabelFst >(*this); +} + +// Useful alias when using StdArc. +typedef RelabelFst StdRelabelFst; + +} // namespace fst + +#endif // FST_LIB_RELABEL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/relabel.h.bak b/extlibs/openfstwin-1.3.1/include/fst/relabel.h.bak new file mode 100755 index 00000000000..685d42a310c --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/relabel.h.bak @@ -0,0 +1,524 @@ +// relabel.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Functions and classes to relabel an Fst (either on input or output) +// +#ifndef FST_LIB_RELABEL_H__ +#define FST_LIB_RELABEL_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include + + +namespace fst { + +// +// Relabels either the input labels or output labels. The old to +// new labels are specified using a vector of pair. +// Any label associations not specified are assumed to be identity +// mapping. +// +// \param fst input fst, must be mutable +// \param ipairs vector of input label pairs indicating old to new mapping +// \param opairs vector of output label pairs indicating old to new mapping +// +template +void Relabel( + MutableFst *fst, + const vector >& ipairs, + const vector >& opairs) { + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + uint64 props = fst->Properties(kFstProperties, false); + + // construct label to label hash. + unordered_map input_map; + for (size_t i = 0; i < ipairs.size(); ++i) { + input_map[ipairs[i].first] = ipairs[i].second; + } + + unordered_map output_map; + for (size_t i = 0; i < opairs.size(); ++i) { + output_map[opairs[i].first] = opairs[i].second; + } + + for (StateIterator > siter(*fst); + !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + for (MutableArcIterator > aiter(fst, s); + !aiter.Done(); aiter.Next()) { + A arc = aiter.Value(); + + // relabel input + // only relabel if relabel pair defined + typename unordered_map::iterator it = + input_map.find(arc.ilabel); + if (it != input_map.end()) { + if (it->second == kNoLabel) { + FSTERROR() << "Input symbol id " << arc.ilabel + << " missing from target vocabulary"; + fst->SetProperties(kError, kError); + return; + } + arc.ilabel = it->second; + } + + // relabel output + it = output_map.find(arc.olabel); + if (it != output_map.end()) { + if (it->second == kNoLabel) { + FSTERROR() << "Output symbol id " << arc.olabel + << " missing from target vocabulary"; + fst->SetProperties(kError, kError); + return; + } + arc.olabel = it->second; + } + + aiter.SetValue(arc); + } + } + + fst->SetProperties(RelabelProperties(props), kFstProperties); +} + +// +// Relabels either the input labels or output labels. The old to +// new labels mappings are specified using an input Symbol set. +// Any label associations not specified are assumed to be identity +// mapping. +// +// \param fst input fst, must be mutable +// \param new_isymbols symbol set indicating new mapping of input symbols +// \param new_osymbols symbol set indicating new mapping of output symbols +// +template +void Relabel(MutableFst *fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols) { + Relabel(fst, + fst->InputSymbols(), new_isymbols, true, + fst->OutputSymbols(), new_osymbols, true); +} + +template +void Relabel(MutableFst *fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + bool attach_new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + bool attach_new_osymbols) { + typedef typename A::StateId StateId; + typedef typename A::Label Label; + + vector > ipairs; + if (old_isymbols && new_isymbols) { + for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done(); + syms_iter.Next()) { + string isymbol = syms_iter.Symbol(); + int isymbol_val = syms_iter.Value(); + int new_isymbol_val = new_isymbols->Find(isymbol); + ipairs.push_back(make_pair(isymbol_val, new_isymbol_val)); + } + if (attach_new_isymbols) + fst->SetInputSymbols(new_isymbols); + } + + vector > opairs; + if (old_osymbols && new_osymbols) { + for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done(); + syms_iter.Next()) { + string osymbol = syms_iter.Symbol(); + int osymbol_val = syms_iter.Value(); + int new_osymbol_val = new_osymbols->Find(osymbol); + opairs.push_back(make_pair(osymbol_val, new_osymbol_val)); + } + if (attach_new_osymbols) + fst->SetOutputSymbols(new_osymbols); + } + + // call relabel using vector of relabel pairs. + Relabel(fst, ipairs, opairs); +} + + +typedef CacheOptions RelabelFstOptions; + +template class RelabelFst; + +// +// \class RelabelFstImpl +// \brief Implementation for delayed relabeling +// +// Relabels an FST from one symbol set to another. Relabeling +// can either be on input or output space. RelabelFst implements +// a delayed version of the relabel. Arcs are relabeled on the fly +// and not cached. I.e each request is recomputed. +// +template +class RelabelFstImpl : public CacheImpl { + friend class StateIterator< RelabelFst >; + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + RelabelFstImpl(const Fst& fst, + const vector >& ipairs, + const vector >& opairs, + const RelabelFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()), + relabel_input_(false), relabel_output_(false) { + uint64 props = fst.Properties(kCopyProperties, false); + SetProperties(RelabelProperties(props)); + SetType("relabel"); + + // create input label map + if (ipairs.size() > 0) { + for (size_t i = 0; i < ipairs.size(); ++i) { + input_map_[ipairs[i].first] = ipairs[i].second; + } + relabel_input_ = true; + } + + // create output label map + if (opairs.size() > 0) { + for (size_t i = 0; i < opairs.size(); ++i) { + output_map_[opairs[i].first] = opairs[i].second; + } + relabel_output_ = true; + } + } + + RelabelFstImpl(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()), + relabel_input_(false), relabel_output_(false) { + SetType("relabel"); + + uint64 props = fst.Properties(kCopyProperties, false); + SetProperties(RelabelProperties(props)); + SetInputSymbols(old_isymbols); + SetOutputSymbols(old_osymbols); + + if (old_isymbols && new_isymbols && + old_isymbols->LabeledCheckSum() != new_isymbols->LabeledCheckSum()) { + for (SymbolTableIterator syms_iter(*old_isymbols); !syms_iter.Done(); + syms_iter.Next()) { + input_map_[syms_iter.Value()] = new_isymbols->Find(syms_iter.Symbol()); + } + SetInputSymbols(new_isymbols); + relabel_input_ = true; + } + + if (old_osymbols && new_osymbols && + old_osymbols->LabeledCheckSum() != new_osymbols->LabeledCheckSum()) { + for (SymbolTableIterator syms_iter(*old_osymbols); !syms_iter.Done(); + syms_iter.Next()) { + output_map_[syms_iter.Value()] = + new_osymbols->Find(syms_iter.Symbol()); + } + SetOutputSymbols(new_osymbols); + relabel_output_ = true; + } + } + + RelabelFstImpl(const RelabelFstImpl& impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + input_map_(impl.input_map_), + output_map_(impl.output_map_), + relabel_input_(impl.relabel_input_), + relabel_output_(impl.relabel_output_) { + SetType("relabel"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~RelabelFstImpl() { delete fst_; } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + SetStart(s); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + SetFinal(s, fst_->Final(s)); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) { + Expand(s); + } + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData* data) { + if (!HasArcs(s)) { + Expand(s); + } + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + for (ArcIterator > aiter(*fst_, s); !aiter.Done(); aiter.Next()) { + A arc = aiter.Value(); + + // relabel input + if (relabel_input_) { + typename unordered_map::iterator it = + input_map_.find(arc.ilabel); + if (it != input_map_.end()) { arc.ilabel = it->second; } + } + + // relabel output + if (relabel_output_) { + typename unordered_map::iterator it = + output_map_.find(arc.olabel); + if (it != output_map_.end()) { arc.olabel = it->second; } + } + + PushArc(s, arc); + } + SetArcs(s); + } + + + private: + const Fst *fst_; + + unordered_map input_map_; + unordered_map output_map_; + bool relabel_input_; + bool relabel_output_; + + void operator=(const RelabelFstImpl &); // disallow +}; + + +// +// \class RelabelFst +// \brief Delayed implementation of arc relabeling +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RelabelFst : public ImplToFst< RelabelFstImpl > { + public: + friend class ArcIterator< RelabelFst >; + friend class StateIterator< RelabelFst >; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef RelabelFstImpl Impl; + + RelabelFst(const Fst& fst, + const vector >& ipairs, + const vector >& opairs) + : ImplToFst(new Impl(fst, ipairs, opairs, RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const vector >& ipairs, + const vector >& opairs, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, ipairs, opairs, opts)) {} + + RelabelFst(const Fst& fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols) + : ImplToFst(new Impl(fst, fst.InputSymbols(), new_isymbols, + fst.OutputSymbols(), new_osymbols, + RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const SymbolTable* new_isymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, fst.InputSymbols(), new_isymbols, + fst.OutputSymbols(), new_osymbols, opts)) {} + + RelabelFst(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols) + : ImplToFst(new Impl(fst, old_isymbols, new_isymbols, old_osymbols, + new_osymbols, RelabelFstOptions())) {} + + RelabelFst(const Fst& fst, + const SymbolTable* old_isymbols, + const SymbolTable* new_isymbols, + const SymbolTable* old_osymbols, + const SymbolTable* new_osymbols, + const RelabelFstOptions &opts) + : ImplToFst(new Impl(fst, old_isymbols, new_isymbols, old_osymbols, + new_osymbols, opts)) {} + + // See Fst<>::Copy() for doc. + RelabelFst(const RelabelFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this RelabelFst. See Fst<>::Copy() for further doc. + virtual RelabelFst *Copy(bool safe = false) const { + return new RelabelFst(*this, safe); + } + + virtual void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + return GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RelabelFst &fst); // disallow +}; + +// Specialization for RelabelFst. +template +class StateIterator< RelabelFst > : public StateIteratorBase { + public: + typedef typename A::StateId StateId; + + explicit StateIterator(const RelabelFst &fst) + : impl_(fst.GetImpl()), siter_(*impl_->fst_), s_(0) {} + + bool Done() const { return siter_.Done(); } + + StateId Value() const { return s_; } + + void Next() { + if (!siter_.Done()) { + ++s_; + siter_.Next(); + } + } + + void Reset() { + s_ = 0; + siter_.Reset(); + } + + private: + bool Done_() const { return Done(); } + StateId Value_() const { return Value(); } + void Next_() { Next(); } + void Reset_() { Reset(); } + + const RelabelFstImpl *impl_; + StateIterator< Fst > siter_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for RelabelFst. +template +class ArcIterator< RelabelFst > + : public CacheArcIterator< RelabelFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RelabelFst &fst, StateId s) + : CacheArcIterator< RelabelFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +template inline +void RelabelFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< RelabelFst >(*this); +} + +// Useful alias when using StdArc. +typedef RelabelFst StdRelabelFst; + +} // namespace fst + +#endif // FST_LIB_RELABEL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/replace-util.h b/extlibs/openfstwin-1.3.1/include/fst/replace-util.h new file mode 100755 index 00000000000..8478af0e754 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/replace-util.h @@ -0,0 +1,550 @@ +// replace-util.h + + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// + +// \file +// Utility classes for the recursive replacement of Fsts (RTNs). + +#ifndef FST_LIB_REPLACE_UTIL_H__ +#define FST_LIB_REPLACE_UTIL_H__ + +#include +using std::vector; +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include + +#include +#include +#include + + +namespace fst { + +template +void Replace(const vector* > >&, + MutableFst *, typename Arc::Label, bool); + + +// Utility class for the recursive replacement of Fsts (RTNs). The +// user provides a set of Label, Fst pairs at construction. These are +// used by methods for testing cyclic dependencies and connectedness +// and doing RTN connection and specific Fst replacement by label or +// for various optimization properties. The modified results can be +// obtained with the GetFstPairs() or GetMutableFstPairs() methods. +template +class ReplaceUtil { + public: + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + typedef pair*> FstPair; + typedef pair*> MutableFstPair; + typedef unordered_map NonTerminalHash; + + // Constructs from mutable Fsts; Fst ownership given to ReplaceUtil. + ReplaceUtil(const vector &fst_pairs, + Label root_label, bool epsilon_on_replace = false); + + // Constructs from Fsts; Fst ownership retained by caller. + ReplaceUtil(const vector &fst_pairs, + Label root_label, bool epsilon_on_replace = false); + + // Constructs from ReplaceFst internals; ownership retained by caller. + ReplaceUtil(const vector *> &fst_array, + const NonTerminalHash &nonterminal_hash, Label root_fst, + bool epsilon_on_replace = false); + + ~ReplaceUtil() { + for (Label i = 0; i < fst_array_.size(); ++i) + delete fst_array_[i]; + } + + // True if the non-terminal dependencies are cyclic. Cyclic + // dependencies will result in an unexpandable replace fst. + bool CyclicDependencies() const { + GetDependencies(false); + return depprops_ & kCyclic; + } + + // Returns true if no useless Fsts, states or transitions. + bool Connected() const { + GetDependencies(false); + uint64 props = kAccessible | kCoAccessible; + for (Label i = 0; i < fst_array_.size(); ++i) { + if (!fst_array_[i]) + continue; + if (fst_array_[i]->Properties(props, true) != props || !depaccess_[i]) + return false; + } + return true; + } + + // Removes useless Fsts, states and transitions. + void Connect(); + + // Replaces Fsts specified by labels. + // Does nothing if there are cyclic dependencies. + void ReplaceLabels(const vector { + friend class ReplaceFstMatcher; + + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::InputSymbols; + using FstImpl::OutputSymbols; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef A Arc; + typedef unordered_map NonTerminalHash; + + typedef T StateTable; + typedef typename T::PrefixId PrefixId; + typedef ReplaceStateTuple StateTuple; + + // constructor for replace class implementation. + // \param fst_tuples array of label/fst tuples, one for each non-terminal + ReplaceFstImpl(const vector< pair* > >& fst_tuples, + const ReplaceFstOptions &opts) + : CacheImpl(opts), + epsilon_on_replace_(opts.epsilon_on_replace), + state_table_(opts.state_table ? opts.state_table : + new StateTable(fst_tuples, opts.root)) { + + SetType("replace"); + + if (fst_tuples.size() > 0) { + SetInputSymbols(fst_tuples[0].second->InputSymbols()); + SetOutputSymbols(fst_tuples[0].second->OutputSymbols()); + } + + bool all_negative = true; // all nonterminals are negative? + bool dense_range = true; // all nonterminals are positive + // and form a dense range containing 1? + for (size_t i = 0; i < fst_tuples.size(); ++i) { + Label nonterminal = fst_tuples[i].first; + if (nonterminal >= 0) + all_negative = false; + if (nonterminal > fst_tuples.size() || nonterminal <= 0) + dense_range = false; + } + + vector inprops; + bool all_ilabel_sorted = true; + bool all_olabel_sorted = true; + bool all_non_empty = true; + fst_array_.push_back(0); + for (size_t i = 0; i < fst_tuples.size(); ++i) { + Label label = fst_tuples[i].first; + const Fst *fst = fst_tuples[i].second; + nonterminal_hash_[label] = fst_array_.size(); + nonterminal_set_.insert(label); + fst_array_.push_back(opts.take_ownership ? fst : fst->Copy()); + if (fst->Start() == kNoStateId) + all_non_empty = false; + if(!fst->Properties(kILabelSorted, false)) + all_ilabel_sorted = false; + if(!fst->Properties(kOLabelSorted, false)) + all_olabel_sorted = false; + inprops.push_back(fst->Properties(kCopyProperties, false)); + if (i) { + if (!CompatSymbols(InputSymbols(), fst->InputSymbols())) { + FSTERROR() << "ReplaceFstImpl: input symbols of Fst " << i + << " does not match input symbols of base Fst (0'th fst)"; + SetProperties(kError, kError); + } + if (!CompatSymbols(OutputSymbols(), fst->OutputSymbols())) { + FSTERROR() << "ReplaceFstImpl: output symbols of Fst " << i + << " does not match output symbols of base Fst " + << "(0'th fst)"; + SetProperties(kError, kError); + } + } + } + Label nonterminal = nonterminal_hash_[opts.root]; + if ((nonterminal == 0) && (fst_array_.size() > 1)) { + FSTERROR() << "ReplaceFstImpl: no Fst corresponding to root label '" + << opts.root << "' in the input tuple vector"; + SetProperties(kError, kError); + } + root_ = (nonterminal > 0) ? nonterminal : 1; + + SetProperties(ReplaceProperties(inprops, root_ - 1, epsilon_on_replace_, + all_non_empty)); + // We assume that all terminals are positive. The resulting + // ReplaceFst is known to be kILabelSorted when all sub-FSTs are + // kILabelSorted and one of the 3 following conditions is satisfied: + // 1. 'epsilon_on_replace' is false, or + // 2. all non-terminals are negative, or + // 3. all non-terninals are positive and form a dense range containing 1. + if (all_ilabel_sorted && + (!epsilon_on_replace_ || all_negative || dense_range)) + SetProperties(kILabelSorted, kILabelSorted); + // Similarly, the resulting ReplaceFst is known to be + // kOLabelSorted when all sub-FSTs are kOLabelSorted and one of + // the 2 following conditions is satisfied: + // 1. all non-terminals are negative, or + // 2. all non-terninals are positive and form a dense range containing 1. + if (all_olabel_sorted && (all_negative || dense_range)) + SetProperties(kOLabelSorted, kOLabelSorted); + + // Enable optional caching as long as sorted and all non empty. + if (Properties(kILabelSorted | kOLabelSorted) && all_non_empty) + always_cache_ = false; + else + always_cache_ = true; + VLOG(2) << "ReplaceFstImpl::ReplaceFstImpl: always_cache = " + << (always_cache_ ? "true" : "false"); + } + + ReplaceFstImpl(const ReplaceFstImpl& impl) + : CacheImpl(impl), + epsilon_on_replace_(impl.epsilon_on_replace_), + always_cache_(impl.always_cache_), + state_table_(new StateTable(*(impl.state_table_))), + nonterminal_set_(impl.nonterminal_set_), + nonterminal_hash_(impl.nonterminal_hash_), + root_(impl.root_) { + SetType("replace"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + fst_array_.reserve(impl.fst_array_.size()); + fst_array_.push_back(0); + for (size_t i = 1; i < impl.fst_array_.size(); ++i) { + fst_array_.push_back(impl.fst_array_[i]->Copy(true)); + } + } + + ~ReplaceFstImpl() { + VLOG(2) << "~ReplaceFstImpl: gc = " + << (CacheImpl::GetCacheGc() ? "true" : "false") + << ", gc_size = " << CacheImpl::GetCacheSize() + << ", gc_limit = " << CacheImpl::GetCacheLimit(); + + delete state_table_; + for (size_t i = 1; i < fst_array_.size(); ++i) { + delete fst_array_[i]; + } + } + + // Computes the dependency graph of the replace class and returns + // true if the dependencies are cyclic. Cyclic dependencies will result + // in an un-expandable replace fst. + bool CyclicDependencies() const { + ReplaceUtil replace_util(fst_array_, nonterminal_hash_, root_); + return replace_util.CyclicDependencies(); + } + + // Return or compute start state of replace fst + StateId Start() { + if (!HasStart()) { + if (fst_array_.size() == 1) { // no fsts defined for replace + SetStart(kNoStateId); + return kNoStateId; + } else { + const Fst* fst = fst_array_[root_]; + StateId fst_start = fst->Start(); + if (fst_start == kNoStateId) // root Fst is empty + return kNoStateId; + + PrefixId prefix = GetPrefixId(StackPrefix()); + StateId start = state_table_->FindState( + StateTuple(prefix, root_, fst_start)); + SetStart(start); + return start; + } + } else { + return CacheImpl::Start(); + } + } + + // return final weight of state (kInfWeight means state is not final) + Weight Final(StateId s) { + if (!HasFinal(s)) { + const StateTuple& tuple = state_table_->Tuple(s); + const StackPrefix& stack = stackprefix_array_[tuple.prefix_id]; + const Fst* fst = fst_array_[tuple.fst_id]; + StateId fst_state = tuple.fst_state; + + if (fst->Final(fst_state) != Weight::Zero() && stack.Depth() == 0) + SetFinal(s, fst->Final(fst_state)); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (HasArcs(s)) { // If state cached, use the cached value. + return CacheImpl::NumArcs(s); + } else if (always_cache_) { // If always caching, expand and cache state. + Expand(s); + return CacheImpl::NumArcs(s); + } else { // Otherwise compute the number of arcs without expanding. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num_arcs = fst->NumArcs(tuple.fst_state); + if (ComputeFinalArc(tuple, 0)) + num_arcs++; + + return num_arcs; + } + } + + // Returns whether a given label is a non terminal + bool IsNonTerminal(Label l) const { + // TODO(allauzen): be smarter and take advantage of + // all_dense or all_negative. + // Use also in ComputeArc, this would require changes to replace + // so that recursing into an empty fst lead to a non co-accessible + // state instead of deleting the arc as done currently. + // Current use correct, since i/olabel sorted iff all_non_empty. + typename NonTerminalHash::const_iterator it = + nonterminal_hash_.find(l); + return it != nonterminal_hash_.end(); + } + + size_t NumInputEpsilons(StateId s) { + if (HasArcs(s)) { + // If state cached, use the cached value. + return CacheImpl::NumInputEpsilons(s); + } else if (always_cache_ || !Properties(kILabelSorted)) { + // If always caching or if the number of input epsilons is too expensive + // to compute without caching (i.e. not ilabel sorted), + // then expand and cache state. + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } else { + // Otherwise, compute the number of input epsilons without caching. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num = 0; + if (!epsilon_on_replace_) { + // If epsilon_on_replace is false, all input epsilon arcs + // are also input epsilons arcs in the underlying machine. + fst->NumInputEpsilons(tuple.fst_state); + } else { + // Otherwise, one need to consider that all non-terminal arcs + // in the underlying machine also become input epsilon arc. + ArcIterator > aiter(*fst, tuple.fst_state); + for (; !aiter.Done() && + ((aiter.Value().ilabel == 0) || + IsNonTerminal(aiter.Value().olabel)); + aiter.Next()) + ++num; + } + if (ComputeFinalArc(tuple, 0)) + num++; + return num; + } + } + + size_t NumOutputEpsilons(StateId s) { + if (HasArcs(s)) { + // If state cached, use the cached value. + return CacheImpl::NumOutputEpsilons(s); + } else if(always_cache_ || !Properties(kOLabelSorted)) { + // If always caching or if the number of output epsilons is too expensive + // to compute without caching (i.e. not olabel sorted), + // then expand and cache state. + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } else { + // Otherwise, compute the number of output epsilons without caching. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num = 0; + ArcIterator > aiter(*fst, tuple.fst_state); + for (; !aiter.Done() && + ((aiter.Value().olabel == 0) || + IsNonTerminal(aiter.Value().olabel)); + aiter.Next()) + ++num; + if (ComputeFinalArc(tuple, 0)) + num++; + return num; + } + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if (mask & kError) { + for (size_t i = 1; i < fst_array_.size(); ++i) { + if (fst_array_[i]->Properties(kError, false)) + SetProperties(kError, kError); + } + } + return FstImpl::Properties(mask); + } + + // return the base arc iterator, if arcs have not been computed yet, + // extend/recurse for new arcs. + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + // TODO(allauzen): Set behaviour of generic iterator + // Warning: ArcIterator >::InitCache() + // relies on current behaviour. + } + + + // Extend current state (walk arcs one level deep) + void Expand(StateId s) { + StateTuple tuple = state_table_->Tuple(s); + + // If local fst is empty + if (tuple.fst_state == kNoStateId) { + SetArcs(s); + return; + } + + ArcIterator< Fst > aiter( + *(fst_array_[tuple.fst_id]), tuple.fst_state); + Arc arc; + + // Create a final arc when needed + if (ComputeFinalArc(tuple, &arc)) + PushArc(s, arc); + + // Expand all arcs leaving the state + for (;!aiter.Done(); aiter.Next()) { + if (ComputeArc(tuple, aiter.Value(), &arc)) + PushArc(s, arc); + } + + SetArcs(s); + } + + void Expand(StateId s, const StateTuple &tuple, + const ArcIteratorData &data) { + // If local fst is empty + if (tuple.fst_state == kNoStateId) { + SetArcs(s); + return; + } + + ArcIterator< Fst > aiter(data); + Arc arc; + + // Create a final arc when needed + if (ComputeFinalArc(tuple, &arc)) + AddArc(s, arc); + + // Expand all arcs leaving the state + for (; !aiter.Done(); aiter.Next()) { + if (ComputeArc(tuple, aiter.Value(), &arc)) + AddArc(s, arc); + } + + SetArcs(s); + } + + // If arcp == 0, only returns if a final arc is required, does not + // actually compute it. + bool ComputeFinalArc(const StateTuple &tuple, A* arcp, + uint32 flags = kArcValueFlags) { + const Fst* fst = fst_array_[tuple.fst_id]; + StateId fst_state = tuple.fst_state; + if (fst_state == kNoStateId) + return false; + + // if state is final, pop up stack + const StackPrefix& stack = stackprefix_array_[tuple.prefix_id]; + if (fst->Final(fst_state) != Weight::Zero() && stack.Depth()) { + if (arcp) { + arcp->ilabel = 0; + arcp->olabel = 0; + if (flags & kArcNextStateValue) { + PrefixId prefix_id = PopPrefix(stack); + const PrefixTuple& top = stack.Top(); + arcp->nextstate = state_table_->FindState( + StateTuple(prefix_id, top.fst_id, top.nextstate)); + } + if (flags & kArcWeightValue) + arcp->weight = fst->Final(fst_state); + } + return true; + } else { + return false; + } + } + + // Compute the arc in the replace fst corresponding to a given + // in the underlying machine. Returns false if the underlying arc + // corresponds to no arc in the replace. + bool ComputeArc(const StateTuple &tuple, const A &arc, A* arcp, + uint32 flags = kArcValueFlags) { + if (!epsilon_on_replace_ && + (flags == (flags & (kArcILabelValue | kArcWeightValue)))) { + *arcp = arc; + return true; + } + + if (arc.olabel == 0) { // expand local fst + StateId nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate)) + : kNoStateId; + *arcp = A(arc.ilabel, arc.olabel, arc.weight, nextstate); + } else { + // check for non terminal + typename NonTerminalHash::const_iterator it = + nonterminal_hash_.find(arc.olabel); + if (it != nonterminal_hash_.end()) { // recurse into non terminal + Label nonterminal = it->second; + const Fst* nt_fst = fst_array_[nonterminal]; + PrefixId nt_prefix = PushPrefix(stackprefix_array_[tuple.prefix_id], + tuple.fst_id, arc.nextstate); + + // if start state is valid replace, else arc is implicitly + // deleted + StateId nt_start = nt_fst->Start(); + if (nt_start != kNoStateId) { + StateId nt_nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(nt_prefix, nonterminal, nt_start)) + : kNoStateId; + Label ilabel = (epsilon_on_replace_) ? 0 : arc.ilabel; + *arcp = A(ilabel, 0, arc.weight, nt_nextstate); + } else { + return false; + } + } else { + StateId nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate)) + : kNoStateId; + *arcp = A(arc.ilabel, arc.olabel, arc.weight, nextstate); + } + } + return true; + } + + // Returns the arc iterator flags supported by this Fst. + uint32 ArcIteratorFlags() const { + uint32 flags = kArcValueFlags; + if (!always_cache_) + flags |= kArcNoCache; + return flags; + } + + T* GetStateTable() const { + return state_table_; + } + + const Fst* GetFst(Label fst_id) const { + return fst_array_[fst_id]; + } + + bool EpsilonOnReplace() const { return epsilon_on_replace_; } + + // private helper classes + private: + static const size_t kPrime0; + + // \class PrefixTuple + // \brief Tuple of fst_id and destination state (entry in stack prefix) + struct PrefixTuple { + PrefixTuple(Label f, StateId s) : fst_id(f), nextstate(s) {} + + Label fst_id; + StateId nextstate; + }; + + // \class StackPrefix + // \brief Container for stack prefix. + class StackPrefix { + public: + StackPrefix() {} + + // copy constructor + StackPrefix(const StackPrefix& x) : + prefix_(x.prefix_) { + } + + void Push(StateId fst_id, StateId nextstate) { + prefix_.push_back(PrefixTuple(fst_id, nextstate)); + } + + void Pop() { + prefix_.pop_back(); + } + + const PrefixTuple& Top() const { + return prefix_[prefix_.size()-1]; + } + + size_t Depth() const { + return prefix_.size(); + } + + public: + vector prefix_; + }; + + + // \class StackPrefixEqual + // \brief Compare two stack prefix classes for equality + class StackPrefixEqual { + public: + bool operator()(const StackPrefix& x, const StackPrefix& y) const { + if (x.prefix_.size() != y.prefix_.size()) return false; + for (size_t i = 0; i < x.prefix_.size(); ++i) { + if (x.prefix_[i].fst_id != y.prefix_[i].fst_id || + x.prefix_[i].nextstate != y.prefix_[i].nextstate) return false; + } + return true; + } + }; + + // + // \class StackPrefixKey + // \brief Hash function for stack prefix to prefix id + class StackPrefixKey { + public: + size_t operator()(const StackPrefix& x) const { + size_t sum = 0; + for (size_t i = 0; i < x.prefix_.size(); ++i) { + sum += x.prefix_[i].fst_id + x.prefix_[i].nextstate*kPrime0; + } + return sum; + } + }; + + typedef unordered_map + StackPrefixHash; + + // private methods + private: + // hash stack prefix (return unique index into stackprefix array) + PrefixId GetPrefixId(const StackPrefix& prefix) { + typename StackPrefixHash::iterator it = prefix_hash_.find(prefix); + if (it == prefix_hash_.end()) { + PrefixId prefix_id = stackprefix_array_.size(); + stackprefix_array_.push_back(prefix); + prefix_hash_[prefix] = prefix_id; + return prefix_id; + } else { + return it->second; + } + } + + // prefix id after a stack pop + PrefixId PopPrefix(StackPrefix prefix) { + prefix.Pop(); + return GetPrefixId(prefix); + } + + // prefix id after a stack push + PrefixId PushPrefix(StackPrefix prefix, Label fst_id, StateId nextstate) { + prefix.Push(fst_id, nextstate); + return GetPrefixId(prefix); + } + + + // private data + private: + // runtime options + bool epsilon_on_replace_; + bool always_cache_; // Optionally caching arc iterator disabled when true + + // state table + StateTable *state_table_; + + // cross index of unique stack prefix + // could potentially have one copy of prefix array + StackPrefixHash prefix_hash_; + vector stackprefix_array_; + + set > +// The ReplaceFst need to be built such that it is known to be ilabel +// or olabel sorted (see usage below). +// +// Observe that Matcher > will use the optionally caching arc +// iterator when available (Fst is ilabel sorted and matching on the +// input, or Fst is olabel sorted and matching on the output). +// In order to obtain the most efficient behaviour, it is recommended +// to set 'epsilon_on_replace' to false (this means constructing acceptors +// as transducers with epsilons on the input side of nonterminal arcs) +// and matching on the input side. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template > +class ReplaceFst : public ImplToFst< ReplaceFstImpl > { + public: + friend class ArcIterator< ReplaceFst >; + friend class StateIterator< ReplaceFst >; + friend class ReplaceFstMatcher; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef ReplaceFstImpl Impl; + + using ImplToFst::Properties; + + ReplaceFst(const vector* > >& fst_array, + Label root) + : ImplToFst(new Impl(fst_array, ReplaceFstOptions(root))) {} + + ReplaceFst(const vector* > >& fst_array, + const ReplaceFstOptions &opts) + : ImplToFst(new Impl(fst_array, opts)) {} + + // See Fst<>::Copy() for doc. + ReplaceFst(const ReplaceFst& fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ReplaceFst. See Fst<>::Copy() for further doc. + virtual ReplaceFst *Copy(bool safe = false) const { + return new ReplaceFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + virtual MatcherBase *InitMatcher(MatchType match_type) const { + if ((GetImpl()->ArcIteratorFlags() & kArcNoCache) && + ((match_type == MATCH_INPUT && Properties(kILabelSorted, false)) || + (match_type == MATCH_OUTPUT && Properties(kOLabelSorted, false)))) { + return new ReplaceFstMatcher(*this, match_type); + } + else { + VLOG(2) << "Not using replace matcher"; + return 0; + } + } + + bool CyclicDependencies() const { + return GetImpl()->CyclicDependencies(); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ReplaceFst &fst); // disallow +}; + + +// Specialization for ReplaceFst. +template +class StateIterator< ReplaceFst > + : public CacheStateIterator< ReplaceFst > { + public: + explicit StateIterator(const ReplaceFst &fst) + : CacheStateIterator< ReplaceFst >(fst, fst.GetImpl()) {} + + private: + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ReplaceFst. +// Implements optional caching. It can be used as follows: +// +// ReplaceFst replace; +// ArcIterator< ReplaceFst > aiter(replace, s); +// // Note: ArcIterator< Fst > is always a caching arc iterator. +// aiter.SetFlags(kArcNoCache, kArcNoCache); +// // Use the arc iterator, no arc will be cached, no state will be expanded. +// // The varied 'kArcValueFlags' can be used to decide which part +// // of arc values needs to be computed. +// aiter.SetFlags(kArcILabelValue, kArcValueFlags); +// // Only want the ilabel for this arc +// aiter.Value(); // Does not compute the destination state. +// aiter.Next(); +// aiter.SetFlags(kArcNextStateValue, kArcNextStateValue); +// // Want both ilabel and nextstate for that arc +// aiter.Value(); // Does compute the destination state and inserts it +// // in the replace state table. +// // No Arc has been cached at that point. +// +template +class ArcIterator< ReplaceFst > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + ArcIterator(const ReplaceFst &fst, StateId s) + : fst_(fst), state_(s), pos_(0), offset_(0), flags_(0), arcs_(0), + data_flags_(0), final_flags_(0) { + cache_data_.ref_count = 0; + local_data_.ref_count = 0; + + // If FST does not support optional caching, force caching. + if(!(fst_.GetImpl()->ArcIteratorFlags() & kArcNoCache) && + !(fst_.GetImpl()->HasArcs(state_))) + fst_.GetImpl()->Expand(state_); + + // If state is already cached, use cached arcs array. + if (fst_.GetImpl()->HasArcs(state_)) { + + #ifdef _MSC_VER //ChangedPD + (fst_.GetImpl())->CacheImpl::InitArcIterator(state_, + &cache_data_); + #else + (fst_.GetImpl())->template CacheImpl::InitArcIterator(state_, + &cache_data_); + #endif + num_arcs_ = cache_data_.narcs; + arcs_ = cache_data_.arcs; // 'arcs_' is a ptr to the cached arcs. + data_flags_ = kArcValueFlags; // All the arc member values are valid. + } else { // Otherwise delay decision until Value() is called. + tuple_ = fst_.GetImpl()->GetStateTable()->Tuple(state_); + if (tuple_.fst_state == kNoStateId) { + num_arcs_ = 0; + } else { + // The decision to cache or not to cache has been defered + // until Value() or SetFlags() is called. However, the arc + // iterator is set up now to be ready for non-caching in order + // to keep the Value() method simple and efficient. + const Fst* fst = fst_.GetImpl()->GetFst(tuple_.fst_id); + fst->InitArcIterator(tuple_.fst_state, &local_data_); + // 'arcs_' is a pointer to the arcs in the underlying machine. + arcs_ = local_data_.arcs; + // Compute the final arc (but not its destination state) + // if a final arc is required. + bool has_final_arc = fst_.GetImpl()->ComputeFinalArc( + tuple_, + &final_arc_, + kArcValueFlags & ~kArcNextStateValue); + // Set the arc value flags that hold for 'final_arc_'. + final_flags_ = kArcValueFlags & ~kArcNextStateValue; + // Compute the number of arcs. + num_arcs_ = local_data_.narcs; + if (has_final_arc) + ++num_arcs_; + // Set the offset between the underlying arc positions and + // the positions in the arc iterator. + offset_ = num_arcs_ - local_data_.narcs; + // Defers the decision to cache or not until Value() or + // SetFlags() is called. + data_flags_ = 0; + } + } + } + + ~ArcIterator() { + if (cache_data_.ref_count) + --(*cache_data_.ref_count); + if (local_data_.ref_count) + --(*local_data_.ref_count); + } + + void ExpandAndCache() const { + // TODO(allauzen): revisit this + // fst_.GetImpl()->Expand(state_, tuple_, local_data_); + // (fst_.GetImpl())->CacheImpl*>::InitArcIterator(state_, + // &cache_data_); + // + fst_.InitArcIterator(state_, &cache_data_); // Expand and cache state. + arcs_ = cache_data_.arcs; // 'arcs_' is a pointer to the cached arcs. + data_flags_ = kArcValueFlags; // All the arc member values are valid. + offset_ = 0; // No offset + + } + + void Init() { + if (flags_ & kArcNoCache) { // If caching is disabled + // 'arcs_' is a pointer to the arcs in the underlying machine. + arcs_ = local_data_.arcs; + // Set the arcs value flags that hold for 'arcs_'. + data_flags_ = kArcWeightValue; + if (!fst_.GetImpl()->EpsilonOnReplace()) + data_flags_ |= kArcILabelValue; + // Set the offset between the underlying arc positions and + // the positions in the arc iterator. + offset_ = num_arcs_ - local_data_.narcs; + } else { // Otherwise, expand and cache + ExpandAndCache(); + } + } + + bool Done() const { return pos_ >= num_arcs_; } + + const A& Value() const { + // If 'data_flags_' was set to 0, non-caching was not requested + if (!data_flags_) { + // TODO(allauzen): revisit this. + if (flags_ & kArcNoCache) { + // Should never happen. + FSTERROR() << "ReplaceFst: inconsistent arc iterator flags"; + } + ExpandAndCache(); // Expand and cache. + } + + if (pos_ - offset_ >= 0) { // The requested arc is not the 'final' arc. + const A& arc = arcs_[pos_ - offset_]; + if ((data_flags_ & flags_) == (flags_ & kArcValueFlags)) { + // If the value flags for 'arc' match the recquired value flags + // then return 'arc'. + return arc; + } else { + // Otherwise, compute the corresponding arc on-the-fly. + fst_.GetImpl()->ComputeArc(tuple_, arc, &arc_, flags_ & kArcValueFlags); + return arc_; + } + } else { // The requested arc is the 'final' arc. + if ((final_flags_ & flags_) != (flags_ & kArcValueFlags)) { + // If the arc value flags that hold for the final arc + // do not match the requested value flags, then + // 'final_arc_' needs to be updated. + fst_.GetImpl()->ComputeFinalArc(tuple_, &final_arc_, + flags_ & kArcValueFlags); + final_flags_ = flags_ & kArcValueFlags; + } + return final_arc_; + } + } + + void Next() { ++pos_; } + + size_t Position() const { return pos_; } + + void Reset() { pos_ = 0; } + + void Seek(size_t pos) { pos_ = pos; } + + uint32 Flags() const { return flags_; } + + void SetFlags(uint32 f, uint32 mask) { + // Update the flags taking into account what flags are supported + // by the Fst. + flags_ &= ~mask; + flags_ |= (f & fst_.GetImpl()->ArcIteratorFlags()); + // If non-caching is not requested (and caching has not already + // been performed), then flush 'data_flags_' to request caching + // during the next call to Value(). + if (!(flags_ & kArcNoCache) && data_flags_ != kArcValueFlags) { + if (!fst_.GetImpl()->HasArcs(state_)) + data_flags_ = 0; + } + // If 'data_flags_' has been flushed but non-caching is requested + // before calling Value(), then set up the iterator for non-caching. + if ((f & kArcNoCache) && (!data_flags_)) + Init(); + } + + private: + const ReplaceFst &fst_; // Reference to the FST + StateId state_; // State in the FST + mutable typename T::StateTuple tuple_; // Tuple corresponding to state_ + + ssize_t pos_; // Current position + mutable ssize_t offset_; // Offset between position in iterator and in arcs_ + ssize_t num_arcs_; // Number of arcs at state_ + uint32 flags_; // Behavorial flags for the arc iterator + mutable Arc arc_; // Memory to temporarily store computed arcs + + mutable ArcIteratorData cache_data_; // Arc iterator data in cache + mutable ArcIteratorData local_data_; // Arc iterator data in local fst + + mutable const A* arcs_; // Array of arcs + mutable uint32 data_flags_; // Arc value flags valid for data in arcs_ + mutable Arc final_arc_; // Final arc (when required) + mutable uint32 final_flags_; // Arc value flags valid for final_arc_ + + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template +class ReplaceFstMatcher : public MatcherBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef MultiEpsMatcher > > LocalMatcher; + + ReplaceFstMatcher(const ReplaceFst &fst, fst::MatchType match_type) + : fst_(fst), + impl_(fst_.GetImpl()), + s_(fst::kNoStateId), + match_type_(match_type), + current_loop_(false), + final_arc_(false), + loop_(fst::kNoLabel, 0, A::Weight::One(), fst::kNoStateId) { + if (match_type_ == fst::MATCH_OUTPUT) + swap(loop_.ilabel, loop_.olabel); + InitMatchers(); + } + + ReplaceFstMatcher(const ReplaceFstMatcher &matcher, bool safe = false) + : fst_(matcher.fst_), + impl_(fst_.GetImpl()), + s_(fst::kNoStateId), + match_type_(matcher.match_type_), + current_loop_(false), + loop_(fst::kNoLabel, 0, A::Weight::One(), fst::kNoStateId) { + if (match_type_ == fst::MATCH_OUTPUT) + swap(loop_.ilabel, loop_.olabel); + InitMatchers(); + } + + // Create a local matcher for each component Fst of replace. + // LocalMatcher is a multi epsilon wrapper matcher. MultiEpsilonMatcher + // is used to match each non-terminal arc, since these non-terminal + // turn into epsilons on recursion. + void InitMatchers() { + const vector*>& fst_array = impl_->fst_array_; + matcher_.resize(fst_array.size(), 0); + for (size_t i = 0; i < fst_array.size(); ++i) { + if (fst_array[i]) { + matcher_[i] = + new LocalMatcher(*fst_array[i], match_type_, kMultiEpsList); + + typename set &GetFst() const { + return fst_; + } + + virtual uint64 Properties(uint64 props) const { + return props; + } + + private: + // Set the sate from which our matching happens. + virtual void SetState_(StateId s) { + if (s_ == s) return; + + s_ = s; + tuple_ = impl_->GetStateTable()->Tuple(s_); + if (tuple_.fst_state == kNoStateId) { + done_ = true; + return; + } + // Get current matcher. Used for non epsilon matching + current_matcher_ = matcher_[tuple_.fst_id]; + current_matcher_->SetState(tuple_.fst_state); + loop_.nextstate = s_; + + final_arc_ = false; + } + + // Search for label, from previous set state. If label == 0, first + // hallucinate and epsilon loop, else use the underlying matcher to + // search for the label or epsilons. + // - Note since the ReplaceFST recursion on non-terminal arcs causes + // epsilon transitions to be created we use the MultiEpsilonMatcher + // to search for possible matches of non terminals. + // - If the component Fst reaches a final state we also need to add + // the exiting final arc. + virtual bool Find_(Label label) { + bool found = false; + label_ = label; + if (label_ == 0 || label_ == kNoLabel) { + // Compute loop directly, saving Replace::ComputeArc + if (label_ == 0) { + current_loop_ = true; + found = true; + } + // Search for matching multi epsilons + final_arc_ = impl_->ComputeFinalArc(tuple_, 0); + found = current_matcher_->Find(kNoLabel) || final_arc_ || found; + } else { + // Search on sub machine directly using sub machine matcher. + found = current_matcher_->Find(label_); + } + return found; + } + + virtual bool Done_() const { + return !current_loop_ && !final_arc_ && current_matcher_->Done(); + } + + virtual const Arc& Value_() const { + if (current_loop_) { + return loop_; + } + if (final_arc_) { + impl_->ComputeFinalArc(tuple_, &arc_); + return arc_; + } + const Arc& component_arc = current_matcher_->Value(); + impl_->ComputeArc(tuple_, component_arc, &arc_); + return arc_; + } + + virtual void Next_() { + if (current_loop_) { + current_loop_ = false; + return; + } + if (final_arc_) { + final_arc_ = false; + return; + } + current_matcher_->Next(); + } + + const ReplaceFst& fst_; + ReplaceFstImpl *impl_; + LocalMatcher* current_matcher_; + vector matcher_; + + StateId s_; // Current state + Label label_; // Current label + + MatchType match_type_; // Supplied by caller + mutable bool done_; + mutable bool current_loop_; // Current arc is the implicit loop + mutable bool final_arc_; // Current arc for exiting recursion + mutable typename T::StateTuple tuple_; // Tuple corresponding to state_ + mutable Arc arc_; + Arc loop_; +}; + +template inline +void ReplaceFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< ReplaceFst >(*this); +} + +typedef ReplaceFst StdReplaceFst; + + +// // Recursivively replaces arcs in the root Fst with other Fsts. +// This version writes the result of replacement to an output MutableFst. +// +// Replace supports replacement of arcs in one Fst with another +// Fst. This replacement is recursive. Replace takes an array of +// Fst(s). One Fst represents the root (or topology) machine. The root +// Fst refers to other Fsts by recursively replacing arcs labeled as +// non-terminals with the matching non-terminal Fst. Currently Replace +// uses the output symbols of the arcs to determine whether the arc is +// a non-terminal arc or not. A non-terminal can be any label that is +// not a non-zero terminal label in the output alphabet. Note that +// input argument is a vector of pair<>. These correspond to the tuple +// of non-terminal Label and corresponding Fst. +template +void Replace(const vector* > >& ifst_array, + MutableFst *ofst, typename Arc::Label root, + bool epsilon_on_replace) { + ReplaceFstOptions opts(root, epsilon_on_replace); + opts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ReplaceFst(ifst_array, opts); +} + +template +void Replace(const vector* > >& ifst_array, + MutableFst *ofst, typename Arc::Label root) { + Replace(ifst_array, ofst, root, false); +} + +} // namespace fst + +#endif // FST_LIB_REPLACE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/replace.h.bak b/extlibs/openfstwin-1.3.1/include/fst/replace.h.bak new file mode 100755 index 00000000000..ef5f6ccb8ea --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/replace.h.bak @@ -0,0 +1,1453 @@ +// replace.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Functions and classes for the recursive replacement of Fsts. +// + +#ifndef FST_LIB_REPLACE_H__ +#define FST_LIB_REPLACE_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include +#include +#include +#include + +namespace fst { + +// +// REPLACE STATE TUPLES AND TABLES +// +// The replace state table has the form +// +// template +// class ReplaceStateTable { +// public: +// typedef A Arc; +// typedef P PrefixId; +// typedef typename A::StateId StateId; +// typedef ReplaceStateTuple StateTuple; +// typedef typename A::Label Label; +// +// // Required constuctor +// ReplaceStateTable(const vector*> > &fst_tuples, +// Label root); +// +// // Required copy constructor that does not copy state +// ReplaceStateTable(const ReplaceStateTable &table); +// +// // Lookup state ID by tuple. If it doesn't exist, then add it. +// StateId FindState(const StateTuple &tuple); +// +// // Lookup state tuple by ID. +// const StateTuple &Tuple(StateId id) const; +// }; + + +// \struct ReplaceStateTuple +// \brief Tuple of information that uniquely defines a state in replace +template +struct ReplaceStateTuple { + typedef S StateId; + typedef P PrefixId; + + ReplaceStateTuple() + : prefix_id(-1), fst_id(kNoStateId), fst_state(kNoStateId) {} + + ReplaceStateTuple(PrefixId p, StateId f, StateId s) + : prefix_id(p), fst_id(f), fst_state(s) {} + + PrefixId prefix_id; // index in prefix table + StateId fst_id; // current fst being walked + StateId fst_state; // current state in fst being walked, not to be + // confused with the state_id of the combined fst +}; + + +// Equality of replace state tuples. +template +inline bool operator==(const ReplaceStateTuple& x, + const ReplaceStateTuple& y) { + return x.prefix_id == y.prefix_id && + x.fst_id == y.fst_id && + x.fst_state == y.fst_state; +} + + +// \class ReplaceRootSelector +// Functor returning true for tuples corresponding to states in the root FST +template +class ReplaceRootSelector { + public: + bool operator()(const ReplaceStateTuple &tuple) const { + return tuple.prefix_id == 0; + } +}; + + +// \class ReplaceFingerprint +// Fingerprint for general replace state tuples. +template +class ReplaceFingerprint { + public: + ReplaceFingerprint(const vector *size_array) + : cumulative_size_array_(size_array) {} + + uint64 operator()(const ReplaceStateTuple &tuple) const { + return tuple.prefix_id * (cumulative_size_array_->back()) + + cumulative_size_array_->at(tuple.fst_id - 1) + + tuple.fst_state; + } + + private: + const vector *cumulative_size_array_; +}; + + +// \class ReplaceFstStateFingerprint +// Useful when the fst_state uniquely define the tuple. +template +class ReplaceFstStateFingerprint { + public: + uint64 operator()(const ReplaceStateTuple& tuple) const { + return tuple.fst_state; + } +}; + + +// \class ReplaceHash +// A generic hash function for replace state tuples. +template +class ReplaceHash { + public: + size_t operator()(const ReplaceStateTuple& t) const { + return t.prefix_id + t.fst_id * kPrime0 + t.fst_state * kPrime1; + } + private: + static const size_t kPrime0; + static const size_t kPrime1; +}; + +template +const size_t ReplaceHash::kPrime0 = 7853; + +template +const size_t ReplaceHash::kPrime1 = 7867; + +template class ReplaceFstMatcher; + + +// \class VectorHashReplaceStateTable +// A two-level state table for replace. +// Warning: calls CountStates to compute the number of states of each +// component Fst. +template +class VectorHashReplaceStateTable { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef P PrefixId; + typedef ReplaceStateTuple StateTuple; + typedef VectorHashStateTable, + ReplaceRootSelector, + ReplaceFstStateFingerprint, + ReplaceFingerprint > StateTable; + + VectorHashReplaceStateTable( + const vector*> > &fst_tuples, + Label root) : root_size_(0) { + cumulative_size_array_.push_back(0); + for (size_t i = 0; i < fst_tuples.size(); ++i) { + if (fst_tuples[i].first == root) { + root_size_ = CountStates(*(fst_tuples[i].second)); + cumulative_size_array_.push_back(cumulative_size_array_.back()); + } else { + cumulative_size_array_.push_back(cumulative_size_array_.back() + + CountStates(*(fst_tuples[i].second))); + } + } + state_table_ = new StateTable( + new ReplaceRootSelector, + new ReplaceFstStateFingerprint, + new ReplaceFingerprint(&cumulative_size_array_), + root_size_, + root_size_ + cumulative_size_array_.back()); + } + + VectorHashReplaceStateTable(const VectorHashReplaceStateTable &table) + : root_size_(table.root_size_), + cumulative_size_array_(table.cumulative_size_array_) { + state_table_ = new StateTable( + new ReplaceRootSelector, + new ReplaceFstStateFingerprint, + new ReplaceFingerprint(&cumulative_size_array_), + root_size_, + root_size_ + cumulative_size_array_.back()); + } + + ~VectorHashReplaceStateTable() { + delete state_table_; + } + + StateId FindState(const StateTuple &tuple) { + return state_table_->FindState(tuple); + } + + const StateTuple &Tuple(StateId id) const { + return state_table_->Tuple(id); + } + + private: + StateId root_size_; + vector cumulative_size_array_; + StateTable *state_table_; +}; + + +// \class DefaultReplaceStateTable +// Default replace state table +template +class DefaultReplaceStateTable : public CompactHashStateTable< + ReplaceStateTuple, + ReplaceHash > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef P PrefixId; + typedef ReplaceStateTuple StateTuple; + typedef CompactHashStateTable > StateTable; + + using StateTable::FindState; + using StateTable::Tuple; + + DefaultReplaceStateTable( + const vector*> > &fst_tuples, + Label root) {} + + DefaultReplaceStateTable(const DefaultReplaceStateTable &table) + : StateTable() {} +}; + +// +// REPLACE FST CLASS +// + +// By default ReplaceFst will copy the input label of the 'replace arc'. +// For acceptors we do not want this behaviour. Instead we need to +// create an epsilon arc when recursing into the appropriate Fst. +// The 'epsilon_on_replace' option can be used to toggle this behaviour. +template > +struct ReplaceFstOptions : CacheOptions { + int64 root; // root rule for expansion + bool epsilon_on_replace; + bool take_ownership; // take ownership of input Fst(s) + T* state_table; + + ReplaceFstOptions(const CacheOptions &opts, int64 r) + : CacheOptions(opts), + root(r), + epsilon_on_replace(false), + take_ownership(false), + state_table(0) {} + explicit ReplaceFstOptions(int64 r) + : root(r), + epsilon_on_replace(false), + take_ownership(false), + state_table(0) {} + ReplaceFstOptions(int64 r, bool epsilon_replace_arc) + : root(r), + epsilon_on_replace(epsilon_replace_arc), + take_ownership(false), + state_table(0) {} + ReplaceFstOptions() + : root(kNoLabel), + epsilon_on_replace(false), + take_ownership(false), + state_table(0) {} +}; + + +// \class ReplaceFstImpl +// \brief Implementation class for replace class Fst +// +// The replace implementation class supports a dynamic +// expansion of a recursive transition network represented as Fst +// with dynamic replacable arcs. +// +template +class ReplaceFstImpl : public CacheImpl { + friend class ReplaceFstMatcher; + + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::WriteHeader; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::InputSymbols; + using FstImpl::OutputSymbols; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef A Arc; + typedef unordered_map NonTerminalHash; + + typedef T StateTable; + typedef typename T::PrefixId PrefixId; + typedef ReplaceStateTuple StateTuple; + + // constructor for replace class implementation. + // \param fst_tuples array of label/fst tuples, one for each non-terminal + ReplaceFstImpl(const vector< pair* > >& fst_tuples, + const ReplaceFstOptions &opts) + : CacheImpl(opts), + epsilon_on_replace_(opts.epsilon_on_replace), + state_table_(opts.state_table ? opts.state_table : + new StateTable(fst_tuples, opts.root)) { + + SetType("replace"); + + if (fst_tuples.size() > 0) { + SetInputSymbols(fst_tuples[0].second->InputSymbols()); + SetOutputSymbols(fst_tuples[0].second->OutputSymbols()); + } + + bool all_negative = true; // all nonterminals are negative? + bool dense_range = true; // all nonterminals are positive + // and form a dense range containing 1? + for (size_t i = 0; i < fst_tuples.size(); ++i) { + Label nonterminal = fst_tuples[i].first; + if (nonterminal >= 0) + all_negative = false; + if (nonterminal > fst_tuples.size() || nonterminal <= 0) + dense_range = false; + } + + vector inprops; + bool all_ilabel_sorted = true; + bool all_olabel_sorted = true; + bool all_non_empty = true; + fst_array_.push_back(0); + for (size_t i = 0; i < fst_tuples.size(); ++i) { + Label label = fst_tuples[i].first; + const Fst *fst = fst_tuples[i].second; + nonterminal_hash_[label] = fst_array_.size(); + nonterminal_set_.insert(label); + fst_array_.push_back(opts.take_ownership ? fst : fst->Copy()); + if (fst->Start() == kNoStateId) + all_non_empty = false; + if(!fst->Properties(kILabelSorted, false)) + all_ilabel_sorted = false; + if(!fst->Properties(kOLabelSorted, false)) + all_olabel_sorted = false; + inprops.push_back(fst->Properties(kCopyProperties, false)); + if (i) { + if (!CompatSymbols(InputSymbols(), fst->InputSymbols())) { + FSTERROR() << "ReplaceFstImpl: input symbols of Fst " << i + << " does not match input symbols of base Fst (0'th fst)"; + SetProperties(kError, kError); + } + if (!CompatSymbols(OutputSymbols(), fst->OutputSymbols())) { + FSTERROR() << "ReplaceFstImpl: output symbols of Fst " << i + << " does not match output symbols of base Fst " + << "(0'th fst)"; + SetProperties(kError, kError); + } + } + } + Label nonterminal = nonterminal_hash_[opts.root]; + if ((nonterminal == 0) && (fst_array_.size() > 1)) { + FSTERROR() << "ReplaceFstImpl: no Fst corresponding to root label '" + << opts.root << "' in the input tuple vector"; + SetProperties(kError, kError); + } + root_ = (nonterminal > 0) ? nonterminal : 1; + + SetProperties(ReplaceProperties(inprops, root_ - 1, epsilon_on_replace_, + all_non_empty)); + // We assume that all terminals are positive. The resulting + // ReplaceFst is known to be kILabelSorted when all sub-FSTs are + // kILabelSorted and one of the 3 following conditions is satisfied: + // 1. 'epsilon_on_replace' is false, or + // 2. all non-terminals are negative, or + // 3. all non-terninals are positive and form a dense range containing 1. + if (all_ilabel_sorted && + (!epsilon_on_replace_ || all_negative || dense_range)) + SetProperties(kILabelSorted, kILabelSorted); + // Similarly, the resulting ReplaceFst is known to be + // kOLabelSorted when all sub-FSTs are kOLabelSorted and one of + // the 2 following conditions is satisfied: + // 1. all non-terminals are negative, or + // 2. all non-terninals are positive and form a dense range containing 1. + if (all_olabel_sorted && (all_negative || dense_range)) + SetProperties(kOLabelSorted, kOLabelSorted); + + // Enable optional caching as long as sorted and all non empty. + if (Properties(kILabelSorted | kOLabelSorted) && all_non_empty) + always_cache_ = false; + else + always_cache_ = true; + VLOG(2) << "ReplaceFstImpl::ReplaceFstImpl: always_cache = " + << (always_cache_ ? "true" : "false"); + } + + ReplaceFstImpl(const ReplaceFstImpl& impl) + : CacheImpl(impl), + epsilon_on_replace_(impl.epsilon_on_replace_), + always_cache_(impl.always_cache_), + state_table_(new StateTable(*(impl.state_table_))), + nonterminal_set_(impl.nonterminal_set_), + nonterminal_hash_(impl.nonterminal_hash_), + root_(impl.root_) { + SetType("replace"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + fst_array_.reserve(impl.fst_array_.size()); + fst_array_.push_back(0); + for (size_t i = 1; i < impl.fst_array_.size(); ++i) { + fst_array_.push_back(impl.fst_array_[i]->Copy(true)); + } + } + + ~ReplaceFstImpl() { + VLOG(2) << "~ReplaceFstImpl: gc = " + << (CacheImpl::GetCacheGc() ? "true" : "false") + << ", gc_size = " << CacheImpl::GetCacheSize() + << ", gc_limit = " << CacheImpl::GetCacheLimit(); + + delete state_table_; + for (size_t i = 1; i < fst_array_.size(); ++i) { + delete fst_array_[i]; + } + } + + // Computes the dependency graph of the replace class and returns + // true if the dependencies are cyclic. Cyclic dependencies will result + // in an un-expandable replace fst. + bool CyclicDependencies() const { + ReplaceUtil replace_util(fst_array_, nonterminal_hash_, root_); + return replace_util.CyclicDependencies(); + } + + // Return or compute start state of replace fst + StateId Start() { + if (!HasStart()) { + if (fst_array_.size() == 1) { // no fsts defined for replace + SetStart(kNoStateId); + return kNoStateId; + } else { + const Fst* fst = fst_array_[root_]; + StateId fst_start = fst->Start(); + if (fst_start == kNoStateId) // root Fst is empty + return kNoStateId; + + PrefixId prefix = GetPrefixId(StackPrefix()); + StateId start = state_table_->FindState( + StateTuple(prefix, root_, fst_start)); + SetStart(start); + return start; + } + } else { + return CacheImpl::Start(); + } + } + + // return final weight of state (kInfWeight means state is not final) + Weight Final(StateId s) { + if (!HasFinal(s)) { + const StateTuple& tuple = state_table_->Tuple(s); + const StackPrefix& stack = stackprefix_array_[tuple.prefix_id]; + const Fst* fst = fst_array_[tuple.fst_id]; + StateId fst_state = tuple.fst_state; + + if (fst->Final(fst_state) != Weight::Zero() && stack.Depth() == 0) + SetFinal(s, fst->Final(fst_state)); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (HasArcs(s)) { // If state cached, use the cached value. + return CacheImpl::NumArcs(s); + } else if (always_cache_) { // If always caching, expand and cache state. + Expand(s); + return CacheImpl::NumArcs(s); + } else { // Otherwise compute the number of arcs without expanding. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num_arcs = fst->NumArcs(tuple.fst_state); + if (ComputeFinalArc(tuple, 0)) + num_arcs++; + + return num_arcs; + } + } + + // Returns whether a given label is a non terminal + bool IsNonTerminal(Label l) const { + // TODO(allauzen): be smarter and take advantage of + // all_dense or all_negative. + // Use also in ComputeArc, this would require changes to replace + // so that recursing into an empty fst lead to a non co-accessible + // state instead of deleting the arc as done currently. + // Current use correct, since i/olabel sorted iff all_non_empty. + typename NonTerminalHash::const_iterator it = + nonterminal_hash_.find(l); + return it != nonterminal_hash_.end(); + } + + size_t NumInputEpsilons(StateId s) { + if (HasArcs(s)) { + // If state cached, use the cached value. + return CacheImpl::NumInputEpsilons(s); + } else if (always_cache_ || !Properties(kILabelSorted)) { + // If always caching or if the number of input epsilons is too expensive + // to compute without caching (i.e. not ilabel sorted), + // then expand and cache state. + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } else { + // Otherwise, compute the number of input epsilons without caching. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num = 0; + if (!epsilon_on_replace_) { + // If epsilon_on_replace is false, all input epsilon arcs + // are also input epsilons arcs in the underlying machine. + fst->NumInputEpsilons(tuple.fst_state); + } else { + // Otherwise, one need to consider that all non-terminal arcs + // in the underlying machine also become input epsilon arc. + ArcIterator > aiter(*fst, tuple.fst_state); + for (; !aiter.Done() && + ((aiter.Value().ilabel == 0) || + IsNonTerminal(aiter.Value().olabel)); + aiter.Next()) + ++num; + } + if (ComputeFinalArc(tuple, 0)) + num++; + return num; + } + } + + size_t NumOutputEpsilons(StateId s) { + if (HasArcs(s)) { + // If state cached, use the cached value. + return CacheImpl::NumOutputEpsilons(s); + } else if(always_cache_ || !Properties(kOLabelSorted)) { + // If always caching or if the number of output epsilons is too expensive + // to compute without caching (i.e. not olabel sorted), + // then expand and cache state. + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } else { + // Otherwise, compute the number of output epsilons without caching. + StateTuple tuple = state_table_->Tuple(s); + if (tuple.fst_state == kNoStateId) + return 0; + const Fst* fst = fst_array_[tuple.fst_id]; + size_t num = 0; + ArcIterator > aiter(*fst, tuple.fst_state); + for (; !aiter.Done() && + ((aiter.Value().olabel == 0) || + IsNonTerminal(aiter.Value().olabel)); + aiter.Next()) + ++num; + if (ComputeFinalArc(tuple, 0)) + num++; + return num; + } + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if (mask & kError) { + for (size_t i = 1; i < fst_array_.size(); ++i) { + if (fst_array_[i]->Properties(kError, false)) + SetProperties(kError, kError); + } + } + return FstImpl::Properties(mask); + } + + // return the base arc iterator, if arcs have not been computed yet, + // extend/recurse for new arcs. + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + // TODO(allauzen): Set behaviour of generic iterator + // Warning: ArcIterator >::InitCache() + // relies on current behaviour. + } + + + // Extend current state (walk arcs one level deep) + void Expand(StateId s) { + StateTuple tuple = state_table_->Tuple(s); + + // If local fst is empty + if (tuple.fst_state == kNoStateId) { + SetArcs(s); + return; + } + + ArcIterator< Fst > aiter( + *(fst_array_[tuple.fst_id]), tuple.fst_state); + Arc arc; + + // Create a final arc when needed + if (ComputeFinalArc(tuple, &arc)) + PushArc(s, arc); + + // Expand all arcs leaving the state + for (;!aiter.Done(); aiter.Next()) { + if (ComputeArc(tuple, aiter.Value(), &arc)) + PushArc(s, arc); + } + + SetArcs(s); + } + + void Expand(StateId s, const StateTuple &tuple, + const ArcIteratorData &data) { + // If local fst is empty + if (tuple.fst_state == kNoStateId) { + SetArcs(s); + return; + } + + ArcIterator< Fst > aiter(data); + Arc arc; + + // Create a final arc when needed + if (ComputeFinalArc(tuple, &arc)) + AddArc(s, arc); + + // Expand all arcs leaving the state + for (; !aiter.Done(); aiter.Next()) { + if (ComputeArc(tuple, aiter.Value(), &arc)) + AddArc(s, arc); + } + + SetArcs(s); + } + + // If arcp == 0, only returns if a final arc is required, does not + // actually compute it. + bool ComputeFinalArc(const StateTuple &tuple, A* arcp, + uint32 flags = kArcValueFlags) { + const Fst* fst = fst_array_[tuple.fst_id]; + StateId fst_state = tuple.fst_state; + if (fst_state == kNoStateId) + return false; + + // if state is final, pop up stack + const StackPrefix& stack = stackprefix_array_[tuple.prefix_id]; + if (fst->Final(fst_state) != Weight::Zero() && stack.Depth()) { + if (arcp) { + arcp->ilabel = 0; + arcp->olabel = 0; + if (flags & kArcNextStateValue) { + PrefixId prefix_id = PopPrefix(stack); + const PrefixTuple& top = stack.Top(); + arcp->nextstate = state_table_->FindState( + StateTuple(prefix_id, top.fst_id, top.nextstate)); + } + if (flags & kArcWeightValue) + arcp->weight = fst->Final(fst_state); + } + return true; + } else { + return false; + } + } + + // Compute the arc in the replace fst corresponding to a given + // in the underlying machine. Returns false if the underlying arc + // corresponds to no arc in the replace. + bool ComputeArc(const StateTuple &tuple, const A &arc, A* arcp, + uint32 flags = kArcValueFlags) { + if (!epsilon_on_replace_ && + (flags == (flags & (kArcILabelValue | kArcWeightValue)))) { + *arcp = arc; + return true; + } + + if (arc.olabel == 0) { // expand local fst + StateId nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate)) + : kNoStateId; + *arcp = A(arc.ilabel, arc.olabel, arc.weight, nextstate); + } else { + // check for non terminal + typename NonTerminalHash::const_iterator it = + nonterminal_hash_.find(arc.olabel); + if (it != nonterminal_hash_.end()) { // recurse into non terminal + Label nonterminal = it->second; + const Fst* nt_fst = fst_array_[nonterminal]; + PrefixId nt_prefix = PushPrefix(stackprefix_array_[tuple.prefix_id], + tuple.fst_id, arc.nextstate); + + // if start state is valid replace, else arc is implicitly + // deleted + StateId nt_start = nt_fst->Start(); + if (nt_start != kNoStateId) { + StateId nt_nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(nt_prefix, nonterminal, nt_start)) + : kNoStateId; + Label ilabel = (epsilon_on_replace_) ? 0 : arc.ilabel; + *arcp = A(ilabel, 0, arc.weight, nt_nextstate); + } else { + return false; + } + } else { + StateId nextstate = flags & kArcNextStateValue + ? state_table_->FindState( + StateTuple(tuple.prefix_id, tuple.fst_id, arc.nextstate)) + : kNoStateId; + *arcp = A(arc.ilabel, arc.olabel, arc.weight, nextstate); + } + } + return true; + } + + // Returns the arc iterator flags supported by this Fst. + uint32 ArcIteratorFlags() const { + uint32 flags = kArcValueFlags; + if (!always_cache_) + flags |= kArcNoCache; + return flags; + } + + T* GetStateTable() const { + return state_table_; + } + + const Fst* GetFst(Label fst_id) const { + return fst_array_[fst_id]; + } + + bool EpsilonOnReplace() const { return epsilon_on_replace_; } + + // private helper classes + private: + static const size_t kPrime0; + + // \class PrefixTuple + // \brief Tuple of fst_id and destination state (entry in stack prefix) + struct PrefixTuple { + PrefixTuple(Label f, StateId s) : fst_id(f), nextstate(s) {} + + Label fst_id; + StateId nextstate; + }; + + // \class StackPrefix + // \brief Container for stack prefix. + class StackPrefix { + public: + StackPrefix() {} + + // copy constructor + StackPrefix(const StackPrefix& x) : + prefix_(x.prefix_) { + } + + void Push(StateId fst_id, StateId nextstate) { + prefix_.push_back(PrefixTuple(fst_id, nextstate)); + } + + void Pop() { + prefix_.pop_back(); + } + + const PrefixTuple& Top() const { + return prefix_[prefix_.size()-1]; + } + + size_t Depth() const { + return prefix_.size(); + } + + public: + vector prefix_; + }; + + + // \class StackPrefixEqual + // \brief Compare two stack prefix classes for equality + class StackPrefixEqual { + public: + bool operator()(const StackPrefix& x, const StackPrefix& y) const { + if (x.prefix_.size() != y.prefix_.size()) return false; + for (size_t i = 0; i < x.prefix_.size(); ++i) { + if (x.prefix_[i].fst_id != y.prefix_[i].fst_id || + x.prefix_[i].nextstate != y.prefix_[i].nextstate) return false; + } + return true; + } + }; + + // + // \class StackPrefixKey + // \brief Hash function for stack prefix to prefix id + class StackPrefixKey { + public: + size_t operator()(const StackPrefix& x) const { + size_t sum = 0; + for (size_t i = 0; i < x.prefix_.size(); ++i) { + sum += x.prefix_[i].fst_id + x.prefix_[i].nextstate*kPrime0; + } + return sum; + } + }; + + typedef unordered_map + StackPrefixHash; + + // private methods + private: + // hash stack prefix (return unique index into stackprefix array) + PrefixId GetPrefixId(const StackPrefix& prefix) { + typename StackPrefixHash::iterator it = prefix_hash_.find(prefix); + if (it == prefix_hash_.end()) { + PrefixId prefix_id = stackprefix_array_.size(); + stackprefix_array_.push_back(prefix); + prefix_hash_[prefix] = prefix_id; + return prefix_id; + } else { + return it->second; + } + } + + // prefix id after a stack pop + PrefixId PopPrefix(StackPrefix prefix) { + prefix.Pop(); + return GetPrefixId(prefix); + } + + // prefix id after a stack push + PrefixId PushPrefix(StackPrefix prefix, Label fst_id, StateId nextstate) { + prefix.Push(fst_id, nextstate); + return GetPrefixId(prefix); + } + + + // private data + private: + // runtime options + bool epsilon_on_replace_; + bool always_cache_; // Optionally caching arc iterator disabled when true + + // state table + StateTable *state_table_; + + // cross index of unique stack prefix + // could potentially have one copy of prefix array + StackPrefixHash prefix_hash_; + vector stackprefix_array_; + + set > +// The ReplaceFst need to be built such that it is known to be ilabel +// or olabel sorted (see usage below). +// +// Observe that Matcher > will use the optionally caching arc +// iterator when available (Fst is ilabel sorted and matching on the +// input, or Fst is olabel sorted and matching on the output). +// In order to obtain the most efficient behaviour, it is recommended +// to set 'epsilon_on_replace' to false (this means constructing acceptors +// as transducers with epsilons on the input side of nonterminal arcs) +// and matching on the input side. +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template > +class ReplaceFst : public ImplToFst< ReplaceFstImpl > { + public: + friend class ArcIterator< ReplaceFst >; + friend class StateIterator< ReplaceFst >; + friend class ReplaceFstMatcher; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef ReplaceFstImpl Impl; + + using ImplToFst::Properties; + + ReplaceFst(const vector* > >& fst_array, + Label root) + : ImplToFst(new Impl(fst_array, ReplaceFstOptions(root))) {} + + ReplaceFst(const vector* > >& fst_array, + const ReplaceFstOptions &opts) + : ImplToFst(new Impl(fst_array, opts)) {} + + // See Fst<>::Copy() for doc. + ReplaceFst(const ReplaceFst& fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this ReplaceFst. See Fst<>::Copy() for further doc. + virtual ReplaceFst *Copy(bool safe = false) const { + return new ReplaceFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + virtual MatcherBase *InitMatcher(MatchType match_type) const { + if ((GetImpl()->ArcIteratorFlags() & kArcNoCache) && + ((match_type == MATCH_INPUT && Properties(kILabelSorted, false)) || + (match_type == MATCH_OUTPUT && Properties(kOLabelSorted, false)))) { + return new ReplaceFstMatcher(*this, match_type); + } + else { + VLOG(2) << "Not using replace matcher"; + return 0; + } + } + + bool CyclicDependencies() const { + return GetImpl()->CyclicDependencies(); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const ReplaceFst &fst); // disallow +}; + + +// Specialization for ReplaceFst. +template +class StateIterator< ReplaceFst > + : public CacheStateIterator< ReplaceFst > { + public: + explicit StateIterator(const ReplaceFst &fst) + : CacheStateIterator< ReplaceFst >(fst, fst.GetImpl()) {} + + private: + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + + +// Specialization for ReplaceFst. +// Implements optional caching. It can be used as follows: +// +// ReplaceFst replace; +// ArcIterator< ReplaceFst > aiter(replace, s); +// // Note: ArcIterator< Fst > is always a caching arc iterator. +// aiter.SetFlags(kArcNoCache, kArcNoCache); +// // Use the arc iterator, no arc will be cached, no state will be expanded. +// // The varied 'kArcValueFlags' can be used to decide which part +// // of arc values needs to be computed. +// aiter.SetFlags(kArcILabelValue, kArcValueFlags); +// // Only want the ilabel for this arc +// aiter.Value(); // Does not compute the destination state. +// aiter.Next(); +// aiter.SetFlags(kArcNextStateValue, kArcNextStateValue); +// // Want both ilabel and nextstate for that arc +// aiter.Value(); // Does compute the destination state and inserts it +// // in the replace state table. +// // No Arc has been cached at that point. +// +template +class ArcIterator< ReplaceFst > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + ArcIterator(const ReplaceFst &fst, StateId s) + : fst_(fst), state_(s), pos_(0), offset_(0), flags_(0), arcs_(0), + data_flags_(0), final_flags_(0) { + cache_data_.ref_count = 0; + local_data_.ref_count = 0; + + // If FST does not support optional caching, force caching. + if(!(fst_.GetImpl()->ArcIteratorFlags() & kArcNoCache) && + !(fst_.GetImpl()->HasArcs(state_))) + fst_.GetImpl()->Expand(state_); + + // If state is already cached, use cached arcs array. + if (fst_.GetImpl()->HasArcs(state_)) { + (fst_.GetImpl())->template CacheImpl::InitArcIterator(state_, + &cache_data_); + num_arcs_ = cache_data_.narcs; + arcs_ = cache_data_.arcs; // 'arcs_' is a ptr to the cached arcs. + data_flags_ = kArcValueFlags; // All the arc member values are valid. + } else { // Otherwise delay decision until Value() is called. + tuple_ = fst_.GetImpl()->GetStateTable()->Tuple(state_); + if (tuple_.fst_state == kNoStateId) { + num_arcs_ = 0; + } else { + // The decision to cache or not to cache has been defered + // until Value() or SetFlags() is called. However, the arc + // iterator is set up now to be ready for non-caching in order + // to keep the Value() method simple and efficient. + const Fst* fst = fst_.GetImpl()->GetFst(tuple_.fst_id); + fst->InitArcIterator(tuple_.fst_state, &local_data_); + // 'arcs_' is a pointer to the arcs in the underlying machine. + arcs_ = local_data_.arcs; + // Compute the final arc (but not its destination state) + // if a final arc is required. + bool has_final_arc = fst_.GetImpl()->ComputeFinalArc( + tuple_, + &final_arc_, + kArcValueFlags & ~kArcNextStateValue); + // Set the arc value flags that hold for 'final_arc_'. + final_flags_ = kArcValueFlags & ~kArcNextStateValue; + // Compute the number of arcs. + num_arcs_ = local_data_.narcs; + if (has_final_arc) + ++num_arcs_; + // Set the offset between the underlying arc positions and + // the positions in the arc iterator. + offset_ = num_arcs_ - local_data_.narcs; + // Defers the decision to cache or not until Value() or + // SetFlags() is called. + data_flags_ = 0; + } + } + } + + ~ArcIterator() { + if (cache_data_.ref_count) + --(*cache_data_.ref_count); + if (local_data_.ref_count) + --(*local_data_.ref_count); + } + + void ExpandAndCache() const { + // TODO(allauzen): revisit this + // fst_.GetImpl()->Expand(state_, tuple_, local_data_); + // (fst_.GetImpl())->CacheImpl*>::InitArcIterator(state_, + // &cache_data_); + // + fst_.InitArcIterator(state_, &cache_data_); // Expand and cache state. + arcs_ = cache_data_.arcs; // 'arcs_' is a pointer to the cached arcs. + data_flags_ = kArcValueFlags; // All the arc member values are valid. + offset_ = 0; // No offset + + } + + void Init() { + if (flags_ & kArcNoCache) { // If caching is disabled + // 'arcs_' is a pointer to the arcs in the underlying machine. + arcs_ = local_data_.arcs; + // Set the arcs value flags that hold for 'arcs_'. + data_flags_ = kArcWeightValue; + if (!fst_.GetImpl()->EpsilonOnReplace()) + data_flags_ |= kArcILabelValue; + // Set the offset between the underlying arc positions and + // the positions in the arc iterator. + offset_ = num_arcs_ - local_data_.narcs; + } else { // Otherwise, expand and cache + ExpandAndCache(); + } + } + + bool Done() const { return pos_ >= num_arcs_; } + + const A& Value() const { + // If 'data_flags_' was set to 0, non-caching was not requested + if (!data_flags_) { + // TODO(allauzen): revisit this. + if (flags_ & kArcNoCache) { + // Should never happen. + FSTERROR() << "ReplaceFst: inconsistent arc iterator flags"; + } + ExpandAndCache(); // Expand and cache. + } + + if (pos_ - offset_ >= 0) { // The requested arc is not the 'final' arc. + const A& arc = arcs_[pos_ - offset_]; + if ((data_flags_ & flags_) == (flags_ & kArcValueFlags)) { + // If the value flags for 'arc' match the recquired value flags + // then return 'arc'. + return arc; + } else { + // Otherwise, compute the corresponding arc on-the-fly. + fst_.GetImpl()->ComputeArc(tuple_, arc, &arc_, flags_ & kArcValueFlags); + return arc_; + } + } else { // The requested arc is the 'final' arc. + if ((final_flags_ & flags_) != (flags_ & kArcValueFlags)) { + // If the arc value flags that hold for the final arc + // do not match the requested value flags, then + // 'final_arc_' needs to be updated. + fst_.GetImpl()->ComputeFinalArc(tuple_, &final_arc_, + flags_ & kArcValueFlags); + final_flags_ = flags_ & kArcValueFlags; + } + return final_arc_; + } + } + + void Next() { ++pos_; } + + size_t Position() const { return pos_; } + + void Reset() { pos_ = 0; } + + void Seek(size_t pos) { pos_ = pos; } + + uint32 Flags() const { return flags_; } + + void SetFlags(uint32 f, uint32 mask) { + // Update the flags taking into account what flags are supported + // by the Fst. + flags_ &= ~mask; + flags_ |= (f & fst_.GetImpl()->ArcIteratorFlags()); + // If non-caching is not requested (and caching has not already + // been performed), then flush 'data_flags_' to request caching + // during the next call to Value(). + if (!(flags_ & kArcNoCache) && data_flags_ != kArcValueFlags) { + if (!fst_.GetImpl()->HasArcs(state_)) + data_flags_ = 0; + } + // If 'data_flags_' has been flushed but non-caching is requested + // before calling Value(), then set up the iterator for non-caching. + if ((f & kArcNoCache) && (!data_flags_)) + Init(); + } + + private: + const ReplaceFst &fst_; // Reference to the FST + StateId state_; // State in the FST + mutable typename T::StateTuple tuple_; // Tuple corresponding to state_ + + ssize_t pos_; // Current position + mutable ssize_t offset_; // Offset between position in iterator and in arcs_ + ssize_t num_arcs_; // Number of arcs at state_ + uint32 flags_; // Behavorial flags for the arc iterator + mutable Arc arc_; // Memory to temporarily store computed arcs + + mutable ArcIteratorData cache_data_; // Arc iterator data in cache + mutable ArcIteratorData local_data_; // Arc iterator data in local fst + + mutable const A* arcs_; // Array of arcs + mutable uint32 data_flags_; // Arc value flags valid for data in arcs_ + mutable Arc final_arc_; // Final arc (when required) + mutable uint32 final_flags_; // Arc value flags valid for final_arc_ + + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template +class ReplaceFstMatcher : public MatcherBase { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef MultiEpsMatcher > > LocalMatcher; + + ReplaceFstMatcher(const ReplaceFst &fst, fst::MatchType match_type) + : fst_(fst), + impl_(fst_.GetImpl()), + s_(fst::kNoStateId), + match_type_(match_type), + current_loop_(false), + final_arc_(false), + loop_(fst::kNoLabel, 0, A::Weight::One(), fst::kNoStateId) { + if (match_type_ == fst::MATCH_OUTPUT) + swap(loop_.ilabel, loop_.olabel); + InitMatchers(); + } + + ReplaceFstMatcher(const ReplaceFstMatcher &matcher, bool safe = false) + : fst_(matcher.fst_), + impl_(fst_.GetImpl()), + s_(fst::kNoStateId), + match_type_(matcher.match_type_), + current_loop_(false), + loop_(fst::kNoLabel, 0, A::Weight::One(), fst::kNoStateId) { + if (match_type_ == fst::MATCH_OUTPUT) + swap(loop_.ilabel, loop_.olabel); + InitMatchers(); + } + + // Create a local matcher for each component Fst of replace. + // LocalMatcher is a multi epsilon wrapper matcher. MultiEpsilonMatcher + // is used to match each non-terminal arc, since these non-terminal + // turn into epsilons on recursion. + void InitMatchers() { + const vector*>& fst_array = impl_->fst_array_; + matcher_.resize(fst_array.size(), 0); + for (size_t i = 0; i < fst_array.size(); ++i) { + if (fst_array[i]) { + matcher_[i] = + new LocalMatcher(*fst_array[i], match_type_, kMultiEpsList); + + typename set &GetFst() const { + return fst_; + } + + virtual uint64 Properties(uint64 props) const { + return props; + } + + private: + // Set the sate from which our matching happens. + virtual void SetState_(StateId s) { + if (s_ == s) return; + + s_ = s; + tuple_ = impl_->GetStateTable()->Tuple(s_); + if (tuple_.fst_state == kNoStateId) { + done_ = true; + return; + } + // Get current matcher. Used for non epsilon matching + current_matcher_ = matcher_[tuple_.fst_id]; + current_matcher_->SetState(tuple_.fst_state); + loop_.nextstate = s_; + + final_arc_ = false; + } + + // Search for label, from previous set state. If label == 0, first + // hallucinate and epsilon loop, else use the underlying matcher to + // search for the label or epsilons. + // - Note since the ReplaceFST recursion on non-terminal arcs causes + // epsilon transitions to be created we use the MultiEpsilonMatcher + // to search for possible matches of non terminals. + // - If the component Fst reaches a final state we also need to add + // the exiting final arc. + virtual bool Find_(Label label) { + bool found = false; + label_ = label; + if (label_ == 0 || label_ == kNoLabel) { + // Compute loop directly, saving Replace::ComputeArc + if (label_ == 0) { + current_loop_ = true; + found = true; + } + // Search for matching multi epsilons + final_arc_ = impl_->ComputeFinalArc(tuple_, 0); + found = current_matcher_->Find(kNoLabel) || final_arc_ || found; + } else { + // Search on sub machine directly using sub machine matcher. + found = current_matcher_->Find(label_); + } + return found; + } + + virtual bool Done_() const { + return !current_loop_ && !final_arc_ && current_matcher_->Done(); + } + + virtual const Arc& Value_() const { + if (current_loop_) { + return loop_; + } + if (final_arc_) { + impl_->ComputeFinalArc(tuple_, &arc_); + return arc_; + } + const Arc& component_arc = current_matcher_->Value(); + impl_->ComputeArc(tuple_, component_arc, &arc_); + return arc_; + } + + virtual void Next_() { + if (current_loop_) { + current_loop_ = false; + return; + } + if (final_arc_) { + final_arc_ = false; + return; + } + current_matcher_->Next(); + } + + const ReplaceFst& fst_; + ReplaceFstImpl *impl_; + LocalMatcher* current_matcher_; + vector matcher_; + + StateId s_; // Current state + Label label_; // Current label + + MatchType match_type_; // Supplied by caller + mutable bool done_; + mutable bool current_loop_; // Current arc is the implicit loop + mutable bool final_arc_; // Current arc for exiting recursion + mutable typename T::StateTuple tuple_; // Tuple corresponding to state_ + mutable Arc arc_; + Arc loop_; +}; + +template inline +void ReplaceFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< ReplaceFst >(*this); +} + +typedef ReplaceFst StdReplaceFst; + + +// // Recursivively replaces arcs in the root Fst with other Fsts. +// This version writes the result of replacement to an output MutableFst. +// +// Replace supports replacement of arcs in one Fst with another +// Fst. This replacement is recursive. Replace takes an array of +// Fst(s). One Fst represents the root (or topology) machine. The root +// Fst refers to other Fsts by recursively replacing arcs labeled as +// non-terminals with the matching non-terminal Fst. Currently Replace +// uses the output symbols of the arcs to determine whether the arc is +// a non-terminal arc or not. A non-terminal can be any label that is +// not a non-zero terminal label in the output alphabet. Note that +// input argument is a vector of pair<>. These correspond to the tuple +// of non-terminal Label and corresponding Fst. +template +void Replace(const vector* > >& ifst_array, + MutableFst *ofst, typename Arc::Label root, + bool epsilon_on_replace) { + ReplaceFstOptions opts(root, epsilon_on_replace); + opts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = ReplaceFst(ifst_array, opts); +} + +template +void Replace(const vector* > >& ifst_array, + MutableFst *ofst, typename Arc::Label root) { + Replace(ifst_array, ofst, root, false); +} + +} // namespace fst + +#endif // FST_LIB_REPLACE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/reverse.h b/extlibs/openfstwin-1.3.1/include/fst/reverse.h new file mode 100755 index 00000000000..4d4c75cb246 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/reverse.h @@ -0,0 +1,91 @@ +// reverse.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to sort arcs in an FST. + +#ifndef FST_LIB_REVERSE_H__ +#define FST_LIB_REVERSE_H__ + +#include +#include +using std::vector; + +#include + + +namespace fst { + +// Reverses an FST. The reversed result is written to an output +// MutableFst. If A transduces string x to y with weight a, then the +// reverse of A transduces the reverse of x to the reverse of y with +// weight a.Reverse(). +// +// Typically, a = a.Reverse() and Arc = RevArc (e.g. for +// TropicalWeight or LogWeight). In general, e.g. when the weights +// only form a left or right semiring, the output arc type must match +// the input arc type except having the reversed Weight type. +template +void Reverse(const Fst &ifst, MutableFst *ofst) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename RevArc::Weight RevWeight; + + ofst->DeleteStates(); + ofst->SetInputSymbols(ifst.InputSymbols()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + if (ifst.Properties(kExpanded, false)) + ofst->ReserveStates(CountStates(ifst) + 1); + StateId istart = ifst.Start(); + StateId ostart = ofst->AddState(); + ofst->SetStart(ostart); + + for (StateIterator< Fst > siter(ifst); + !siter.Done(); + siter.Next()) { + StateId is = siter.Value(); + StateId os = is + 1; + while (ofst->NumStates() <= os) + ofst->AddState(); + if (is == istart) + ofst->SetFinal(os, RevWeight::One()); + + Weight final = ifst.Final(is); + if (final != Weight::Zero()) { + RevArc oarc(0, 0, final.Reverse(), os); + ofst->AddArc(0, oarc); + } + + for (ArcIterator< Fst > aiter(ifst, is); + !aiter.Done(); + aiter.Next()) { + const Arc &iarc = aiter.Value(); + RevArc oarc(iarc.ilabel, iarc.olabel, iarc.weight.Reverse(), os); + StateId nos = iarc.nextstate + 1; + while (ofst->NumStates() <= nos) + ofst->AddState(); + ofst->AddArc(nos, oarc); + } + } + uint64 iprops = ifst.Properties(kCopyProperties, false); + uint64 oprops = ofst->Properties(kFstProperties, false); + ofst->SetProperties(ReverseProperties(iprops) | oprops, kFstProperties); +} + +} // namespace fst + +#endif // FST_LIB_REVERSE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/reweight.h b/extlibs/openfstwin-1.3.1/include/fst/reweight.h new file mode 100755 index 00000000000..c051c2affcf --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/reweight.h @@ -0,0 +1,146 @@ +// reweight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Function to reweight an FST. + +#ifndef FST_LIB_REWEIGHT_H__ +#define FST_LIB_REWEIGHT_H__ + +#include +using std::vector; + +#include + + +namespace fst { + +enum ReweightType { REWEIGHT_TO_INITIAL, REWEIGHT_TO_FINAL }; + +// Reweight FST according to the potentials defined by the POTENTIAL +// vector in the direction defined by TYPE. Weight needs to be left +// distributive when reweighting towards the initial state and right +// distributive when reweighting towards the final states. +// +// An arc of weight w, with an origin state of potential p and +// destination state of potential q, is reweighted by p\wq when +// reweighting towards the initial state and by pw/q when reweighting +// towards the final states. +template +void Reweight(MutableFst *fst, + const vector &potential, + ReweightType type) { + typedef typename Arc::Weight Weight; + + if (fst->NumStates() == 0) + return; + + if (type == REWEIGHT_TO_FINAL && !(Weight::Properties() & kRightSemiring)) { + FSTERROR() << "Reweight: Reweighting to the final states requires " + << "Weight to be right distributive: " + << Weight::Type(); + fst->SetProperties(kError, kError); + return; + } + + if (type == REWEIGHT_TO_INITIAL && !(Weight::Properties() & kLeftSemiring)) { + FSTERROR() << "Reweight: Reweighting to the initial state requires " + << "Weight to be left distributive: " + << Weight::Type(); + fst->SetProperties(kError, kError); + return; + } + + StateIterator< MutableFst > sit(*fst); + for (; !sit.Done(); sit.Next()) { + typename Arc::StateId state = sit.Value(); + if (state == potential.size()) + break; + typename Arc::Weight weight = potential[state]; + if (weight != Weight::Zero()) { + for (MutableArcIterator< MutableFst > ait(fst, state); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + if (arc.nextstate >= potential.size()) + continue; + typename Arc::Weight nextweight = potential[arc.nextstate]; + if (nextweight == Weight::Zero()) + continue; + if (type == REWEIGHT_TO_INITIAL) + arc.weight = Divide(Times(arc.weight, nextweight), weight, + DIVIDE_LEFT); + if (type == REWEIGHT_TO_FINAL) + arc.weight = Divide(Times(weight, arc.weight), nextweight, + DIVIDE_RIGHT); + ait.SetValue(arc); + } + if (type == REWEIGHT_TO_INITIAL) + fst->SetFinal(state, Divide(fst->Final(state), weight, DIVIDE_LEFT)); + } + if (type == REWEIGHT_TO_FINAL) + fst->SetFinal(state, Times(weight, fst->Final(state))); + } + + // This handles elements past the end of the potentials array. + for (; !sit.Done(); sit.Next()) { + typename Arc::StateId state = sit.Value(); + if (type == REWEIGHT_TO_FINAL) + fst->SetFinal(state, Times(Weight::Zero(), fst->Final(state))); + } + + typename Arc::Weight startweight = fst->Start() < potential.size() ? + potential[fst->Start()] : Weight::Zero(); + if ((startweight != Weight::One()) && (startweight != Weight::Zero())) { + if (fst->Properties(kInitialAcyclic, true) & kInitialAcyclic) { + typename Arc::StateId state = fst->Start(); + for (MutableArcIterator< MutableFst > ait(fst, state); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + if (type == REWEIGHT_TO_INITIAL) + arc.weight = Times(startweight, arc.weight); + else + arc.weight = Times( + Divide(Weight::One(), startweight, DIVIDE_RIGHT), + arc.weight); + ait.SetValue(arc); + } + if (type == REWEIGHT_TO_INITIAL) + fst->SetFinal(state, Times(startweight, fst->Final(state))); + else + fst->SetFinal(state, Times(Divide(Weight::One(), startweight, + DIVIDE_RIGHT), + fst->Final(state))); + } else { + typename Arc::StateId state = fst->AddState(); + Weight w = type == REWEIGHT_TO_INITIAL ? startweight : + Divide(Weight::One(), startweight, DIVIDE_RIGHT); + Arc arc(0, 0, w, fst->Start()); + fst->AddArc(state, arc); + fst->SetStart(state); + } + } + + fst->SetProperties(ReweightProperties( + fst->Properties(kFstProperties, false)), + kFstProperties); +} + +} // namespace fst + +#endif // FST_LIB_REWEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h b/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h new file mode 100755 index 00000000000..582c213b4e1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h @@ -0,0 +1,601 @@ +// rmepsilon.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions and classes that implemement epsilon-removal. + +#ifndef FST_LIB_RMEPSILON_H__ +#define FST_LIB_RMEPSILON_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace fst { + +template +class RmEpsilonOptions + : public ShortestDistanceOptions > { + public: + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + bool connect; // Connect output + Weight weight_threshold; // Pruning weight threshold. + StateId state_threshold; // Pruning state threshold. + + explicit RmEpsilonOptions(Queue *q, float d = kDelta, bool c = true, + Weight w = Weight::Zero(), + StateId n = kNoStateId) + : ShortestDistanceOptions< Arc, Queue, EpsilonArcFilter >( + q, EpsilonArcFilter(), kNoStateId, d), + connect(c), weight_threshold(w), state_threshold(n) {} + private: + RmEpsilonOptions(); // disallow +}; + +// Computation state of the epsilon-removal algorithm. +template +class RmEpsilonState { + public: + typedef typename Arc::Label Label; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + RmEpsilonState(const Fst &fst, + vector *distance, + const RmEpsilonOptions &opts) + : fst_(fst), distance_(distance), sd_state_(fst_, distance, opts, true), + expand_id_(0) {} + + // Compute arcs and final weight for state 's' + void Expand(StateId s); + + // Returns arcs of expanded state. + vector &Arcs() { return arcs_; } + + // Returns final weight of expanded state. + const Weight &Final() const { return final_; } + + // Return true if an error has occured. + bool Error() const { return sd_state_.Error(); } + + private: + static const size_t kPrime0 = 7853; + static const size_t kPrime1 = 7867; + + struct Element { + Label ilabel; + Label olabel; + StateId nextstate; + + Element() {} + + Element(Label i, Label o, StateId s) + : ilabel(i), olabel(o), nextstate(s) {} + }; + + class ElementKey { + public: + size_t operator()(const Element& e) const { + return static_cast(e.nextstate); + return static_cast(e.nextstate + + e.ilabel * kPrime0 + + e.olabel * kPrime1); + } + + private: + }; + + class ElementEqual { + public: + bool operator()(const Element &e1, const Element &e2) const { + return (e1.ilabel == e2.ilabel) && (e1.olabel == e2.olabel) + && (e1.nextstate == e2.nextstate); + } + }; + + typedef unordered_map, + ElementKey, ElementEqual> ElementMap; + + const Fst &fst_; + // Distance from state being expanded in epsilon-closure. + vector *distance_; + // Shortest distance algorithm computation state. + ShortestDistanceState > sd_state_; + // Maps an element 'e' to a pair 'p' corresponding to a position + // in the arcs vector of the state being expanded. 'e' corresponds + // to the position 'p.second' in the 'arcs_' vector if 'p.first' is + // equal to the state being expanded. + ElementMap element_map_; + EpsilonArcFilter eps_filter_; + stack eps_queue_; // Queue used to visit the epsilon-closure + vector visited_; // '[i] = true' if state 'i' has been visited + slist visited_states_; // List of visited states + vector arcs_; // Arcs of state being expanded + Weight final_; // Final weight of state being expanded + StateId expand_id_; // Unique ID for each call to Expand + + DISALLOW_COPY_AND_ASSIGN(RmEpsilonState); +}; + +template +const size_t RmEpsilonState::kPrime0; +template +const size_t RmEpsilonState::kPrime1; + + +template +void RmEpsilonState::Expand(typename Arc::StateId source) { + final_ = Weight::Zero(); + arcs_.clear(); + sd_state_.ShortestDistance(source); + if (sd_state_.Error()) + return; + eps_queue_.push(source); + + while (!eps_queue_.empty()) { + StateId state = eps_queue_.top(); + eps_queue_.pop(); + + while (visited_.size() <= state) visited_.push_back(false); + if (visited_[state]) continue; + visited_[state] = true; + visited_states_.push_front(state); + + for (ArcIterator< Fst > ait(fst_, state); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + arc.weight = Times((*distance_)[state], arc.weight); + + if (eps_filter_(arc)) { + while (visited_.size() <= arc.nextstate) + visited_.push_back(false); + if (!visited_[arc.nextstate]) + eps_queue_.push(arc.nextstate); + } else { + Element element(arc.ilabel, arc.olabel, arc.nextstate); + typename ElementMap::iterator it = element_map_.find(element); + if (it == element_map_.end()) { + element_map_.insert( + pair > + (element, pair(expand_id_, arcs_.size()))); + arcs_.push_back(arc); + } else { + if (((*it).second).first == expand_id_) { + Weight &w = arcs_[((*it).second).second].weight; + w = Plus(w, arc.weight); + } else { + ((*it).second).first = expand_id_; + ((*it).second).second = arcs_.size(); + arcs_.push_back(arc); + } + } + } + } + final_ = Plus(final_, Times((*distance_)[state], fst_.Final(state))); + } + + while (!visited_states_.empty()) { + visited_[visited_states_.front()] = false; + visited_states_.pop_front(); + } + ++expand_id_; +} + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version modifies +// its input. It allows fine control via the options argument; see +// below for a simpler interface. +// +// The vector 'distance' will be used to hold the shortest distances +// during the epsilon-closure computation. The state queue discipline +// and convergence delta are taken in the options argument. +template +void RmEpsilon(MutableFst *fst, + vector *distance, + const RmEpsilonOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + if (fst->Start() == kNoStateId) { + return; + } + + // 'noneps_in[s]' will be set to true iff 's' admits a non-epsilon + // incoming transition or is the start state. + vector noneps_in(fst->NumStates(), false); + noneps_in[fst->Start()] = true; + for (StateId i = 0; i < fst->NumStates(); ++i) { + for (ArcIterator > aiter(*fst, i); + !aiter.Done(); + aiter.Next()) { + if (aiter.Value().ilabel != 0 || aiter.Value().olabel != 0) + noneps_in[aiter.Value().nextstate] = true; + } + } + + // States sorted in topological order when (acyclic) or generic + // topological order (cyclic). + vector states; + states.reserve(fst->NumStates()); + + if (fst->Properties(kTopSorted, false) & kTopSorted) { + for (StateId i = 0; i < fst->NumStates(); i++) + states.push_back(i); + } else if (fst->Properties(kAcyclic, false) & kAcyclic) { + vector order; + bool acyclic; + TopOrderVisitor top_order_visitor(&order, &acyclic); + DfsVisit(*fst, &top_order_visitor, EpsilonArcFilter()); + // Sanity check: should be acyclic if property bit is set. + if(!acyclic) { + FSTERROR() << "RmEpsilon: inconsistent acyclic property bit"; + fst->SetProperties(kError, kError); + return; + } + states.resize(order.size()); + for (StateId i = 0; i < order.size(); i++) + states[order[i]] = i; + } else { + uint64 props; + vector scc; + SccVisitor scc_visitor(&scc, 0, 0, &props); + DfsVisit(*fst, &scc_visitor, EpsilonArcFilter()); + vector first(scc.size(), kNoStateId); + vector next(scc.size(), kNoStateId); + for (StateId i = 0; i < scc.size(); i++) { + if (first[scc[i]] != kNoStateId) + next[i] = first[scc[i]]; + first[scc[i]] = i; + } + for (StateId i = 0; i < first.size(); i++) + for (StateId j = first[i]; j != kNoStateId; j = next[j]) + states.push_back(j); + } + + RmEpsilonState + rmeps_state(*fst, distance, opts); + + while (!states.empty()) { + StateId state = states.back(); + states.pop_back(); + if (!noneps_in[state]) + continue; + rmeps_state.Expand(state); + fst->SetFinal(state, rmeps_state.Final()); + fst->DeleteArcs(state); + vector &arcs = rmeps_state.Arcs(); + fst->ReserveArcs(state, arcs.size()); + while (!arcs.empty()) { + fst->AddArc(state, arcs.back()); + arcs.pop_back(); + } + } + + for (StateId s = 0; s < fst->NumStates(); ++s) { + if (!noneps_in[s]) + fst->DeleteArcs(s); + } + + if(rmeps_state.Error()) + fst->SetProperties(kError, kError); + fst->SetProperties( + RmEpsilonProperties(fst->Properties(kFstProperties, false)), + kFstProperties); + + if (opts.weight_threshold != Weight::Zero() || + opts.state_threshold != kNoStateId) + Prune(fst, opts.weight_threshold, opts.state_threshold); + if (opts.connect && (opts.weight_threshold == Weight::Zero() || + opts.state_threshold != kNoStateId)) + Connect(fst); +} + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version modifies its +// input. It has a simplified interface; see above for a version that +// allows finer control. +// +// Complexity: +// - Time: +// - Unweighted: O(V2 + V E) +// - Acyclic: O(V2 + V E) +// - Tropical semiring: O(V2 log V + V E) +// - General: exponential +// - Space: O(V E) +// where V = # of states visited, E = # of arcs. +// +// References: +// - Mehryar Mohri. Generic Epsilon-Removal and Input +// Epsilon-Normalization Algorithms for Weighted Transducers, +// "International Journal of Computer Science", 13(1):129-143 (2002). +template +void RmEpsilon(MutableFst *fst, + bool connect = true, + typename Arc::Weight weight_threshold = Arc::Weight::Zero(), + typename Arc::StateId state_threshold = kNoStateId, + float delta = kDelta) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + vector distance; + AutoQueue state_queue(*fst, &distance, EpsilonArcFilter()); + RmEpsilonOptions > + opts(&state_queue, delta, connect, weight_threshold, state_threshold); + + RmEpsilon(fst, &distance, opts); +} + + +struct RmEpsilonFstOptions : CacheOptions { + float delta; + + RmEpsilonFstOptions(const CacheOptions &opts, float delta = kDelta) + : CacheOptions(opts), delta(delta) {} + + explicit RmEpsilonFstOptions(float delta = kDelta) : delta(delta) {} +}; + + +// Implementation of delayed RmEpsilonFst. +template +class RmEpsilonFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + RmEpsilonFstImpl(const Fst& fst, const RmEpsilonFstOptions &opts) + : CacheImpl(opts), + fst_(fst.Copy()), + delta_(opts.delta), + rmeps_state_( + *fst_, + &distance_, + RmEpsilonOptions >(&queue_, delta_, false)) { + SetType("rmepsilon"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(RmEpsilonProperties(props, true), kCopyProperties); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + RmEpsilonFstImpl(const RmEpsilonFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + delta_(impl.delta_), + rmeps_state_( + *fst_, + &distance_, + RmEpsilonOptions >(&queue_, delta_, false)) { + SetType("rmepsilon"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~RmEpsilonFstImpl() { + delete fst_; + } + + StateId Start() { + if (!HasStart()) { + SetStart(fst_->Start()); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Expand(s); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && + (fst_->Properties(kError, false) || rmeps_state_.Error())) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + rmeps_state_.Expand(s); + SetFinal(s, rmeps_state_.Final()); + vector &arcs = rmeps_state_.Arcs(); + while (!arcs.empty()) { + PushArc(s, arcs.back()); + arcs.pop_back(); + } + SetArcs(s); + } + + private: + const Fst *fst_; + float delta_; + vector distance_; + FifoQueue queue_; + RmEpsilonState > rmeps_state_; + + void operator=(const RmEpsilonFstImpl &); // disallow +}; + + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version is a +// delayed Fst. +// +// Complexity: +// - Time: +// - Unweighted: O(v^2 + v e) +// - General: exponential +// - Space: O(v e) +// where v = # of states visited, e = # of arcs visited. Constant time +// to visit an input state or arc is assumed and exclusive of caching. +// +// References: +// - Mehryar Mohri. Generic Epsilon-Removal and Input +// Epsilon-Normalization Algorithms for Weighted Transducers, +// "International Journal of Computer Science", 13(1):129-143 (2002). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RmEpsilonFst : public ImplToFst< RmEpsilonFstImpl > { + public: + friend class ArcIterator< RmEpsilonFst >; + friend class StateIterator< RmEpsilonFst >; + + typedef A Arc; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef RmEpsilonFstImpl Impl; + + RmEpsilonFst(const Fst &fst) + : ImplToFst(new Impl(fst, RmEpsilonFstOptions())) {} + + RmEpsilonFst(const Fst &fst, const RmEpsilonFstOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + RmEpsilonFst(const RmEpsilonFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this RmEpsilonFst. See Fst<>::Copy() for further doc. + virtual RmEpsilonFst *Copy(bool safe = false) const { + return new RmEpsilonFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RmEpsilonFst &fst); // disallow +}; + +// Specialization for RmEpsilonFst. +template +class StateIterator< RmEpsilonFst > + : public CacheStateIterator< RmEpsilonFst > { + public: + explicit StateIterator(const RmEpsilonFst &fst) + : CacheStateIterator< RmEpsilonFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for RmEpsilonFst. +template +class ArcIterator< RmEpsilonFst > + : public CacheArcIterator< RmEpsilonFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RmEpsilonFst &fst, StateId s) + : CacheArcIterator< RmEpsilonFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void RmEpsilonFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< RmEpsilonFst >(*this); +} + + +// Useful alias when using StdArc. +typedef RmEpsilonFst StdRmEpsilonFst; + +} // namespace fst + +#endif // FST_LIB_RMEPSILON_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h.bak b/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h.bak new file mode 100755 index 00000000000..305b5ee60ba --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rmepsilon.h.bak @@ -0,0 +1,601 @@ +// rmepsilon.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions and classes that implemement epsilon-removal. + +#ifndef FST_LIB_RMEPSILON_H__ +#define FST_LIB_RMEPSILON_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace fst { + +template +class RmEpsilonOptions + : public ShortestDistanceOptions > { + public: + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + bool connect; // Connect output + Weight weight_threshold; // Pruning weight threshold. + StateId state_threshold; // Pruning state threshold. + + explicit RmEpsilonOptions(Queue *q, float d = kDelta, bool c = true, + Weight w = Weight::Zero(), + StateId n = kNoStateId) + : ShortestDistanceOptions< Arc, Queue, EpsilonArcFilter >( + q, EpsilonArcFilter(), kNoStateId, d), + connect(c), weight_threshold(w), state_threshold(n) {} + private: + RmEpsilonOptions(); // disallow +}; + +// Computation state of the epsilon-removal algorithm. +template +class RmEpsilonState { + public: + typedef typename Arc::Label Label; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + RmEpsilonState(const Fst &fst, + vector *distance, + const RmEpsilonOptions &opts) + : fst_(fst), distance_(distance), sd_state_(fst_, distance, opts, true), + expand_id_(0) {} + + // Compute arcs and final weight for state 's' + void Expand(StateId s); + + // Returns arcs of expanded state. + vector &Arcs() { return arcs_; } + + // Returns final weight of expanded state. + const Weight &Final() const { return final_; } + + // Return true if an error has occured. + bool Error() const { return sd_state_.Error(); } + + private: + static const size_t kPrime0 = 7853; + static const size_t kPrime1 = 7867; + + struct Element { + Label ilabel; + Label olabel; + StateId nextstate; + + Element() {} + + Element(Label i, Label o, StateId s) + : ilabel(i), olabel(o), nextstate(s) {} + }; + + class ElementKey { + public: + size_t operator()(const Element& e) const { + return static_cast(e.nextstate); + return static_cast(e.nextstate + + e.ilabel * kPrime0 + + e.olabel * kPrime1); + } + + private: + }; + + class ElementEqual { + public: + bool operator()(const Element &e1, const Element &e2) const { + return (e1.ilabel == e2.ilabel) && (e1.olabel == e2.olabel) + && (e1.nextstate == e2.nextstate); + } + }; + + typedef unordered_map, + ElementKey, ElementEqual> ElementMap; + + const Fst &fst_; + // Distance from state being expanded in epsilon-closure. + vector *distance_; + // Shortest distance algorithm computation state. + ShortestDistanceState > sd_state_; + // Maps an element 'e' to a pair 'p' corresponding to a position + // in the arcs vector of the state being expanded. 'e' corresponds + // to the position 'p.second' in the 'arcs_' vector if 'p.first' is + // equal to the state being expanded. + ElementMap element_map_; + EpsilonArcFilter eps_filter_; + stack eps_queue_; // Queue used to visit the epsilon-closure + vector visited_; // '[i] = true' if state 'i' has been visited + slist visited_states_; // List of visited states + vector arcs_; // Arcs of state being expanded + Weight final_; // Final weight of state being expanded + StateId expand_id_; // Unique ID for each call to Expand + + DISALLOW_COPY_AND_ASSIGN(RmEpsilonState); +}; + +template +const size_t RmEpsilonState::kPrime0; +template +const size_t RmEpsilonState::kPrime1; + + +template +void RmEpsilonState::Expand(typename Arc::StateId source) { + final_ = Weight::Zero(); + arcs_.clear(); + sd_state_.ShortestDistance(source); + if (sd_state_.Error()) + return; + eps_queue_.push(source); + + while (!eps_queue_.empty()) { + StateId state = eps_queue_.top(); + eps_queue_.pop(); + + while (visited_.size() <= state) visited_.push_back(false); + if (visited_[state]) continue; + visited_[state] = true; + visited_states_.push_front(state); + + for (ArcIterator< Fst > ait(fst_, state); + !ait.Done(); + ait.Next()) { + Arc arc = ait.Value(); + arc.weight = Times((*distance_)[state], arc.weight); + + if (eps_filter_(arc)) { + while (visited_.size() <= arc.nextstate) + visited_.push_back(false); + if (!visited_[arc.nextstate]) + eps_queue_.push(arc.nextstate); + } else { + Element element(arc.ilabel, arc.olabel, arc.nextstate); + typename ElementMap::iterator it = element_map_.find(element); + if (it == element_map_.end()) { + element_map_.insert( + pair > + (element, pair(expand_id_, arcs_.size()))); + arcs_.push_back(arc); + } else { + if (((*it).second).first == expand_id_) { + Weight &w = arcs_[((*it).second).second].weight; + w = Plus(w, arc.weight); + } else { + ((*it).second).first = expand_id_; + ((*it).second).second = arcs_.size(); + arcs_.push_back(arc); + } + } + } + } + final_ = Plus(final_, Times((*distance_)[state], fst_.Final(state))); + } + + while (!visited_states_.empty()) { + visited_[visited_states_.front()] = false; + visited_states_.pop_front(); + } + ++expand_id_; +} + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version modifies +// its input. It allows fine control via the options argument; see +// below for a simpler interface. +// +// The vector 'distance' will be used to hold the shortest distances +// during the epsilon-closure computation. The state queue discipline +// and convergence delta are taken in the options argument. +template +void RmEpsilon(MutableFst *fst, + vector *distance, + const RmEpsilonOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + if (fst->Start() == kNoStateId) { + return; + } + + // 'noneps_in[s]' will be set to true iff 's' admits a non-epsilon + // incoming transition or is the start state. + vector noneps_in(fst->NumStates(), false); + noneps_in[fst->Start()] = true; + for (StateId i = 0; i < fst->NumStates(); ++i) { + for (ArcIterator > aiter(*fst, i); + !aiter.Done(); + aiter.Next()) { + if (aiter.Value().ilabel != 0 || aiter.Value().olabel != 0) + noneps_in[aiter.Value().nextstate] = true; + } + } + + // States sorted in topological order when (acyclic) or generic + // topological order (cyclic). + vector states; + states.reserve(fst->NumStates()); + + if (fst->Properties(kTopSorted, false) & kTopSorted) { + for (StateId i = 0; i < fst->NumStates(); i++) + states.push_back(i); + } else if (fst->Properties(kAcyclic, false) & kAcyclic) { + vector order; + bool acyclic; + TopOrderVisitor top_order_visitor(&order, &acyclic); + DfsVisit(*fst, &top_order_visitor, EpsilonArcFilter()); + // Sanity check: should be acyclic if property bit is set. + if(!acyclic) { + FSTERROR() << "RmEpsilon: inconsistent acyclic property bit"; + fst->SetProperties(kError, kError); + return; + } + states.resize(order.size()); + for (StateId i = 0; i < order.size(); i++) + states[order[i]] = i; + } else { + uint64 props; + vector scc; + SccVisitor scc_visitor(&scc, 0, 0, &props); + DfsVisit(*fst, &scc_visitor, EpsilonArcFilter()); + vector first(scc.size(), kNoStateId); + vector next(scc.size(), kNoStateId); + for (StateId i = 0; i < scc.size(); i++) { + if (first[scc[i]] != kNoStateId) + next[i] = first[scc[i]]; + first[scc[i]] = i; + } + for (StateId i = 0; i < first.size(); i++) + for (StateId j = first[i]; j != kNoStateId; j = next[j]) + states.push_back(j); + } + + RmEpsilonState + rmeps_state(*fst, distance, opts); + + while (!states.empty()) { + StateId state = states.back(); + states.pop_back(); + if (!noneps_in[state]) + continue; + rmeps_state.Expand(state); + fst->SetFinal(state, rmeps_state.Final()); + fst->DeleteArcs(state); + vector &arcs = rmeps_state.Arcs(); + fst->ReserveArcs(state, arcs.size()); + while (!arcs.empty()) { + fst->AddArc(state, arcs.back()); + arcs.pop_back(); + } + } + + for (StateId s = 0; s < fst->NumStates(); ++s) { + if (!noneps_in[s]) + fst->DeleteArcs(s); + } + + if(rmeps_state.Error()) + fst->SetProperties(kError, kError); + fst->SetProperties( + RmEpsilonProperties(fst->Properties(kFstProperties, false)), + kFstProperties); + + if (opts.weight_threshold != Weight::Zero() || + opts.state_threshold != kNoStateId) + Prune(fst, opts.weight_threshold, opts.state_threshold); + if (opts.connect && (opts.weight_threshold == Weight::Zero() || + opts.state_threshold != kNoStateId)) + Connect(fst); +} + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version modifies its +// input. It has a simplified interface; see above for a version that +// allows finer control. +// +// Complexity: +// - Time: +// - Unweighted: O(V2 + V E) +// - Acyclic: O(V2 + V E) +// - Tropical semiring: O(V2 log V + V E) +// - General: exponential +// - Space: O(V E) +// where V = # of states visited, E = # of arcs. +// +// References: +// - Mehryar Mohri. Generic Epsilon-Removal and Input +// Epsilon-Normalization Algorithms for Weighted Transducers, +// "International Journal of Computer Science", 13(1):129-143 (2002). +template +void RmEpsilon(MutableFst *fst, + bool connect = true, + typename Arc::Weight weight_threshold = Arc::Weight::Zero(), + typename Arc::StateId state_threshold = kNoStateId, + float delta = kDelta) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef typename Arc::Label Label; + + vector distance; + AutoQueue state_queue(*fst, &distance, EpsilonArcFilter()); + RmEpsilonOptions > + opts(&state_queue, delta, connect, weight_threshold, state_threshold); + + RmEpsilon(fst, &distance, opts); +} + + +struct RmEpsilonFstOptions : CacheOptions { + float delta; + + RmEpsilonFstOptions(const CacheOptions &opts, float delta = kDelta) + : CacheOptions(opts), delta(delta) {} + + explicit RmEpsilonFstOptions(float delta = kDelta) : delta(delta) {} +}; + + +// Implementation of delayed RmEpsilonFst. +template +class RmEpsilonFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + + RmEpsilonFstImpl(const Fst& fst, const RmEpsilonFstOptions &opts) + : CacheImpl(opts), + fst_(fst.Copy()), + delta_(opts.delta), + rmeps_state_( + *fst_, + &distance_, + RmEpsilonOptions >(&queue_, delta_, false)) { + SetType("rmepsilon"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(RmEpsilonProperties(props, true), kCopyProperties); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + RmEpsilonFstImpl(const RmEpsilonFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + delta_(impl.delta_), + rmeps_state_( + *fst_, + &distance_, + RmEpsilonOptions >(&queue_, delta_, false)) { + SetType("rmepsilon"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~RmEpsilonFstImpl() { + delete fst_; + } + + StateId Start() { + if (!HasStart()) { + SetStart(fst_->Start()); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + Expand(s); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && + (fst_->Properties(kError, false) || rmeps_state_.Error())) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + void Expand(StateId s) { + rmeps_state_.Expand(s); + SetFinal(s, rmeps_state_.Final()); + vector &arcs = rmeps_state_.Arcs(); + while (!arcs.empty()) { + PushArc(s, arcs.back()); + arcs.pop_back(); + } + SetArcs(s); + } + + private: + const Fst *fst_; + float delta_; + vector distance_; + FifoQueue queue_; + RmEpsilonState > rmeps_state_; + + void operator=(const RmEpsilonFstImpl &); // disallow +}; + + +// Removes epsilon-transitions (when both the input and output label +// are an epsilon) from a transducer. The result will be an equivalent +// FST that has no such epsilon transitions. This version is a +// delayed Fst. +// +// Complexity: +// - Time: +// - Unweighted: O(v^2 + v e) +// - General: exponential +// - Space: O(v e) +// where v = # of states visited, e = # of arcs visited. Constant time +// to visit an input state or arc is assumed and exclusive of caching. +// +// References: +// - Mehryar Mohri. Generic Epsilon-Removal and Input +// Epsilon-Normalization Algorithms for Weighted Transducers, +// "International Journal of Computer Science", 13(1):129-143 (2002). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class RmEpsilonFst : public ImplToFst< RmEpsilonFstImpl > { + public: + friend class ArcIterator< RmEpsilonFst >; + friend class StateIterator< RmEpsilonFst >; + + typedef A Arc; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef RmEpsilonFstImpl Impl; + + RmEpsilonFst(const Fst &fst) + : ImplToFst(new Impl(fst, RmEpsilonFstOptions())) {} + + RmEpsilonFst(const Fst &fst, const RmEpsilonFstOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + RmEpsilonFst(const RmEpsilonFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this RmEpsilonFst. See Fst<>::Copy() for further doc. + virtual RmEpsilonFst *Copy(bool safe = false) const { + return new RmEpsilonFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const RmEpsilonFst &fst); // disallow +}; + +// Specialization for RmEpsilonFst. +template +class StateIterator< RmEpsilonFst > + : public CacheStateIterator< RmEpsilonFst > { + public: + explicit StateIterator(const RmEpsilonFst &fst) + : CacheStateIterator< RmEpsilonFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for RmEpsilonFst. +template +class ArcIterator< RmEpsilonFst > + : public CacheArcIterator< RmEpsilonFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const RmEpsilonFst &fst, StateId s) + : CacheArcIterator< RmEpsilonFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void RmEpsilonFst::InitStateIterator(StateIteratorData *data) const { + data->base = new StateIterator< RmEpsilonFst >(*this); +} + + +// Useful alias when using StdArc. +typedef RmEpsilonFst StdRmEpsilonFst; + +} // namespace fst + +#endif // FST_LIB_RMEPSILON_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h b/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h new file mode 100755 index 00000000000..09c6969a277 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h @@ -0,0 +1,107 @@ +// rmfinalepsilon.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Function to remove of final states that have epsilon only input arcs. + +#ifndef FST_LIB_RMFINALEPSILON_H__ +#define FST_LIB_RMFINALEPSILON_H__ + +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +using std::vector; + +#include +#include + + +namespace fst { + +template +void RmFinalEpsilon(MutableFst* fst) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + // Determine the coaccesibility of states. + vector access; + vector coaccess; + uint64 props = 0; + SccVisitor scc_visitor(0, &access, &coaccess, &props); + DfsVisit(*fst, &scc_visitor); + + // Find potential list of removable final states. These are final states + // that have no outgoing transitions or final states that have a + // non-coaccessible future. Complexity O(S) + unordered_set finals; + for (StateIterator > siter(*fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (fst->Final(s) != Weight::Zero()) { + bool future_coaccess = false; + for (ArcIterator > aiter(*fst, s); !aiter.Done(); aiter.Next()) { + const A& arc = aiter.Value(); + if (coaccess[arc.nextstate]) { + future_coaccess = true; + break; + } + } + if (!future_coaccess) { + finals.insert(s); + } + } + } + + // Move the final weight. Complexity O(E) + vector arcs; + for (StateIterator > siter(*fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + Weight w(fst->Final(s)); + + arcs.clear(); + for (ArcIterator > aiter(*fst, s); !aiter.Done(); aiter.Next()) { + const A& arc = aiter.Value(); + // is next state in the list of finals + if (finals.find(arc.nextstate) != finals.end()) { + // sum up all epsilon arcs + if (arc.ilabel == 0 && arc.olabel == 0) { + w = Plus(Times(fst->Final(arc.nextstate), arc.weight), w); + } else { + arcs.push_back(arc); + } + } else { + arcs.push_back(arc); + } + } + + // If some arcs (epsilon arcs) were deleted, delete all + // arcs and add back only the non epsilon arcs + if (arcs.size() < fst->NumArcs(s)) { + fst->DeleteArcs(s); + fst->SetFinal(s, w); + for (size_t i = 0; i < arcs.size(); ++i) { + fst->AddArc(s, arcs[i]); + } + } + } + + Connect(fst); +} + +} // namespace fst + +#endif // FST_LIB_RMFINALEPSILON_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h.bak b/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h.bak new file mode 100755 index 00000000000..eb0f9373a27 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/rmfinalepsilon.h.bak @@ -0,0 +1,107 @@ +// rmfinalepsilon.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: johans@google.com (Johan Schalkwyk) +// +// \file +// Function to remove of final states that have epsilon only input arcs. + +#ifndef FST_LIB_RMFINALEPSILON_H__ +#define FST_LIB_RMFINALEPSILON_H__ + +#include +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +using std::vector; + +#include +#include + + +namespace fst { + +template +void RmFinalEpsilon(MutableFst* fst) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + // Determine the coaccesibility of states. + vector access; + vector coaccess; + uint64 props = 0; + SccVisitor scc_visitor(0, &access, &coaccess, &props); + DfsVisit(*fst, &scc_visitor); + + // Find potential list of removable final states. These are final states + // that have no outgoing transitions or final states that have a + // non-coaccessible future. Complexity O(S) + unordered_set finals; + for (StateIterator > siter(*fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + if (fst->Final(s) != Weight::Zero()) { + bool future_coaccess = false; + for (ArcIterator > aiter(*fst, s); !aiter.Done(); aiter.Next()) { + const A& arc = aiter.Value(); + if (coaccess[arc.nextstate]) { + future_coaccess = true; + break; + } + } + if (!future_coaccess) { + finals.insert(s); + } + } + } + + // Move the final weight. Complexity O(E) + vector arcs; + for (StateIterator > siter(*fst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + Weight w(fst->Final(s)); + + arcs.clear(); + for (ArcIterator > aiter(*fst, s); !aiter.Done(); aiter.Next()) { + const A& arc = aiter.Value(); + // is next state in the list of finals + if (finals.find(arc.nextstate) != finals.end()) { + // sum up all epsilon arcs + if (arc.ilabel == 0 && arc.olabel == 0) { + w = Plus(Times(fst->Final(arc.nextstate), arc.weight), w); + } else { + arcs.push_back(arc); + } + } else { + arcs.push_back(arc); + } + } + + // If some arcs (epsilon arcs) were deleted, delete all + // arcs and add back only the non epsilon arcs + if (arcs.size() < fst->NumArcs(s)) { + fst->DeleteArcs(s); + fst->SetFinal(s, w); + for (size_t i = 0; i < arcs.size(); ++i) { + fst->AddArc(s, arcs[i]); + } + } + } + + Connect(fst); +} + +} // namespace fst + +#endif // FST_LIB_RMFINALEPSILON_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h b/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h new file mode 100755 index 00000000000..e95613fc0cb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h @@ -0,0 +1,49 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_ARCSORT_H_ +#define FST_SCRIPT_ARCSORT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +enum ArcSortType { ILABEL_COMPARE, OLABEL_COMPARE }; + +typedef args::Package ArcSortArgs; + +template +void ArcSort(ArcSortArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + + if (args->arg2 == ILABEL_COMPARE) { + ILabelCompare icomp; + ArcSort(fst, icomp); + } else { // OLABEL_COMPARE + OLabelCompare ocomp; + ArcSort(fst, ocomp); + } +} + +void OPENFSTDLL ArcSort(MutableFstClass *ofst, ArcSortType sort_type); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_ARCSORT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h.bak new file mode 100755 index 00000000000..42773329876 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/arcsort.h.bak @@ -0,0 +1,49 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_ARCSORT_H_ +#define FST_SCRIPT_ARCSORT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +enum ArcSortType { ILABEL_COMPARE, OLABEL_COMPARE }; + +typedef args::Package ArcSortArgs; + +template +void ArcSort(ArcSortArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + + if (args->arg2 == ILABEL_COMPARE) { + ILabelCompare icomp; + ArcSort(fst, icomp); + } else { // OLABEL_COMPARE + OLabelCompare ocomp; + ArcSort(fst, ocomp); + } +} + +void ArcSort(MutableFstClass *ofst, ArcSortType sort_type); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_ARCSORT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/arg-packs.h b/extlibs/openfstwin-1.3.1/include/fst/script/arg-packs.h new file mode 100755 index 00000000000..8ebf8d8eb61 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/arg-packs.h @@ -0,0 +1,240 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Convenience templates for defining arg packs for the FstClass operations. + +// See operation-templates.h for a discussion about why these are needed; the +// short story is that all FstClass operations must be implemented by a version +// that takes one argument, most likely a struct bundling all the +// logical arguments together. These template structs provide convenient ways +// to specify these bundles (e.g. by means of appropriate typedefs). + +// The ArgPack template is sufficient for bundling together all the args for +// a particular function. The function is assumed to be void-returning. If +// you want a space for a return value, use the WithReturnValue template +// as follows: + +// WithReturnValue > + +#ifndef FST_SCRIPT_ARG_PACKS_H_ +#define FST_SCRIPT_ARG_PACKS_H_ + +namespace fst { +namespace script { +namespace args { + +// Sentinel value that means "no arg here." +class none_type { }; + +// Base arg pack template class. Specializations follow that allow +// fewer numbers of arguments (down to 2). If the maximum number of arguments +// increases, you will need to change three things: +// 1) Add more template parameters to this template +// 2) Add more specializations to allow fewer numbers of parameters than +// the new max. +// 3) Add extra none_types to all existing specializations to fill +// the new slots. + + +// 9 args (max) +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + T5 arg5; + T6 arg6; + T7 arg7; + T8 arg8; + T9 arg9; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, + T7 arg7, T8 arg8, T9 arg9) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5), + arg6(arg6), arg7(arg7), arg8(arg8), arg9(arg9) { } +}; + +// 8 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + T5 arg5; + T6 arg6; + T7 arg7; + T8 arg8; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, + T7 arg7, T8 arg8) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5), + arg6(arg6), arg7(arg7), arg8(arg8) { } +}; + +// 7 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + T5 arg5; + T6 arg6; + T7 arg7; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, + T7 arg7) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5), + arg6(arg6), arg7(arg7) { } +}; + +// 6 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + T5 arg5; + T6 arg6; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5), + arg6(arg6) { } +}; + +// 5 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + T5 arg5; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4), arg5(arg5) { } +}; + +// 4 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + T4 arg4; + + Package(T1 arg1, T2 arg2, T3 arg3, T4 arg4) : + arg1(arg1), arg2(arg2), arg3(arg3), arg4(arg4) { } +}; + +// 3 args +template +struct Package { + T1 arg1; + T2 arg2; + T3 arg3; + + Package(T1 arg1, T2 arg2, T3 arg3) : + arg1(arg1), arg2(arg2), arg3(arg3) { } +}; + +// 2 args (minimum) +template +struct Package { + T1 arg1; + T2 arg2; + + Package(T1 arg1, T2 arg2) : + arg1(arg1), arg2(arg2) { } +}; + +// Tack this on to an existing arg pack to add a return value. +// The syntax for accessing the args is then slightly more stilted, +// as you must do an extra member access (since the args are stored +// as a member of this class). +// The alternative is to declare another slew of templates for functions +// that return a value, analogous to the above. + +template +struct WithReturnValue { + Retval retval; + const ArgPackage &args; + + explicit WithReturnValue(const ArgPackage &args) : args(args) { } +}; + +// We don't want to store a reference to a reference, if ArgPackage is +// already some reference type. +template +struct WithReturnValue { + Retval retval; + const ArgPackage &args; + + explicit WithReturnValue(const ArgPackage &args) : args(args) { } +}; + +} // namespace args +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_ARG_PACKS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/closure.h b/extlibs/openfstwin-1.3.1/include/fst/script/closure.h new file mode 100755 index 00000000000..98420f9ac40 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/closure.h @@ -0,0 +1,41 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CLOSURE_H_ +#define FST_SCRIPT_CLOSURE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ClosureArgs; + +template +void Closure(ClosureArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + + Closure(fst, args->arg2); +} + +void OPENFSTDLL Closure(MutableFstClass *ofst, ClosureType closure_type); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_CLOSURE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/closure.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/closure.h.bak new file mode 100755 index 00000000000..93b5ec36c33 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/closure.h.bak @@ -0,0 +1,41 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CLOSURE_H_ +#define FST_SCRIPT_CLOSURE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ClosureArgs; + +template +void Closure(ClosureArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + + Closure(fst, args->arg2); +} + +void Closure(MutableFstClass *ofst, ClosureType closure_type); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_CLOSURE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h b/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h new file mode 100755 index 00000000000..16dc9c28eba --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h @@ -0,0 +1,216 @@ +// compile.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to to compile a binary Fst from textual input. + +#ifndef FST_SCRIPT_COMPILE_IMPL_H_ +#define FST_SCRIPT_COMPILE_IMPL_H_ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +using std::vector; + +#include +#include +#include +#include +#include +#include + +DECLARE_string(fst_field_separator); + +namespace fst { + +// Compile a binary Fst from textual input, helper class for fstcompile.cc +// WARNING: Stand-alone use of this class not recommended, most code should +// read/write using the binary format which is much more efficient. +template class FstCompiler { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + // WARNING: use of 'allow_negative_labels = true' not recommended; may + // cause conflicts + FstCompiler(istream &istrm, const string &source, + const SymbolTable *isyms, const SymbolTable *osyms, + const SymbolTable *ssyms, bool accep, bool ikeep, + bool okeep, bool nkeep, bool allow_negative_labels = false) + : nline_(0), source_(source), + isyms_(isyms), osyms_(osyms), ssyms_(ssyms), + nstates_(0), keep_state_numbering_(nkeep), + allow_negative_labels_(allow_negative_labels) { + char line[kLineLen]; + while (istrm.getline(line, kLineLen)) { + ++nline_; + vector col; + string separator = FLAGS_fst_field_separator + "\n"; + SplitToVector(line, separator.c_str(), &col, true); + if (col.size() == 0 || col[0][0] == '\0') // empty line + continue; + if (col.size() > 5 || + (col.size() > 4 && accep) || + (col.size() == 3 && !accep)) { + FSTERROR() << "FstCompiler: Bad number of columns, source = " + << source_ + << ", line = " << nline_; + fst_.SetProperties(kError, kError); + return; + } + StateId s = StrToStateId(col[0]); + while (s >= fst_.NumStates()) + fst_.AddState(); + if (nline_ == 1) + fst_.SetStart(s); + + Arc arc; + StateId d = s; + switch (col.size()) { + case 1: + fst_.SetFinal(s, Weight::One()); + break; + case 2: + fst_.SetFinal(s, StrToWeight(col[1], true)); + break; + case 3: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + arc.olabel = arc.ilabel; + arc.weight = Weight::One(); + fst_.AddArc(s, arc); + break; + case 4: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + if (accep) { + arc.olabel = arc.ilabel; + arc.weight = StrToWeight(col[3], false); + } else { + arc.olabel = StrToOLabel(col[3]); + arc.weight = Weight::One(); + } + fst_.AddArc(s, arc); + break; + case 5: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + arc.olabel = StrToOLabel(col[3]); + arc.weight = StrToWeight(col[4], false); + fst_.AddArc(s, arc); + } + while (d >= fst_.NumStates()) + fst_.AddState(); + } + if (ikeep) + fst_.SetInputSymbols(isyms); + if (okeep) + fst_.SetOutputSymbols(osyms); + } + + const VectorFst &Fst() const { + return fst_; + } + + private: + // Maximum line length in text file. + static const int kLineLen = 8096; + + int64 StrToId(const char *s, const SymbolTable *syms, + const char *name, bool allow_negative = false) const { + int64 n = 0; + + if (syms) { + n = syms->Find(s); + if (n == -1 || (!allow_negative && n < 0)) { + FSTERROR() << "FstCompiler: Symbol \"" << s + << "\" is not mapped to any integer " << name + << ", symbol table = " << syms->Name() + << ", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + } + } else { + char *p; + n = strtoll(s, &p, 10); + if (p < s + strlen(s) || (!allow_negative && n < 0)) { + FSTERROR() << "FstCompiler: Bad " << name << " integer = \"" << s + << "\", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + } + } + return n; + } + + StateId StrToStateId(const char *s) { + StateId n = StrToId(s, ssyms_, "state ID"); + + if (keep_state_numbering_) + return n; + + // remap state IDs to make dense set + typename unordered_map::const_iterator it = states_.find(n); + if (it == states_.end()) { + states_[n] = nstates_; + return nstates_++; + } else { + return it->second; + } + } + + StateId StrToILabel(const char *s) const { + return StrToId(s, isyms_, "arc ilabel", allow_negative_labels_); + } + + StateId StrToOLabel(const char *s) const { + return StrToId(s, osyms_, "arc olabel", allow_negative_labels_); + } + + Weight StrToWeight(const char *s, bool allow_zero) const { + Weight w; + istringstream strm(s); + strm >> w; + if (!strm || (!allow_zero && w == Weight::Zero())) { + FSTERROR() << "FstCompiler: Bad weight = \"" << s + << "\", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + w = Weight::NoWeight(); + } + return w; + } + + mutable VectorFst fst_; + size_t nline_; + string source_; // text FST source name + const SymbolTable *isyms_; // ilabel symbol table + const SymbolTable *osyms_; // olabel symbol table + const SymbolTable *ssyms_; // slabel symbol table + unordered_map states_; // state ID map + StateId nstates_; // number of seen states + bool keep_state_numbering_; + bool allow_negative_labels_; // not recommended; may cause conflicts + + DISALLOW_COPY_AND_ASSIGN(FstCompiler); +}; + +} // namespace fst + +#endif // FST_SCRIPT_COMPILE_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h.bak new file mode 100755 index 00000000000..68f37c39f56 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/compile-impl.h.bak @@ -0,0 +1,216 @@ +// compile.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to to compile a binary Fst from textual input. + +#ifndef FST_SCRIPT_COMPILE_IMPL_H_ +#define FST_SCRIPT_COMPILE_IMPL_H_ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +#include +using std::vector; + +#include +#include +#include +#include +#include +#include + +DECLARE_string(fst_field_separator); + +namespace fst { + +// Compile a binary Fst from textual input, helper class for fstcompile.cc +// WARNING: Stand-alone use of this class not recommended, most code should +// read/write using the binary format which is much more efficient. +template class FstCompiler { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + // WARNING: use of 'allow_negative_labels = true' not recommended; may + // cause conflicts + FstCompiler(istream &istrm, const string &source, + const SymbolTable *isyms, const SymbolTable *osyms, + const SymbolTable *ssyms, bool accep, bool ikeep, + bool okeep, bool nkeep, bool allow_negative_labels = false) + : nline_(0), source_(source), + isyms_(isyms), osyms_(osyms), ssyms_(ssyms), + nstates_(0), keep_state_numbering_(nkeep), + allow_negative_labels_(allow_negative_labels) { + char line[kLineLen]; + while (istrm.getline(line, kLineLen)) { + ++nline_; + vector col; + string separator = FLAGS_fst_field_separator + "\n"; + SplitToVector(line, separator.c_str(), &col, true); + if (col.size() == 0 || col[0][0] == '\0') // empty line + continue; + if (col.size() > 5 || + (col.size() > 4 && accep) || + (col.size() == 3 && !accep)) { + FSTERROR() << "FstCompiler: Bad number of columns, source = " + << source_ + << ", line = " << nline_; + fst_.SetProperties(kError, kError); + return; + } + StateId s = StrToStateId(col[0]); + while (s >= fst_.NumStates()) + fst_.AddState(); + if (nline_ == 1) + fst_.SetStart(s); + + Arc arc; + StateId d = s; + switch (col.size()) { + case 1: + fst_.SetFinal(s, Weight::One()); + break; + case 2: + fst_.SetFinal(s, StrToWeight(col[1], true)); + break; + case 3: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + arc.olabel = arc.ilabel; + arc.weight = Weight::One(); + fst_.AddArc(s, arc); + break; + case 4: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + if (accep) { + arc.olabel = arc.ilabel; + arc.weight = StrToWeight(col[3], false); + } else { + arc.olabel = StrToOLabel(col[3]); + arc.weight = Weight::One(); + } + fst_.AddArc(s, arc); + break; + case 5: + arc.nextstate = d = StrToStateId(col[1]); + arc.ilabel = StrToILabel(col[2]); + arc.olabel = StrToOLabel(col[3]); + arc.weight = StrToWeight(col[4], false); + fst_.AddArc(s, arc); + } + while (d >= fst_.NumStates()) + fst_.AddState(); + } + if (ikeep) + fst_.SetInputSymbols(isyms); + if (okeep) + fst_.SetOutputSymbols(osyms); + } + + const VectorFst &Fst() const { + return fst_; + } + + private: + // Maximum line length in text file. + static const int kLineLen = 8096; + + int64 StrToId(const char *s, const SymbolTable *syms, + const char *name, bool allow_negative = false) const { + int64 n = 0; + + if (syms) { + n = syms->Find(s); + if (n == -1 || (!allow_negative && n < 0)) { + FSTERROR() << "FstCompiler: Symbol \"" << s + << "\" is not mapped to any integer " << name + << ", symbol table = " << syms->Name() + << ", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + } + } else { + char *p; + n = strtoll(s, &p, 10); + if (p < s + strlen(s) || (!allow_negative && n < 0)) { + FSTERROR() << "FstCompiler: Bad " << name << " integer = \"" << s + << "\", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + } + } + return n; + } + + StateId StrToStateId(const char *s) { + StateId n = StrToId(s, ssyms_, "state ID"); + + if (keep_state_numbering_) + return n; + + // remap state IDs to make dense set + typename unordered_map::const_iterator it = states_.find(n); + if (it == states_.end()) { + states_[n] = nstates_; + return nstates_++; + } else { + return it->second; + } + } + + StateId StrToILabel(const char *s) const { + return StrToId(s, isyms_, "arc ilabel", allow_negative_labels_); + } + + StateId StrToOLabel(const char *s) const { + return StrToId(s, osyms_, "arc olabel", allow_negative_labels_); + } + + Weight StrToWeight(const char *s, bool allow_zero) const { + Weight w; + istringstream strm(s); + strm >> w; + if (!strm || (!allow_zero && w == Weight::Zero())) { + FSTERROR() << "FstCompiler: Bad weight = \"" << s + << "\", source = " << source_ << ", line = " << nline_; + fst_.SetProperties(kError, kError); + w = Weight::NoWeight(); + } + return w; + } + + mutable VectorFst fst_; + size_t nline_; + string source_; // text FST source name + const SymbolTable *isyms_; // ilabel symbol table + const SymbolTable *osyms_; // olabel symbol table + const SymbolTable *ssyms_; // slabel symbol table + unordered_map states_; // state ID map + StateId nstates_; // number of seen states + bool keep_state_numbering_; + bool allow_negative_labels_; // not recommended; may cause conflicts + + DISALLOW_COPY_AND_ASSIGN(FstCompiler); +}; + +} // namespace fst + +#endif // FST_SCRIPT_COMPILE_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/compile.h b/extlibs/openfstwin-1.3.1/include/fst/script/compile.h new file mode 100755 index 00000000000..ba4fee3a4f1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/compile.h @@ -0,0 +1,92 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_COMPILE_H_ +#define FST_SCRIPT_COMPILE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FstCompileArgs { + fst::istream &istrm; + const string &source; + const string &dest; + const string &fst_type; + const fst::SymbolTable *isyms; + const fst::SymbolTable *osyms; + const fst::SymbolTable *ssyms; + const bool accep; + const bool ikeep; + const bool okeep; + const bool nkeep; + const bool allow_negative_labels; + + FstCompileArgs(istream &istrm, const string &source, const string &dest, + const string &fst_type, const fst::SymbolTable *isyms, + const fst::SymbolTable *osyms, + const fst::SymbolTable *ssyms, + bool accep, bool ikeep, bool okeep, bool nkeep, + bool allow_negative_labels = false) : + istrm(istrm), source(source), dest(dest), fst_type(fst_type), + isyms(isyms), osyms(osyms), ssyms(ssyms), accep(accep), ikeep(ikeep), + okeep(okeep), nkeep(nkeep), + allow_negative_labels(allow_negative_labels) { } +}; + +template +void CompileFst(FstCompileArgs *args) { + using fst::FstCompiler; + using fst::Convert; + using fst::Fst; + + FstCompiler fstcompiler(args->istrm, args->source, args->isyms, + args->osyms, args->ssyms, + args->accep, args->ikeep, + args->okeep, args->nkeep, + args->allow_negative_labels); + + const Fst *fst = &fstcompiler.Fst(); + if (args->fst_type != "vector") { + fst = Convert(*fst, args->fst_type); + if (!fst) { + FSTERROR() << "Failed to convert FST to desired type: " + << args->fst_type; + return; + } + } + + fst->Write(args->dest); +} + +void OPENFSTDLL CompileFst(istream &istrm, const string &source, const string &dest, + const string &fst_type, const string &arc_type, + const SymbolTable *isyms, + const SymbolTable *osyms, const SymbolTable *ssyms, + bool accep, bool ikeep, bool okeep, bool nkeep, + bool allow_negative_labels); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_COMPILE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/compose.h b/extlibs/openfstwin-1.3.1/include/fst/script/compose.h new file mode 100755 index 00000000000..03d7b66a3a1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/compose.h @@ -0,0 +1,63 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_COMPOSE_H_ +#define FST_SCRIPT_COMPOSE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ComposeArgs1; + +template +void Compose(ComposeArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Compose(ifst1, ifst2, ofst, args->arg4); +} + +typedef fst::ComposeOptions ComposeOptions; + +typedef args::Package ComposeArgs2; + +template +void Compose(ComposeArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Compose(ifst1, ifst2, ofst, args->arg4); +} + +void OPENFSTDLL Compose(const FstClass &ifst1, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + +void OPENFSTDLL Compose(const FstClass &ifst1, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, ComposeFilter compose_filter); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_COMPOSE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/compose.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/compose.h.bak new file mode 100755 index 00000000000..96375f75bd0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/compose.h.bak @@ -0,0 +1,63 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_COMPOSE_H_ +#define FST_SCRIPT_COMPOSE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ComposeArgs1; + +template +void Compose(ComposeArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Compose(ifst1, ifst2, ofst, args->arg4); +} + +typedef fst::ComposeOptions ComposeOptions; + +typedef args::Package ComposeArgs2; + +template +void Compose(ComposeArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Compose(ifst1, ifst2, ofst, args->arg4); +} + +void Compose(const FstClass &ifst1, const FstClass &ifst2, + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + +void Compose(const FstClass &ifst1, const FstClass &ifst2, + MutableFstClass *ofst, ComposeFilter compose_filter); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_COMPOSE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/concat.h b/extlibs/openfstwin-1.3.1/include/fst/script/concat.h new file mode 100755 index 00000000000..ed14221d97e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/concat.h @@ -0,0 +1,54 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONCAT_H_ +#define FST_SCRIPT_CONCAT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ConcatArgs1; +typedef args::Package ConcatArgs2; + +template +void Concat(ConcatArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + const Fst &ifst = *(args->arg2.GetFst()); + + Concat(ofst, ifst); +} + +template +void Concat(ConcatArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + Concat(ifst, ofst); +} + +void OPENFSTDLL Concat(MutableFstClass *ofst, const FstClass &ifst); //ChangedPD +void OPENFSTDLL Concat(const FstClass &ifst, MutableFstClass *ofst); //ChangedPD + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_CONCAT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/concat.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/concat.h.bak new file mode 100755 index 00000000000..46c4407e5b4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/concat.h.bak @@ -0,0 +1,54 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONCAT_H_ +#define FST_SCRIPT_CONCAT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ConcatArgs1; +typedef args::Package ConcatArgs2; + +template +void Concat(ConcatArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + const Fst &ifst = *(args->arg2.GetFst()); + + Concat(ofst, ifst); +} + +template +void Concat(ConcatArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + Concat(ifst, ofst); +} + +void Concat(MutableFstClass *ofst, const FstClass &ifst); +void Concat(const FstClass &ifst, MutableFstClass *ofst); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_CONCAT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/connect.h b/extlibs/openfstwin-1.3.1/include/fst/script/connect.h new file mode 100755 index 00000000000..6e6b0790c9f --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/connect.h @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONNECT_H_ +#define FST_SCRIPT_CONNECT_H_ + +#include +#include +#include +#include + +namespace fst { +namespace script { + +// This function confuses SWIG, because both versions have the same args +#ifndef SWIG +template +void Connect(MutableFstClass *fst) { + MutableFst *typed_fst = fst->GetMutableFst(); + + Connect(typed_fst); +} +#endif + +void OPENFSTDLL Connect(MutableFstClass *fst); //ChangedPD + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_CONNECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/connect.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/connect.h.bak new file mode 100755 index 00000000000..19c43909063 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/connect.h.bak @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONNECT_H_ +#define FST_SCRIPT_CONNECT_H_ + +#include +#include +#include +#include + +namespace fst { +namespace script { + +// This function confuses SWIG, because both versions have the same args +#ifndef SWIG +template +void Connect(MutableFstClass *fst) { + MutableFst *typed_fst = fst->GetMutableFst(); + + Connect(typed_fst); +} +#endif + +void Connect(MutableFstClass *fst); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_CONNECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/convert.h b/extlibs/openfstwin-1.3.1/include/fst/script/convert.h new file mode 100755 index 00000000000..5f4483158c3 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/convert.h @@ -0,0 +1,49 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONVERT_H_ +#define FST_SCRIPT_CONVERT_H_ + +#include + +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ConvertInnerArgs; +typedef args::WithReturnValue ConvertArgs; + +template +void Convert(ConvertArgs *args) { + const Fst &fst = *(args->args.arg1.GetFst()); + const string &new_type = args->args.arg2; + + Fst *result = Convert(fst, new_type); + args->retval = new FstClass(result); + delete result; +} + +#ifdef SWIG +%newobject Convert; +#endif +FstClass OPENFSTDLL *Convert(const FstClass& f, const string &new_type); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_CONVERT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/convert.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/convert.h.bak new file mode 100755 index 00000000000..2c70a7064e7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/convert.h.bak @@ -0,0 +1,49 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_CONVERT_H_ +#define FST_SCRIPT_CONVERT_H_ + +#include + +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ConvertInnerArgs; +typedef args::WithReturnValue ConvertArgs; + +template +void Convert(ConvertArgs *args) { + const Fst &fst = *(args->args.arg1.GetFst()); + const string &new_type = args->args.arg2; + + Fst *result = Convert(fst, new_type); + args->retval = new FstClass(result); + delete result; +} + +#ifdef SWIG +%newobject Convert; +#endif +FstClass *Convert(const FstClass& f, const string &new_type); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_CONVERT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/decode.h b/extlibs/openfstwin-1.3.1/include/fst/script/decode.h new file mode 100755 index 00000000000..44440f19cc8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/decode.h @@ -0,0 +1,46 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DECODE_H_ +#define FST_SCRIPT_DECODE_H_ + +#include + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package DecodeArgs; + +template +void Decode(DecodeArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + EncodeMapper *decoder = EncodeMapper::Read(args->arg2, DECODE); + Decode(ofst, *decoder); + + delete decoder; +} + +void OPENFSTDLL Decode(MutableFstClass *fst, const string &coder_fname); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_DECODE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/decode.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/decode.h.bak new file mode 100755 index 00000000000..1064ad51768 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/decode.h.bak @@ -0,0 +1,46 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DECODE_H_ +#define FST_SCRIPT_DECODE_H_ + +#include + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package DecodeArgs; + +template +void Decode(DecodeArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + EncodeMapper *decoder = EncodeMapper::Read(args->arg2, DECODE); + Decode(ofst, *decoder); + + delete decoder; +} + +void Decode(MutableFstClass *fst, const string &coder_fname); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_DECODE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h b/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h new file mode 100755 index 00000000000..0d784edb3f1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h @@ -0,0 +1,68 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DETERMINIZE_H_ +#define FST_SCRIPT_DETERMINIZE_H_ + +#include +#include +#include +#include + +namespace fst { +namespace script { + +struct DeterminizeOptions { + float delta; + WeightClass weight_threshold; + int64 state_threshold; + int64 subsequential_label; + + explicit DeterminizeOptions(float d = fst::kDelta, + WeightClass w = + fst::script::WeightClass::Zero(), + int64 n = fst::kNoStateId, int64 l = 0) + : delta(d), weight_threshold(w), state_threshold(n), + subsequential_label(l) {} +}; + +typedef args::Package DeterminizeArgs; + +template +void Determinize(DeterminizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + const DeterminizeOptions &opts = args->arg3; + + fst::DeterminizeOptions detargs; + detargs.delta = opts.delta; + detargs.weight_threshold = + *(opts.weight_threshold.GetWeight()); + detargs.state_threshold = opts.state_threshold; + detargs.subsequential_label = opts.subsequential_label; + + Determinize(ifst, ofst, detargs); +} + +void OPENFSTDLL Determinize(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + const DeterminizeOptions &opts = + fst::script::DeterminizeOptions()); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_DETERMINIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h.bak new file mode 100755 index 00000000000..38fd7ad04a9 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/determinize.h.bak @@ -0,0 +1,68 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DETERMINIZE_H_ +#define FST_SCRIPT_DETERMINIZE_H_ + +#include +#include +#include +#include + +namespace fst { +namespace script { + +struct DeterminizeOptions { + float delta; + WeightClass weight_threshold; + int64 state_threshold; + int64 subsequential_label; + + explicit DeterminizeOptions(float d = fst::kDelta, + WeightClass w = + fst::script::WeightClass::Zero(), + int64 n = fst::kNoStateId, int64 l = 0) + : delta(d), weight_threshold(w), state_threshold(n), + subsequential_label(l) {} +}; + +typedef args::Package DeterminizeArgs; + +template +void Determinize(DeterminizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + const DeterminizeOptions &opts = args->arg3; + + fst::DeterminizeOptions detargs; + detargs.delta = opts.delta; + detargs.weight_threshold = + *(opts.weight_threshold.GetWeight()); + detargs.state_threshold = opts.state_threshold; + detargs.subsequential_label = opts.subsequential_label; + + Determinize(ifst, ofst, detargs); +} + +void Determinize(const FstClass &ifst, MutableFstClass *ofst, + const DeterminizeOptions &opts = + fst::script::DeterminizeOptions()); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_DETERMINIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/difference.h b/extlibs/openfstwin-1.3.1/include/fst/script/difference.h new file mode 100755 index 00000000000..22e403679ce --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/difference.h @@ -0,0 +1,67 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DIFFERENCE_H_ +#define FST_SCRIPT_DIFFERENCE_H_ + +#include +#include +#include // for ComposeFilter +#include + +namespace fst { +namespace script { + +typedef args::Package DifferenceArgs1; + +template +void Difference(DifferenceArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Difference(ifst1, ifst2, ofst, args->arg4); +} + +typedef args::Package DifferenceArgs2; + +template +void Difference(DifferenceArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Difference(ifst1, ifst2, ofst, args->arg4); +} + + +void OPENFSTDLL Difference(const FstClass &ifst1, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, + ComposeFilter compose_filter); + +void OPENFSTDLL Difference(const FstClass &ifst1, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_DIFFERENCE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/difference.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/difference.h.bak new file mode 100755 index 00000000000..76490d495b7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/difference.h.bak @@ -0,0 +1,67 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DIFFERENCE_H_ +#define FST_SCRIPT_DIFFERENCE_H_ + +#include +#include +#include // for ComposeFilter +#include + +namespace fst { +namespace script { + +typedef args::Package DifferenceArgs1; + +template +void Difference(DifferenceArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Difference(ifst1, ifst2, ofst, args->arg4); +} + +typedef args::Package DifferenceArgs2; + +template +void Difference(DifferenceArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Difference(ifst1, ifst2, ofst, args->arg4); +} + + +void Difference(const FstClass &ifst1, const FstClass &ifst2, + MutableFstClass *ofst, + ComposeFilter compose_filter); + +void Difference(const FstClass &ifst1, const FstClass &ifst2, + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_DIFFERENCE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/draw-impl.h b/extlibs/openfstwin-1.3.1/include/fst/script/draw-impl.h new file mode 100755 index 00000000000..e346649a118 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/draw-impl.h @@ -0,0 +1,234 @@ +// draw.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Class to draw a binary FST by producing a text file in dot format, +// helper class to fstdraw.cc + +#ifndef FST_SCRIPT_DRAW_IMPL_H_ +#define FST_SCRIPT_DRAW_IMPL_H_ + +#include +#include + +#include +#include +#include + +namespace fst { + +// Print a binary Fst in the dot textual format, helper class for fstdraw.cc +// WARNING: Stand-alone use not recommend. +template class FstDrawer { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + FstDrawer(const Fst &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + string title, + float width, + float height, + bool portrait, + bool vertical, + float ranksep, + float nodesep, + int fontsize, + int precision, + bool show_weight_one) + : fst_(fst), isyms_(isyms), osyms_(osyms), ssyms_(ssyms), + accep_(accep && fst.Properties(kAcceptor, true)), ostrm_(0), + title_(title), width_(width), height_(height), portrait_(portrait), + vertical_(vertical), ranksep_(ranksep), nodesep_(nodesep), + fontsize_(fontsize), precision_(precision), + show_weight_one_(show_weight_one) {} + + // Draw Fst to an output buffer (or stdout if buf = 0) + void Draw(ostream *strm, const string &dest) { + ostrm_ = strm; + dest_ = dest; + StateId start = fst_.Start(); + if (start == kNoStateId) + return; + + PrintString("digraph FST {\n"); + if (vertical_) + PrintString("rankdir = BT;\n"); + else + PrintString("rankdir = LR;\n"); + PrintString("size = \""); + Print(width_); + PrintString(","); + Print(height_); + PrintString("\";\n"); + if (!dest_.empty()) + PrintString("label = \"" + title_ + "\";\n"); + PrintString("center = 1;\n"); + if (portrait_) + PrintString("orientation = Portrait;\n"); + else + PrintString("orientation = Landscape;\n"); + PrintString("ranksep = \""); + Print(ranksep_); + PrintString("\";\n"); + PrintString("nodesep = \""); + Print(nodesep_); + PrintString("\";\n"); + // initial state first + DrawState(start); + for (StateIterator< Fst > siter(fst_); + !siter.Done(); + siter.Next()) { + StateId s = siter.Value(); + if (s != start) + DrawState(s); + } + PrintString("}\n"); + } + + private: + // Maximum line length in text file. + static const int kLineLen = 8096; + + void PrintString(const string &s) const { + *ostrm_ << s; + } + + // Escapes backslash and double quote if these occur in the string. Dot will + // not deal gracefully with these if they are not escaped. + inline void EscapeChars(const string &s, string* ns) const { + const char* c = s.c_str(); + while (*c) { + if (*c == '\\' || *c == '"') ns->push_back('\\'); + ns->push_back(*c); + ++c; + } + } + + void PrintId(int64 id, const SymbolTable *syms, + const char *name) const { + if (syms) { + string symbol = syms->Find(id); + if (symbol == "") { + FSTERROR() << "FstDrawer: Integer " << id + << " is not mapped to any textual symbol" + << ", symbol table = " << syms->Name() + << ", destination = " << dest_; + symbol = "?"; + } + string nsymbol; + EscapeChars(symbol, &nsymbol); + PrintString(nsymbol); + } else { + ostringstream sid; + sid << id; + PrintString(sid.str()); + } + } + + void PrintStateId(StateId s) const { + PrintId(s, ssyms_, "state ID"); + } + + void PrintILabel(Label l) const { + PrintId(l, isyms_, "arc input label"); + } + + void PrintOLabel(Label l) const { + PrintId(l, osyms_, "arc output label"); + } + + template + void Print(T t) const { + *ostrm_ << t; + } + + void DrawState(StateId s) const { + Print(s); + PrintString(" [label = \""); + PrintStateId(s); + Weight final = fst_.Final(s); + if (final != Weight::Zero()) { + if (show_weight_one_ || (final != Weight::One())) { + PrintString("/"); + Print(final); + } + PrintString("\", shape = doublecircle,"); + } else { + PrintString("\", shape = circle,"); + } + if (s == fst_.Start()) + PrintString(" style = bold,"); + else + PrintString(" style = solid,"); + PrintString(" fontsize = "); + Print(fontsize_); + PrintString("]\n"); + for (ArcIterator< Fst > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + PrintString("\t"); + Print(s); + PrintString(" -> "); + Print(arc.nextstate); + PrintString(" [label = \""); + PrintILabel(arc.ilabel); + if (!accep_) { + PrintString(":"); + PrintOLabel(arc.olabel); + } + if (show_weight_one_ || (arc.weight != Weight::One())) { + PrintString("/"); + Print(arc.weight); + } + PrintString("\", fontsize = "); + Print(fontsize_); + PrintString("];\n"); + } + } + + const Fst &fst_; + const SymbolTable *isyms_; // ilabel symbol table + const SymbolTable *osyms_; // olabel symbol table + const SymbolTable *ssyms_; // slabel symbol table + bool accep_; // print as acceptor when possible + ostream *ostrm_; // drawn FST destination + string dest_; // drawn FST destination name + + string title_; + float width_; + float height_; + bool portrait_; + bool vertical_; + float ranksep_; + float nodesep_; + int fontsize_; + int precision_; + bool show_weight_one_; + + DISALLOW_COPY_AND_ASSIGN(FstDrawer); +}; + +} // namespace fst + +#endif // FST_SCRIPT_DRAW_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/draw.h b/extlibs/openfstwin-1.3.1/include/fst/script/draw.h new file mode 100755 index 00000000000..2191ad87668 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/draw.h @@ -0,0 +1,114 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DRAW_H_ +#define FST_SCRIPT_DRAW_H_ + +#include +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FstDrawerArgs { + const FstClass &fst; + const SymbolTable *isyms; + const SymbolTable *osyms; + const SymbolTable *ssyms; + const bool accep; + const string& title; + const float width; + const float height; + const bool portrait; + const bool vertical; + const float ranksep; + const float nodesep; + const int fontsize; + const int precision; + const bool show_weight_one; + ostream *ostrm; + const string &dest; + + FstDrawerArgs(const FstClass &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + const string &title, + float width, + float height, + bool portrait, + bool vertical, + float ranksep, + float nodesep, + int fontsize, + int precision, + bool show_weight_one, + ostream *ostrm, + const string &dest) : + fst(fst), isyms(isyms), osyms(osyms), ssyms(ssyms), accep(accep), + title(title), width(width), height(height), portrait(portrait), + vertical(vertical), ranksep(ranksep), nodesep(nodesep), + fontsize(fontsize), precision(precision), + show_weight_one(show_weight_one), ostrm(ostrm), dest(dest) { } +}; + + +template +void DrawFst(FstDrawerArgs *args) { + const Fst &fst = *(args->fst.GetFst()); + + FstDrawer fstdrawer(fst, args->isyms, args->osyms, args->ssyms, + args->accep, args->title, args->width, + args->height, args->portrait, + args->vertical, args->ranksep, + args->nodesep, args->fontsize, + args->precision, args->show_weight_one); + fstdrawer.Draw(args->ostrm, args->dest); +} + +void OPENFSTDLL DrawFst(const FstClass &fst, //ChangedPD + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + const string &title, + float width, + float height, + bool portrait, + bool vertical, + float ranksep, + float nodesep, + int fontsize, + int precision, + bool show_weight_one, + ostream *ostrm, + const string &dest); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_DRAW_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/draw.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/draw.h.bak new file mode 100755 index 00000000000..2b663734437 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/draw.h.bak @@ -0,0 +1,114 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_DRAW_H_ +#define FST_SCRIPT_DRAW_H_ + +#include +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FstDrawerArgs { + const FstClass &fst; + const SymbolTable *isyms; + const SymbolTable *osyms; + const SymbolTable *ssyms; + const bool accep; + const string& title; + const float width; + const float height; + const bool portrait; + const bool vertical; + const float ranksep; + const float nodesep; + const int fontsize; + const int precision; + const bool show_weight_one; + ostream *ostrm; + const string &dest; + + FstDrawerArgs(const FstClass &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + const string &title, + float width, + float height, + bool portrait, + bool vertical, + float ranksep, + float nodesep, + int fontsize, + int precision, + bool show_weight_one, + ostream *ostrm, + const string &dest) : + fst(fst), isyms(isyms), osyms(osyms), ssyms(ssyms), accep(accep), + title(title), width(width), height(height), portrait(portrait), + vertical(vertical), ranksep(ranksep), nodesep(nodesep), + fontsize(fontsize), precision(precision), + show_weight_one(show_weight_one), ostrm(ostrm), dest(dest) { } +}; + + +template +void DrawFst(FstDrawerArgs *args) { + const Fst &fst = *(args->fst.GetFst()); + + FstDrawer fstdrawer(fst, args->isyms, args->osyms, args->ssyms, + args->accep, args->title, args->width, + args->height, args->portrait, + args->vertical, args->ranksep, + args->nodesep, args->fontsize, + args->precision, args->show_weight_one); + fstdrawer.Draw(args->ostrm, args->dest); +} + +void DrawFst(const FstClass &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + const string &title, + float width, + float height, + bool portrait, + bool vertical, + float ranksep, + float nodesep, + int fontsize, + int precision, + bool show_weight_one, + ostream *ostrm, + const string &dest); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_DRAW_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/encode.h b/extlibs/openfstwin-1.3.1/include/fst/script/encode.h new file mode 100755 index 00000000000..bd32b3e97f3 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/encode.h @@ -0,0 +1,58 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_ENCODE_H_ +#define FST_SCRIPT_ENCODE_H_ + +#include + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EncodeArgs; + +template +void Encode(EncodeArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + bool reuse_encoder = args->arg3; + const string &coder_fname = args->arg4; + uint32 flags = args->arg2; + + EncodeMapper *encoder = reuse_encoder + ? EncodeMapper::Read(coder_fname, ENCODE) + : new EncodeMapper(flags, ENCODE); + + Encode(ofst, encoder); + if (!args->arg3) + encoder->Write(coder_fname); + + delete encoder; +} + +void OPENFSTDLL Encode(MutableFstClass *fst, uint32 flags, bool reuse_encoder, //ChangedPD + const string &coder_fname); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_ENCODE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/encode.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/encode.h.bak new file mode 100755 index 00000000000..dc1a290eae9 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/encode.h.bak @@ -0,0 +1,58 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_ENCODE_H_ +#define FST_SCRIPT_ENCODE_H_ + +#include + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EncodeArgs; + +template +void Encode(EncodeArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + bool reuse_encoder = args->arg3; + const string &coder_fname = args->arg4; + uint32 flags = args->arg2; + + EncodeMapper *encoder = reuse_encoder + ? EncodeMapper::Read(coder_fname, ENCODE) + : new EncodeMapper(flags, ENCODE); + + Encode(ofst, encoder); + if (!args->arg3) + encoder->Write(coder_fname); + + delete encoder; +} + +void Encode(MutableFstClass *fst, uint32 flags, bool reuse_encoder, + const string &coder_fname); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_ENCODE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h b/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h new file mode 100755 index 00000000000..cf135a84abf --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h @@ -0,0 +1,44 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EPSNORMALIZE_H_ +#define FST_SCRIPT_EPSNORMALIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EpsNormalizeArgs; + +template +void EpsNormalize(EpsNormalizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + EpsNormalize(ifst, ofst, args->arg3); +} + +void OPENFSTDLL EpsNormalize(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + EpsNormalizeType norm_type = EPS_NORM_INPUT); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_EPSNORMALIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h.bak new file mode 100755 index 00000000000..50b12da9910 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/epsnormalize.h.bak @@ -0,0 +1,44 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EPSNORMALIZE_H_ +#define FST_SCRIPT_EPSNORMALIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EpsNormalizeArgs; + +template +void EpsNormalize(EpsNormalizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + EpsNormalize(ifst, ofst, args->arg3); +} + +void EpsNormalize(const FstClass &ifst, MutableFstClass *ofst, + EpsNormalizeType norm_type = EPS_NORM_INPUT); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_EPSNORMALIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/equal.h b/extlibs/openfstwin-1.3.1/include/fst/script/equal.h new file mode 100755 index 00000000000..db1f4111160 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/equal.h @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EQUAL_H_ +#define FST_SCRIPT_EQUAL_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EqualInnerArgs; +typedef args::WithReturnValue EqualArgs; + +template +void Equal(EqualArgs *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = Equal(fst1, fst2, args->args.arg3); +} + +bool OPENFSTDLL Equal(const FstClass &fst1, const FstClass &fst2, //ChangedPD + float delta = kDelta); + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_EQUAL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/equal.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/equal.h.bak new file mode 100755 index 00000000000..9fb2d3cbd61 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/equal.h.bak @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EQUAL_H_ +#define FST_SCRIPT_EQUAL_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EqualInnerArgs; +typedef args::WithReturnValue EqualArgs; + +template +void Equal(EqualArgs *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = Equal(fst1, fst2, args->args.arg3); +} + +bool Equal(const FstClass &fst1, const FstClass &fst2, + float delta = kDelta); + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_EQUAL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h b/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h new file mode 100755 index 00000000000..6fe63064990 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h @@ -0,0 +1,47 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EQUIVALENT_H_ +#define FST_SCRIPT_EQUIVALENT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EquivalentInnerArgs; +typedef args::WithReturnValue EquivalentArgs; + +template +void Equivalent(EquivalentArgs *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = Equivalent(fst1, fst2, args->args.arg3); +} + +bool OPENFSTDLL Equivalent(const FstClass &fst1, const FstClass &fst2, //ChangedPD + float delta = kDelta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_EQUIVALENT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h.bak new file mode 100755 index 00000000000..43460c66a14 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/equivalent.h.bak @@ -0,0 +1,47 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_EQUIVALENT_H_ +#define FST_SCRIPT_EQUIVALENT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package EquivalentInnerArgs; +typedef args::WithReturnValue EquivalentArgs; + +template +void Equivalent(EquivalentArgs *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = Equivalent(fst1, fst2, args->args.arg3); +} + +bool Equivalent(const FstClass &fst1, const FstClass &fst2, + float delta = kDelta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_EQUIVALENT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h b/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h new file mode 100755 index 00000000000..328b20fba42 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h @@ -0,0 +1,344 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_FST_CLASS_H_ +#define FST_SCRIPT_FST_CLASS_H_ + +#include + +#include +#include +#include +#include +#include +#include + +// Classes to support "boxing" all existing types of FST arcs in a single +// FstClass which hides the arc types. This allows clients to load +// and work with FSTs without knowing the arc type. + +// These classes are only recommended for use in high-level scripting +// applications. Most users should use the lower-level templated versions +// corresponding to these classes. + +namespace fst { +namespace script { + +// +// Abstract base class defining the set of functionalities implemented +// in all impls, and passed through by all bases Below FstClassBase +// the class hierarchy bifurcates; FstClassImplBase serves as the base +// class for all implementations (of which FstClassImpl is currently +// the only one) and FstClass serves as the base class for all +// interfaces. +// +class FstClassBase { + public: + virtual const string &ArcType() const = 0; + virtual const string &FstType() const = 0; + virtual const string &WeightType() const = 0; + virtual const SymbolTable *InputSymbols() const = 0; + virtual const SymbolTable *OutputSymbols() const = 0; + virtual void Write(const string& fname) const = 0; + virtual uint64 Properties(uint64 mask, bool test) const = 0; + virtual ~FstClassBase() { } +}; + +class FstClassImplBase : public FstClassBase { + public: + virtual FstClassImplBase *Copy() = 0; + virtual void SetInputSymbols(SymbolTable *is) = 0; + virtual void SetOutputSymbols(SymbolTable *is) = 0; + virtual ~FstClassImplBase() { } +}; + + +// +// CONTAINER CLASS +// Wraps an Fst, hiding its arc type. Whether this Fst +// pointer refers to a special kind of FST (e.g. a MutableFst) is +// known by the type of interface class that owns the pointer to this +// container. +// + +template +class FstClassImpl : public FstClassImplBase { + public: + explicit FstClassImpl(Fst *impl, + bool should_own = false) : + impl_(should_own ? impl : impl->Copy()) { } + + virtual const string &ArcType() const { + return Arc::Type(); + } + + virtual const string &FstType() const { + return impl_->Type(); + } + + virtual const string &WeightType() const { + return Arc::Weight::Type(); + } + + virtual const SymbolTable *InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable *OutputSymbols() const { + return impl_->OutputSymbols(); + } + + // Warning: calling this method casts the FST to a mutable FST. + virtual void SetInputSymbols(SymbolTable *is) { + static_cast *>(impl_)->SetInputSymbols(is); + } + + // Warning: calling this method casts the FST to a mutable FST. + virtual void SetOutputSymbols(SymbolTable *os) { + static_cast *>(impl_)->SetOutputSymbols(os); + } + + virtual void Write(const string &fname) const { + impl_->Write(fname); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + return impl_->Properties(mask, test); + } + + virtual ~FstClassImpl() { delete impl_; } + + Fst *GetImpl() { return impl_; } + + virtual FstClassImpl *Copy() { + return new FstClassImpl(impl_); + } + + private: + Fst *impl_; +}; + +// +// BASE CLASS DEFINITIONS +// + +class MutableFstClass; + +class FstClass : public FstClassBase { + public: + template + static FstClass *Read(istream &stream, + const FstReadOptions &opts) { + if (!opts.header) { + FSTERROR() << "FstClass::Read: options header not specified"; + return 0; + } + const FstHeader &hdr = *opts.header; + + if (hdr.Properties() & kMutable) { + return ReadTypedFst >(stream, opts); + } else { + return ReadTypedFst >(stream, opts); + } + } + + template + explicit FstClass(Fst *fst) : impl_(new FstClassImpl(fst)) { } + + explicit FstClass(const FstClass &other) : impl_(other.impl_->Copy()) { } + + static OPENFSTDLL FstClass *Read(const string &fname); //ChangedPD + + virtual const string &ArcType() const { + return impl_->ArcType(); + } + + virtual const string& FstType() const { + return impl_->FstType(); + } + + virtual const SymbolTable *InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable *OutputSymbols() const { + return impl_->OutputSymbols(); + } + + virtual const string& WeightType() const { + return impl_->WeightType(); + } + + virtual void Write(const string &fname) const { + impl_->Write(fname); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + return impl_->Properties(mask, test); + } + + template + const Fst *GetFst() const { + if (Arc::Type() != ArcType()) { + return NULL; + } else { + FstClassImpl *typed_impl = static_cast *>(impl_); + return typed_impl->GetImpl(); + } + } + + virtual ~FstClass() { delete impl_; } + + // These methods are required by IO registration + template + static FstClassImplBase *Convert(const FstClass &other) { + LOG(ERROR) << "Doesn't make sense to convert any class to type FstClass."; + return 0; + } + + template + static FstClassImplBase *Create() { + LOG(ERROR) << "Doesn't make sense to create an FstClass with a " + << "particular arc type."; + return 0; + } + protected: + explicit FstClass(FstClassImplBase *impl) : impl_(impl) { } + + // Generic template method for reading an arc-templated FST of type + // UnderlyingT, and returning it wrapped as FstClassT, with appropriate + // error checking. Called from arc-templated Read() static methods. + template + static FstClassT* ReadTypedFst(istream &stream, + const FstReadOptions &opts) { + UnderlyingT *u = UnderlyingT::Read(stream, opts); + if (!u) { + return 0; + } else { + FstClassT *r = new FstClassT(u); + delete u; + return r; + } + } + + FstClassImplBase *GetImpl() { return impl_; } + private: + FstClassImplBase *impl_; +}; + +// +// Specific types of FstClass with special properties +// + +class MutableFstClass : public FstClass { + public: + template + explicit MutableFstClass(MutableFst *fst) : + FstClass(fst) { } + + template + MutableFst *GetMutableFst() { + Fst *fst = const_cast *>(this->GetFst()); + MutableFst *mfst = static_cast *>(fst); + + return mfst; + } + + template + static MutableFstClass *Read(istream &stream, + const FstReadOptions &opts) { + MutableFst *mfst = MutableFst::Read(stream, opts); + if (!mfst) { + return 0; + } else { + MutableFstClass *retval = new MutableFstClass(mfst); + delete mfst; + return retval; + } + } + + static OPENFSTDLL MutableFstClass *Read(const string &fname, bool convert = false); //ChangedPD + + virtual void SetInputSymbols(SymbolTable *is) { + GetImpl()->SetInputSymbols(is); + } + + virtual void SetOutputSymbols(SymbolTable *os) { + GetImpl()->SetOutputSymbols(os); + } + + // These methods are required by IO registration + template + static FstClassImplBase *Convert(const FstClass &other) { + LOG(ERROR) << "Doesn't make sense to convert any class to type " + << "MutableFstClass."; + return 0; + } + + template + static FstClassImplBase *Create() { + LOG(ERROR) << "Doesn't make sense to create a MutableFstClass with a " + << "particular arc type."; + return 0; + } + + protected: + explicit MutableFstClass(FstClassImplBase *impl) : FstClass(impl) { } +}; + + +class VectorFstClass : public MutableFstClass { + public: + explicit OPENFSTDLL VectorFstClass(const FstClass &other); //ChangedPD + explicit OPENFSTDLL VectorFstClass(const string &arc_type); //ChangedPD + + template + explicit VectorFstClass(VectorFst *fst) : + MutableFstClass(fst) { } + + template + static VectorFstClass *Read(istream &stream, + const FstReadOptions &opts) { + VectorFst *vfst = VectorFst::Read(stream, opts); + if (!vfst) { + return 0; + } else { + VectorFstClass *retval = new VectorFstClass(vfst); + delete vfst; + return retval; + } + } + + static VectorFstClass *Read(const string &fname); + + // Converter / creator for known arc types + template + static FstClassImplBase *Convert(const FstClass &other) { + return new FstClassImpl(new VectorFst( + *other.GetFst()), true); + } + + template + static FstClassImplBase *Create() { + return new FstClassImpl(new VectorFst(), true); + } +}; + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_FST_CLASS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h.bak new file mode 100755 index 00000000000..d2fb8518540 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/fst-class.h.bak @@ -0,0 +1,344 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_FST_CLASS_H_ +#define FST_SCRIPT_FST_CLASS_H_ + +#include + +#include +#include +#include +#include +#include +#include + +// Classes to support "boxing" all existing types of FST arcs in a single +// FstClass which hides the arc types. This allows clients to load +// and work with FSTs without knowing the arc type. + +// These classes are only recommended for use in high-level scripting +// applications. Most users should use the lower-level templated versions +// corresponding to these classes. + +namespace fst { +namespace script { + +// +// Abstract base class defining the set of functionalities implemented +// in all impls, and passed through by all bases Below FstClassBase +// the class hierarchy bifurcates; FstClassImplBase serves as the base +// class for all implementations (of which FstClassImpl is currently +// the only one) and FstClass serves as the base class for all +// interfaces. +// +class FstClassBase { + public: + virtual const string &ArcType() const = 0; + virtual const string &FstType() const = 0; + virtual const string &WeightType() const = 0; + virtual const SymbolTable *InputSymbols() const = 0; + virtual const SymbolTable *OutputSymbols() const = 0; + virtual void Write(const string& fname) const = 0; + virtual uint64 Properties(uint64 mask, bool test) const = 0; + virtual ~FstClassBase() { } +}; + +class FstClassImplBase : public FstClassBase { + public: + virtual FstClassImplBase *Copy() = 0; + virtual void SetInputSymbols(SymbolTable *is) = 0; + virtual void SetOutputSymbols(SymbolTable *is) = 0; + virtual ~FstClassImplBase() { } +}; + + +// +// CONTAINER CLASS +// Wraps an Fst, hiding its arc type. Whether this Fst +// pointer refers to a special kind of FST (e.g. a MutableFst) is +// known by the type of interface class that owns the pointer to this +// container. +// + +template +class FstClassImpl : public FstClassImplBase { + public: + explicit FstClassImpl(Fst *impl, + bool should_own = false) : + impl_(should_own ? impl : impl->Copy()) { } + + virtual const string &ArcType() const { + return Arc::Type(); + } + + virtual const string &FstType() const { + return impl_->Type(); + } + + virtual const string &WeightType() const { + return Arc::Weight::Type(); + } + + virtual const SymbolTable *InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable *OutputSymbols() const { + return impl_->OutputSymbols(); + } + + // Warning: calling this method casts the FST to a mutable FST. + virtual void SetInputSymbols(SymbolTable *is) { + static_cast *>(impl_)->SetInputSymbols(is); + } + + // Warning: calling this method casts the FST to a mutable FST. + virtual void SetOutputSymbols(SymbolTable *os) { + static_cast *>(impl_)->SetOutputSymbols(os); + } + + virtual void Write(const string &fname) const { + impl_->Write(fname); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + return impl_->Properties(mask, test); + } + + virtual ~FstClassImpl() { delete impl_; } + + Fst *GetImpl() { return impl_; } + + virtual FstClassImpl *Copy() { + return new FstClassImpl(impl_); + } + + private: + Fst *impl_; +}; + +// +// BASE CLASS DEFINITIONS +// + +class MutableFstClass; + +class FstClass : public FstClassBase { + public: + template + static FstClass *Read(istream &stream, + const FstReadOptions &opts) { + if (!opts.header) { + FSTERROR() << "FstClass::Read: options header not specified"; + return 0; + } + const FstHeader &hdr = *opts.header; + + if (hdr.Properties() & kMutable) { + return ReadTypedFst >(stream, opts); + } else { + return ReadTypedFst >(stream, opts); + } + } + + template + explicit FstClass(Fst *fst) : impl_(new FstClassImpl(fst)) { } + + explicit FstClass(const FstClass &other) : impl_(other.impl_->Copy()) { } + + static OPENFSTDLL FstClass *Read(const string &fname); //ChangedPD + + virtual const string &ArcType() const { + return impl_->ArcType(); + } + + virtual const string& FstType() const { + return impl_->FstType(); + } + + virtual const SymbolTable *InputSymbols() const { + return impl_->InputSymbols(); + } + + virtual const SymbolTable *OutputSymbols() const { + return impl_->OutputSymbols(); + } + + virtual const string& WeightType() const { + return impl_->WeightType(); + } + + virtual void Write(const string &fname) const { + impl_->Write(fname); + } + + virtual uint64 Properties(uint64 mask, bool test) const { + return impl_->Properties(mask, test); + } + + template + const Fst *GetFst() const { + if (Arc::Type() != ArcType()) { + return NULL; + } else { + FstClassImpl *typed_impl = static_cast *>(impl_); + return typed_impl->GetImpl(); + } + } + + virtual ~FstClass() { delete impl_; } + + // These methods are required by IO registration + template + static FstClassImplBase *Convert(const FstClass &other) { + LOG(ERROR) << "Doesn't make sense to convert any class to type FstClass."; + return 0; + } + + template + static FstClassImplBase *Create() { + LOG(ERROR) << "Doesn't make sense to create an FstClass with a " + << "particular arc type."; + return 0; + } + protected: + explicit FstClass(FstClassImplBase *impl) : impl_(impl) { } + + // Generic template method for reading an arc-templated FST of type + // UnderlyingT, and returning it wrapped as FstClassT, with appropriate + // error checking. Called from arc-templated Read() static methods. + template + static FstClassT* ReadTypedFst(istream &stream, + const FstReadOptions &opts) { + UnderlyingT *u = UnderlyingT::Read(stream, opts); + if (!u) { + return 0; + } else { + FstClassT *r = new FstClassT(u); + delete u; + return r; + } + } + + FstClassImplBase *GetImpl() { return impl_; } + private: + FstClassImplBase *impl_; +}; + +// +// Specific types of FstClass with special properties +// + +class MutableFstClass : public FstClass { + public: + template + explicit MutableFstClass(MutableFst *fst) : + FstClass(fst) { } + + template + MutableFst *GetMutableFst() { + Fst *fst = const_cast *>(this->GetFst()); + MutableFst *mfst = static_cast *>(fst); + + return mfst; + } + + template + static MutableFstClass *Read(istream &stream, + const FstReadOptions &opts) { + MutableFst *mfst = MutableFst::Read(stream, opts); + if (!mfst) { + return 0; + } else { + MutableFstClass *retval = new MutableFstClass(mfst); + delete mfst; + return retval; + } + } + + static MutableFstClass *Read(const string &fname, bool convert = false); + + virtual void SetInputSymbols(SymbolTable *is) { + GetImpl()->SetInputSymbols(is); + } + + virtual void SetOutputSymbols(SymbolTable *os) { + GetImpl()->SetOutputSymbols(os); + } + + // These methods are required by IO registration + template + static FstClassImplBase *Convert(const FstClass &other) { + LOG(ERROR) << "Doesn't make sense to convert any class to type " + << "MutableFstClass."; + return 0; + } + + template + static FstClassImplBase *Create() { + LOG(ERROR) << "Doesn't make sense to create a MutableFstClass with a " + << "particular arc type."; + return 0; + } + + protected: + explicit MutableFstClass(FstClassImplBase *impl) : FstClass(impl) { } +}; + + +class VectorFstClass : public MutableFstClass { + public: + explicit VectorFstClass(const FstClass &other); + explicit VectorFstClass(const string &arc_type); + + template + explicit VectorFstClass(VectorFst *fst) : + MutableFstClass(fst) { } + + template + static VectorFstClass *Read(istream &stream, + const FstReadOptions &opts) { + VectorFst *vfst = VectorFst::Read(stream, opts); + if (!vfst) { + return 0; + } else { + VectorFstClass *retval = new VectorFstClass(vfst); + delete vfst; + return retval; + } + } + + static VectorFstClass *Read(const string &fname); + + // Converter / creator for known arc types + template + static FstClassImplBase *Convert(const FstClass &other) { + return new FstClassImpl(new VectorFst( + *other.GetFst()), true); + } + + template + static FstClassImplBase *Create() { + return new FstClassImpl(new VectorFst(), true); + } +}; + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_FST_CLASS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/fstscript-decl.h b/extlibs/openfstwin-1.3.1/include/fst/script/fstscript-decl.h new file mode 100755 index 00000000000..fee813ed614 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/fstscript-decl.h @@ -0,0 +1,35 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Forward declarations for the FST and FST-script classes. + +#ifndef FST_SCRIPT_FSTSCRIPT_DECL_H_ +#define FST_SCRIPT_FSTSCRIPT_DECL_H_ + +#include + +namespace fst { +namespace script { + +class FstClass; +class MutableFstClass; +class VectorFstClass; +class WeightClass; + +} // namespace script +} // namespace fst; + +#endif // FST_SCRIPT_FSTSCRIPT_DECL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/fstscript.h b/extlibs/openfstwin-1.3.1/include/fst/script/fstscript.h new file mode 100755 index 00000000000..90e1e75cb34 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/fstscript.h @@ -0,0 +1,154 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Convenience file that includes all FstScript functionality + +#ifndef FST_SCRIPT_FSTSCRIPT_H_ +#define FST_SCRIPT_FSTSCRIPT_H_ + +// Major classes +#include +#include +#include + +// Templates like Operation< >, Apply< > +#include + +// Operations +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// REGISTER OPERATIONS +// + + +// This class is necessary because registering each of the operations +// separately overfills the stack, as there's so many of them. +namespace fst { +namespace script { +template +class AllFstOperationsRegisterer { + public: + AllFstOperationsRegisterer() { + RegisterBatch1(); + RegisterBatch2(); + } + + private: + void RegisterBatch1() { + REGISTER_FST_OPERATION(ArcSort, Arc, ArcSortArgs); + REGISTER_FST_OPERATION(Closure, Arc, ClosureArgs); + REGISTER_FST_OPERATION(CompileFst, Arc, FstCompileArgs); + REGISTER_FST_OPERATION(Compose, Arc, ComposeArgs1); + REGISTER_FST_OPERATION(Compose, Arc, ComposeArgs2); + REGISTER_FST_OPERATION(Concat, Arc, ConcatArgs1); + REGISTER_FST_OPERATION(Concat, Arc, ConcatArgs2); + REGISTER_FST_OPERATION(Connect, Arc, MutableFstClass); + REGISTER_FST_OPERATION(Convert, Arc, ConvertArgs); + REGISTER_FST_OPERATION(Decode, Arc, DecodeArgs); + REGISTER_FST_OPERATION(Determinize, Arc, DeterminizeArgs); + REGISTER_FST_OPERATION(Difference, Arc, DifferenceArgs1); + REGISTER_FST_OPERATION(Difference, Arc, DifferenceArgs2); + REGISTER_FST_OPERATION(DrawFst, Arc, FstDrawerArgs); + REGISTER_FST_OPERATION(Encode, Arc, EncodeArgs); + REGISTER_FST_OPERATION(EpsNormalize, Arc, EpsNormalizeArgs); + REGISTER_FST_OPERATION(Equal, Arc, EqualArgs); + REGISTER_FST_OPERATION(Equivalent, Arc, EquivalentArgs); + REGISTER_FST_OPERATION(PrintFstInfo, Arc, InfoArgs); + REGISTER_FST_OPERATION(Intersect, Arc, IntersectArgs1); + REGISTER_FST_OPERATION(Intersect, Arc, IntersectArgs2); + REGISTER_FST_OPERATION(Invert, Arc, MutableFstClass); + REGISTER_FST_OPERATION(Map, Arc, MapArgs); + REGISTER_FST_OPERATION(Minimize, Arc, MinimizeArgs); + } + + void RegisterBatch2() { + REGISTER_FST_OPERATION(PrintFst, Arc, FstPrinterArgs); + REGISTER_FST_OPERATION(Project, Arc, ProjectArgs); + REGISTER_FST_OPERATION(Prune, Arc, PruneArgs1); + REGISTER_FST_OPERATION(Prune, Arc, PruneArgs2); + REGISTER_FST_OPERATION(Prune, Arc, PruneArgs3); + REGISTER_FST_OPERATION(Prune, Arc, PruneArgs4); + REGISTER_FST_OPERATION(Push, Arc, PushArgs1); + REGISTER_FST_OPERATION(Push, Arc, PushArgs2); + REGISTER_FST_OPERATION(RandEquivalent, Arc, RandEquivalentArgs1); + REGISTER_FST_OPERATION(RandEquivalent, Arc, RandEquivalentArgs2); + REGISTER_FST_OPERATION(RandGen, Arc, RandGenArgs); + REGISTER_FST_OPERATION(Relabel, Arc, RelabelArgs1); + REGISTER_FST_OPERATION(Relabel, Arc, RelabelArgs2); + REGISTER_FST_OPERATION(Relabel, Arc, RelabelArgs3); + REGISTER_FST_OPERATION(Replace, Arc, ReplaceArgs); + REGISTER_FST_OPERATION(Reverse, Arc, ReverseArgs); + REGISTER_FST_OPERATION(Reweight, Arc, ReweightArgs); + REGISTER_FST_OPERATION(RmEpsilon, Arc, RmEpsilonArgs1); + REGISTER_FST_OPERATION(RmEpsilon, Arc, RmEpsilonArgs2); + REGISTER_FST_OPERATION(RmEpsilon, Arc, RmEpsilonArgs3); + REGISTER_FST_OPERATION(ShortestDistance, Arc, ShortestDistanceArgs1); + REGISTER_FST_OPERATION(ShortestDistance, Arc, ShortestDistanceArgs2); + REGISTER_FST_OPERATION(ShortestDistance, Arc, ShortestDistanceArgs3); + REGISTER_FST_OPERATION(ShortestPath, Arc, ShortestPathArgs1); + REGISTER_FST_OPERATION(ShortestPath, Arc, ShortestPathArgs2); + REGISTER_FST_OPERATION(Synchronize, Arc, SynchronizeArgs); + REGISTER_FST_OPERATION(TopSort, Arc, TopSortArgs); + REGISTER_FST_OPERATION(Union, Arc, UnionArgs); + REGISTER_FST_OPERATION(Verify, Arc, VerifyArgs); + } +}; +} // namespace script +} // namespace fst + + +#define REGISTER_FST_OPERATIONS(Arc) \ + AllFstOperationsRegisterer register_all_fst_operations ## Arc; + +#endif // FST_SCRIPT_FSTSCRIPT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/info-impl.h b/extlibs/openfstwin-1.3.1/include/fst/script/info-impl.h new file mode 100755 index 00000000000..408fbcdac03 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/info-impl.h @@ -0,0 +1,325 @@ +// info.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to compute various information about FSTs, helper class for fstinfo.cc + +#ifndef FST_SCRIPT_INFO_IMPL_H_ +#define FST_SCRIPT_INFO_IMPL_H_ + +#include +#include +using std::vector; + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace fst { + +// Compute various information about FSTs, helper class for fstinfo.cc. +// WARNING: Stand-alone use of this class is not recommended, most code +// should call directly the relevant library functions: Fst::NumStates, +// Fst::NumArcs, TestProperties, ... +template class FstInfo { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + // When info_type is "short" (or "auto" and not an ExpandedFst) + // then only minimal info is computed and can be requested. + FstInfo(const Fst &fst, bool test_properties, + const string &arc_filter_type = "any", + string info_type = "auto", bool verify = true) + : fst_type_(fst.Type()), + input_symbols_(fst.InputSymbols() ? + fst.InputSymbols()->Name() : "none"), + output_symbols_(fst.OutputSymbols() ? + fst.OutputSymbols()->Name() : "none"), + nstates_(0), narcs_(0), start_(kNoStateId), nfinal_(0), + nepsilons_(0), niepsilons_(0), noepsilons_(0), + naccess_(0), ncoaccess_(0), nconnect_(0), ncc_(0), nscc_(0), + input_match_type_(MATCH_NONE), output_match_type_(MATCH_NONE), + input_lookahead_(false), output_lookahead_(false), + properties_(0), arc_filter_type_(arc_filter_type), long_info_(true) { + if (info_type == "long") { + long_info_ = true; + } else if (info_type == "short") { + long_info_ = false; + } else if (info_type == "auto") { + long_info_ = fst.Properties(kExpanded, false); + } else { + FSTERROR() << "Bad info type: " << info_type; + return; + } + + if (!long_info_) + return; + + // If the FST is not sane, we return. + if (verify && !Verify(fst)) { + FSTERROR() << "FstInfo: Verify: FST not well-formed."; + return; + } + + start_ = fst.Start(); + properties_ = fst.Properties(kFstProperties, test_properties); + + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) { + ++nstates_; + StateId s = siter.Value(); + if (fst.Final(s) != Weight::Zero()) + ++nfinal_; + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + ++narcs_; + if (arc.ilabel == 0 && arc.olabel == 0) + ++nepsilons_; + if (arc.ilabel == 0) + ++niepsilons_; + if (arc.olabel == 0) + ++noepsilons_; + } + } + + { + vector cc; + CcVisitor cc_visitor(&cc); + FifoQueue fifo_queue; + if (arc_filter_type == "any") { + Visit(fst, &cc_visitor, &fifo_queue); + } else if (arc_filter_type == "epsilon") { + Visit(fst, &cc_visitor, &fifo_queue, EpsilonArcFilter()); + } else if (arc_filter_type == "iepsilon") { + Visit(fst, &cc_visitor, &fifo_queue, InputEpsilonArcFilter()); + } else if (arc_filter_type == "oepsilon") { + Visit(fst, &cc_visitor, &fifo_queue, OutputEpsilonArcFilter()); + } else { + FSTERROR() << "Bad arc filter type: " << arc_filter_type; + return; + } + + for (StateId s = 0; s < cc.size(); ++s) { + if (cc[s] >= ncc_) + ncc_ = cc[s] + 1; + } + } + + { + vector scc; + vector access, coaccess; + uint64 props = 0; + SccVisitor scc_visitor(&scc, &access, &coaccess, &props); + if (arc_filter_type == "any") { + DfsVisit(fst, &scc_visitor); + } else if (arc_filter_type == "epsilon") { + DfsVisit(fst, &scc_visitor, EpsilonArcFilter()); + } else if (arc_filter_type == "iepsilon") { + DfsVisit(fst, &scc_visitor, InputEpsilonArcFilter()); + } else if (arc_filter_type == "oepsilon") { + DfsVisit(fst, &scc_visitor, OutputEpsilonArcFilter()); + } else { + FSTERROR() << "Bad arc filter type: " << arc_filter_type; + return; + } + + for (StateId s = 0; s < scc.size(); ++s) { + if (access[s]) + ++naccess_; + if (coaccess[s]) + ++ncoaccess_; + if (access[s] && coaccess[s]) + ++nconnect_; + if (scc[s] >= nscc_) + nscc_ = scc[s] + 1; + } + } + + LookAheadMatcher< Fst > imatcher(fst, MATCH_INPUT); + input_match_type_ = imatcher.Type(test_properties); + input_lookahead_ = imatcher.Flags() & kInputLookAheadMatcher; + + LookAheadMatcher< Fst > omatcher(fst, MATCH_OUTPUT); + output_match_type_ = omatcher.Type(test_properties); + output_lookahead_ = omatcher.Flags() & kOutputLookAheadMatcher; + } + + // Short info + const string& FstType() const { return fst_type_; } + const string& ArcType() const { return A::Type(); } + const string& InputSymbols() const { return input_symbols_; } + const string& OutputSymbols() const { return output_symbols_; } + const bool LongInfo() const { return long_info_; } + const string& ArcFilterType() const { return arc_filter_type_; } + + // Long info + MatchType InputMatchType() const { CheckLong(); return input_match_type_; } + MatchType OutputMatchType() const { CheckLong(); return output_match_type_; } + bool InputLookAhead() const { CheckLong(); return input_lookahead_; } + bool OutputLookAhead() const { CheckLong(); return output_lookahead_; } + int64 NumStates() const { CheckLong(); return nstates_; } + int64 NumArcs() const { CheckLong(); return narcs_; } + int64 Start() const { CheckLong(); return start_; } + int64 NumFinal() const { CheckLong(); return nfinal_; } + int64 NumEpsilons() const { CheckLong(); return nepsilons_; } + int64 NumInputEpsilons() const { CheckLong(); return niepsilons_; } + int64 NumOutputEpsilons() const { CheckLong(); return noepsilons_; } + int64 NumAccessible() const { CheckLong(); return naccess_; } + int64 NumCoAccessible() const { CheckLong(); return ncoaccess_; } + int64 NumConnected() const { CheckLong(); return nconnect_; } + int64 NumCc() const { CheckLong(); return ncc_; } + int64 NumScc() const { CheckLong(); return nscc_; } + uint64 Properties() const { CheckLong(); return properties_; } + + private: + void CheckLong() const { + if (!long_info_) + FSTERROR() << "FstInfo: method only available with long info version"; + } + + string fst_type_; + string input_symbols_; + string output_symbols_; + int64 nstates_; + int64 narcs_; + int64 start_; + int64 nfinal_; + int64 nepsilons_; + int64 niepsilons_; + int64 noepsilons_; + int64 naccess_; + int64 ncoaccess_; + int64 nconnect_; + int64 ncc_; + int64 nscc_; + MatchType input_match_type_; + MatchType output_match_type_; + bool input_lookahead_; + bool output_lookahead_; + uint64 properties_; + string arc_filter_type_; + bool long_info_; + DISALLOW_COPY_AND_ASSIGN(FstInfo); +}; + +template +void PrintFstInfo(const FstInfo &fstinfo, bool pipe = false) { + ostream &os = pipe ? cerr : cout; + + ios_base::fmtflags old = os.setf(ios::left); + os.width(50); + os << "fst type" << fstinfo.FstType() << endl; + os.width(50); + os << "arc type" << fstinfo.ArcType() << endl; + os.width(50); + os << "input symbol table" << fstinfo.InputSymbols() << endl; + os.width(50); + os << "output symbol table" << fstinfo.OutputSymbols() << endl; + + if (!fstinfo.LongInfo()) { + os.setf(old); + return; + } + + os.width(50); + os << "# of states" << fstinfo.NumStates() << endl; + os.width(50); + os << "# of arcs" << fstinfo.NumArcs() << endl; + os.width(50); + os << "initial state" << fstinfo.Start() << endl; + os.width(50); + os << "# of final states" << fstinfo.NumFinal() << endl; + os.width(50); + os << "# of input/output epsilons" << fstinfo.NumEpsilons() << endl; + os.width(50); + os << "# of input epsilons" << fstinfo.NumInputEpsilons() << endl; + os.width(50); + os << "# of output epsilons" << fstinfo.NumOutputEpsilons() << endl; + os.width(50); + + string arc_type = ""; + if (fstinfo.ArcFilterType() == "epsilon") + arc_type = "epsilon "; + else if (fstinfo.ArcFilterType() == "iepsilon") + arc_type = "input-epsilon "; + else if (fstinfo.ArcFilterType() == "oepsilon") + arc_type = "output-epsilon "; + + string accessible_label = "# of " + arc_type + "accessible states"; + os.width(50); + os << accessible_label << fstinfo.NumAccessible() << endl; + string coaccessible_label = "# of " + arc_type + "coaccessible states"; + os.width(50); + os << coaccessible_label << fstinfo.NumCoAccessible() << endl; + string connected_label = "# of " + arc_type + "connected states"; + os.width(50); + os << connected_label << fstinfo.NumConnected() << endl; + string numcc_label = "# of " + arc_type + "connected components"; + os.width(50); + os << numcc_label << fstinfo.NumCc() << endl; + string numscc_label = "# of " + arc_type + "strongly conn components"; + os.width(50); + os << numscc_label << fstinfo.NumScc() << endl; + + os.width(50); + os << "input matcher" + << (fstinfo.InputMatchType() == MATCH_INPUT ? 'y' : + fstinfo.InputMatchType() == MATCH_NONE ? 'n' : '?') << endl; + os.width(50); + os << "output matcher" + << (fstinfo.OutputMatchType() == MATCH_OUTPUT ? 'y' : + fstinfo.OutputMatchType() == MATCH_NONE ? 'n' : '?') << endl; + os.width(50); + os << "input lookahead" + << (fstinfo.InputLookAhead() ? 'y' : 'n') << endl; + os.width(50); + os << "output lookahead" + << (fstinfo.OutputLookAhead() ? 'y' : 'n') << endl; + + uint64 prop = 1; + for (int i = 0; i < 64; ++i, prop <<= 1) { + if (prop & kBinaryProperties) { + char value = 'n'; + if (fstinfo.Properties() & prop) value = 'y'; + os.width(50); + os << PropertyNames[i] << value << endl; + } else if (prop & kPosTrinaryProperties) { + char value = '?'; + if (fstinfo.Properties() & prop) value = 'y'; + else if (fstinfo.Properties() & prop << 1) value = 'n'; + os.width(50); + os << PropertyNames[i] << value << endl; + } + } + os.setf(old); +} + +} // namespace fst + +#endif // FST_SCRIPT_INFO_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/info.h b/extlibs/openfstwin-1.3.1/include/fst/script/info.h new file mode 100755 index 00000000000..70f581e0263 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/info.h @@ -0,0 +1,48 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INFO_H_ +#define FST_SCRIPT_INFO_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package InfoArgs; + +template +void PrintFstInfo(InfoArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + FstInfo fstinfo(fst, args->arg2, args->arg3, + args->arg4, args->arg5); + PrintFstInfo(fstinfo, args->arg6); + + if (args->arg6) + fst.Write(""); +} + +void OPENFSTDLL PrintFstInfo(const FstClass &f, bool test_properties, //ChangedPD + const string &arc_filter, const string &info_type, + bool pipe, bool verify); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_INFO_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/info.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/info.h.bak new file mode 100755 index 00000000000..f434bd518b8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/info.h.bak @@ -0,0 +1,48 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INFO_H_ +#define FST_SCRIPT_INFO_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package InfoArgs; + +template +void PrintFstInfo(InfoArgs *args) { + const Fst &fst = *(args->arg1.GetFst()); + FstInfo fstinfo(fst, args->arg2, args->arg3, + args->arg4, args->arg5); + PrintFstInfo(fstinfo, args->arg6); + + if (args->arg6) + fst.Write(""); +} + +void PrintFstInfo(const FstClass &f, bool test_properties, + const string &arc_filter, const string &info_type, + bool pipe, bool verify); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_INFO_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h b/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h new file mode 100755 index 00000000000..4b3a18c2cab --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h @@ -0,0 +1,65 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INTERSECT_H_ +#define FST_SCRIPT_INTERSECT_H_ + +#include +#include +#include +#include // for ComposeOptions, ComposeFilter + +namespace fst { +namespace script { + +typedef args::Package IntersectArgs1; + +template +void Intersect(IntersectArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Intersect(ifst1, ifst2, ofst, args->arg4); +} + +typedef args::Package IntersectArgs2; + +template +void Intersect(IntersectArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Intersect(ifst1, ifst2, ofst, args->arg4); +} + +void OPENFSTDLL Intersect(const FstClass &ifst1, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, + ComposeFilter compose_filter); + +void OPENFSTDLL Intersect(const FstClass &ifst, const FstClass &ifst2, //ChangedPD + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_INTERSECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h.bak new file mode 100755 index 00000000000..8011024eb43 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/intersect.h.bak @@ -0,0 +1,65 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INTERSECT_H_ +#define FST_SCRIPT_INTERSECT_H_ + +#include +#include +#include +#include // for ComposeOptions, ComposeFilter + +namespace fst { +namespace script { + +typedef args::Package IntersectArgs1; + +template +void Intersect(IntersectArgs1 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Intersect(ifst1, ifst2, ofst, args->arg4); +} + +typedef args::Package IntersectArgs2; + +template +void Intersect(IntersectArgs2 *args) { + const Fst &ifst1 = *(args->arg1.GetFst()); + const Fst &ifst2 = *(args->arg2.GetFst()); + MutableFst *ofst = args->arg3->GetMutableFst(); + + Intersect(ifst1, ifst2, ofst, args->arg4); +} + +void Intersect(const FstClass &ifst1, const FstClass &ifst2, + MutableFstClass *ofst, + ComposeFilter compose_filter); + +void Intersect(const FstClass &ifst, const FstClass &ifst2, + MutableFstClass *ofst, + const ComposeOptions &opts = fst::script::ComposeOptions()); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_INTERSECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/invert.h b/extlibs/openfstwin-1.3.1/include/fst/script/invert.h new file mode 100755 index 00000000000..a6956bca6de --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/invert.h @@ -0,0 +1,43 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INVERT_H_ +#define FST_SCRIPT_INVERT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// The following confuses swig, because it has the same arguments +// as the non-templated version +#ifndef SWIG +template +void Invert(MutableFstClass *fst) { + MutableFst *typed_fst = fst->GetMutableFst(); + + Invert(typed_fst); +} +#endif + +void OPENFSTDLL Invert(MutableFstClass *fst); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_INVERT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/invert.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/invert.h.bak new file mode 100755 index 00000000000..1befd9f48f7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/invert.h.bak @@ -0,0 +1,43 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_INVERT_H_ +#define FST_SCRIPT_INVERT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// The following confuses swig, because it has the same arguments +// as the non-templated version +#ifndef SWIG +template +void Invert(MutableFstClass *fst) { + MutableFst *typed_fst = fst->GetMutableFst(); + + Invert(typed_fst); +} +#endif + +void Invert(MutableFstClass *fst); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_INVERT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/map.h b/extlibs/openfstwin-1.3.1/include/fst/script/map.h new file mode 100755 index 00000000000..37426c0ddae --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/map.h @@ -0,0 +1,115 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_MAP_H_ +#define FST_SCRIPT_MAP_H_ + +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +template +Fst *ArcMap(const Fst &fst, + const M &mapper) { + typedef typename M::ToArc ToArc; + VectorFst *ofst = new VectorFst; + ArcMap(fst, ofst, mapper); + return ofst; +} + +template +Fst *StateMap(const Fst &fst, + const M &mapper) { + typedef typename M::ToArc ToArc; + VectorFst *ofst = new VectorFst; + StateMap(fst, ofst, mapper); + return ofst; +} + +enum MapType { ARC_SUM_MAPPER, IDENTITY_MAPPER, INVERT_MAPPER, PLUS_MAPPER, + QUANTIZE_MAPPER, RMWEIGHT_MAPPER, SUPERFINAL_MAPPER, + TIMES_MAPPER, TO_LOG_MAPPER, TO_LOG64_MAPPER, TO_STD_MAPPER }; + +typedef args::Package MapInnerArgs; +typedef args::WithReturnValue MapArgs; + +template +void Map(MapArgs *args) { + const Fst &ifst = *(args->args.arg1.GetFst()); + MapType map_type = args->args.arg2; + float delta = args->args.arg3; + typename Arc::Weight w = *(args->args.arg4.GetWeight()); + + if (map_type == ARC_SUM_MAPPER) { + args->retval = new FstClass( + script::StateMap(ifst, ArcSumMapper(ifst))); + } else if (map_type == IDENTITY_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, IdentityArcMapper())); + } else if (map_type == INVERT_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, InvertWeightMapper())); + } else if (map_type == PLUS_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, PlusMapper(w))); + } else if (map_type == QUANTIZE_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, QuantizeMapper(delta))); + } else if (map_type == RMWEIGHT_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, RmWeightMapper())); + } else if (map_type == SUPERFINAL_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, SuperFinalMapper())); + } else if (map_type == TIMES_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, TimesMapper(w))); + } else if (map_type == TO_LOG_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else if (map_type == TO_LOG64_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else if (map_type == TO_STD_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else { + FSTERROR() << "Error: unknown/unsupported mapper type: " + << map_type; + VectorFst *ofst = new VectorFst; + ofst->SetProperties(kError, kError); + args->retval = new FstClass(ofst); + } +} + + +#ifdef SWIG +%newobject Map; +#endif +FstClass OPENFSTDLL *Map(const FstClass& f, MapType map_type, //ChangedPD + float delta = fst::kDelta, + const WeightClass &w = fst::script::WeightClass::Zero()); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_MAP_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/map.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/map.h.bak new file mode 100755 index 00000000000..23320744e32 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/map.h.bak @@ -0,0 +1,115 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_MAP_H_ +#define FST_SCRIPT_MAP_H_ + +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +template +Fst *ArcMap(const Fst &fst, + const M &mapper) { + typedef typename M::ToArc ToArc; + VectorFst *ofst = new VectorFst; + ArcMap(fst, ofst, mapper); + return ofst; +} + +template +Fst *StateMap(const Fst &fst, + const M &mapper) { + typedef typename M::ToArc ToArc; + VectorFst *ofst = new VectorFst; + StateMap(fst, ofst, mapper); + return ofst; +} + +enum MapType { ARC_SUM_MAPPER, IDENTITY_MAPPER, INVERT_MAPPER, PLUS_MAPPER, + QUANTIZE_MAPPER, RMWEIGHT_MAPPER, SUPERFINAL_MAPPER, + TIMES_MAPPER, TO_LOG_MAPPER, TO_LOG64_MAPPER, TO_STD_MAPPER }; + +typedef args::Package MapInnerArgs; +typedef args::WithReturnValue MapArgs; + +template +void Map(MapArgs *args) { + const Fst &ifst = *(args->args.arg1.GetFst()); + MapType map_type = args->args.arg2; + float delta = args->args.arg3; + typename Arc::Weight w = *(args->args.arg4.GetWeight()); + + if (map_type == ARC_SUM_MAPPER) { + args->retval = new FstClass( + script::StateMap(ifst, ArcSumMapper(ifst))); + } else if (map_type == IDENTITY_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, IdentityArcMapper())); + } else if (map_type == INVERT_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, InvertWeightMapper())); + } else if (map_type == PLUS_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, PlusMapper(w))); + } else if (map_type == QUANTIZE_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, QuantizeMapper(delta))); + } else if (map_type == RMWEIGHT_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, RmWeightMapper())); + } else if (map_type == SUPERFINAL_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, SuperFinalMapper())); + } else if (map_type == TIMES_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, TimesMapper(w))); + } else if (map_type == TO_LOG_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else if (map_type == TO_LOG64_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else if (map_type == TO_STD_MAPPER) { + args->retval = new FstClass( + script::ArcMap(ifst, WeightConvertMapper())); + } else { + FSTERROR() << "Error: unknown/unsupported mapper type: " + << map_type; + VectorFst *ofst = new VectorFst; + ofst->SetProperties(kError, kError); + args->retval = new FstClass(ofst); + } +} + + +#ifdef SWIG +%newobject Map; +#endif +FstClass *Map(const FstClass& f, MapType map_type, + float delta = fst::kDelta, + const WeightClass &w = fst::script::WeightClass::Zero()); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_MAP_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h b/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h new file mode 100755 index 00000000000..b37b6e0ba03 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_MINIMIZE_H_ +#define FST_SCRIPT_MINIMIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package MinimizeArgs; + +template +void Minimize(MinimizeArgs *args) { + MutableFst *ofst1 = args->arg1->GetMutableFst(); + MutableFst *ofst2 = args->arg2 ? args->arg2->GetMutableFst() : 0; + + Minimize(ofst1, ofst2, args->arg3); +} + +void OPENFSTDLL Minimize(MutableFstClass *ofst1, MutableFstClass *ofst2 = 0, //ChangedPD + float delta = kDelta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_MINIMIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h.bak new file mode 100755 index 00000000000..f250d0396d0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/minimize.h.bak @@ -0,0 +1,45 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_MINIMIZE_H_ +#define FST_SCRIPT_MINIMIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package MinimizeArgs; + +template +void Minimize(MinimizeArgs *args) { + MutableFst *ofst1 = args->arg1->GetMutableFst(); + MutableFst *ofst2 = args->arg2 ? args->arg2->GetMutableFst() : 0; + + Minimize(ofst1, ofst2, args->arg3); +} + +void Minimize(MutableFstClass *ofst1, MutableFstClass *ofst2 = 0, + float delta = kDelta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_MINIMIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/print-impl.h b/extlibs/openfstwin-1.3.1/include/fst/script/print-impl.h new file mode 100755 index 00000000000..1433a2972a2 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/print-impl.h @@ -0,0 +1,149 @@ +// print.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Stand-alone class to print out binary FSTs in the AT&T format, +// helper class for fstprint.cc + +#ifndef FST_SCRIPT_PRINT_IMPL_H_ +#define FST_SCRIPT_PRINT_IMPL_H_ + +#include +#include + +#include +#include + +DECLARE_string(fst_field_separator); + +namespace fst { + +// Print a binary Fst in textual format, helper class for fstprint.cc +// WARNING: Stand-alone use of this class not recommended, most code should +// read/write using the binary format which is much more efficient. +template class FstPrinter { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + FstPrinter(const Fst &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accep, + bool show_weight_one) + : fst_(fst), isyms_(isyms), osyms_(osyms), ssyms_(ssyms), + accep_(accep && fst.Properties(kAcceptor, true)), ostrm_(0), + show_weight_one_(show_weight_one) {} + + // Print Fst to an output stream + void Print(ostream *ostrm, const string &dest) { + ostrm_ = ostrm; + dest_ = dest; + StateId start = fst_.Start(); + if (start == kNoStateId) + return; + // initial state first + PrintState(start); + for (StateIterator< Fst > siter(fst_); + !siter.Done(); + siter.Next()) { + StateId s = siter.Value(); + if (s != start) + PrintState(s); + } + } + + private: + // Maximum line length in text file. + static const int kLineLen = 8096; + + void PrintId(int64 id, const SymbolTable *syms, + const char *name) const { + if (syms) { + string symbol = syms->Find(id); + if (symbol == "") { + FSTERROR() << "FstPrinter: Integer " << id + << " is not mapped to any textual symbol" + << ", symbol table = " << syms->Name() + << ", destination = " << dest_; + symbol = "?"; + } + *ostrm_ << symbol; + } else { + *ostrm_ << id; + } + } + + void PrintStateId(StateId s) const { + PrintId(s, ssyms_, "state ID"); + } + + void PrintILabel(Label l) const { + PrintId(l, isyms_, "arc input label"); + } + + void PrintOLabel(Label l) const { + PrintId(l, osyms_, "arc output label"); + } + + void PrintState(StateId s) const { + bool output = false; + for (ArcIterator< Fst > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + PrintStateId(s); + *ostrm_ << FLAGS_fst_field_separator[0]; + PrintStateId(arc.nextstate); + *ostrm_ << FLAGS_fst_field_separator[0]; + PrintILabel(arc.ilabel); + if (!accep_) { + *ostrm_ << FLAGS_fst_field_separator[0]; + PrintOLabel(arc.olabel); + } + if (show_weight_one_ || arc.weight != Weight::One()) + *ostrm_ << FLAGS_fst_field_separator[0] << arc.weight; + *ostrm_ << "\n"; + output = true; + } + Weight final = fst_.Final(s); + if (final != Weight::Zero() || !output) { + PrintStateId(s); + if (show_weight_one_ || final != Weight::One()) { + *ostrm_ << FLAGS_fst_field_separator[0] << final; + } + *ostrm_ << "\n"; + } + } + + const Fst &fst_; + const SymbolTable *isyms_; // ilabel symbol table + const SymbolTable *osyms_; // olabel symbol table + const SymbolTable *ssyms_; // slabel symbol table + bool accep_; // print as acceptor when possible + ostream *ostrm_; // text FST destination + string dest_; // text FST destination name + bool show_weight_one_; // print weights equal to Weight::One() + DISALLOW_COPY_AND_ASSIGN(FstPrinter); +}; + +} // namespace fst + +#endif // FST_SCRIPT_PRINT_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/print.h b/extlibs/openfstwin-1.3.1/include/fst/script/print.h new file mode 100755 index 00000000000..5b3f1a3ad50 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/print.h @@ -0,0 +1,86 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PRINT_H_ +#define FST_SCRIPT_PRINT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FstPrinterArgs { + const FstClass &fst; + const SymbolTable *isyms; + const SymbolTable *osyms; + const SymbolTable *ssyms; + const bool accept; + const bool show_weight_one; + ostream *ostrm; + const string &dest; + + FstPrinterArgs(const FstClass &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accept, + bool show_weight_one, + ostream *ostrm, + const string &dest) : + fst(fst), isyms(isyms), osyms(osyms), ssyms(ssyms), accept(accept), + show_weight_one(show_weight_one), ostrm(ostrm), dest(dest) { } +}; + +template +void PrintFst(FstPrinterArgs *args) { + const Fst &fst = *(args->fst.GetFst()); + + fst::FstPrinter fstprinter(fst, args->isyms, args->osyms, + args->ssyms, args->accept, + args->show_weight_one); + fstprinter.Print(args->ostrm, args->dest); +} + +void OPENFSTDLL PrintFst(const FstClass &fst, ostream &ostrm, const string &dest, //ChangedPD + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accept, bool show_weight_one); + + +// Below are two printing methods with useful defaults for a few of +// the fst printer arguments. +template +void PrintFst(const Fst &fst, ostream &os, const string dest = "", + const SymbolTable *isyms = NULL, + const SymbolTable *osyms = NULL, + const SymbolTable *ssyms = NULL) { + fst::FstPrinter fstprinter(fst, isyms, osyms, ssyms, true, true); + fstprinter.Print(&os, dest); +} + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PRINT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/print.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/print.h.bak new file mode 100755 index 00000000000..f82b19befb4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/print.h.bak @@ -0,0 +1,86 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PRINT_H_ +#define FST_SCRIPT_PRINT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// Note: it is safe to pass these strings as references because +// this struct is only used to pass them deeper in the call graph. +// Be sure you understand why this is so before using this struct +// for anything else! +struct FstPrinterArgs { + const FstClass &fst; + const SymbolTable *isyms; + const SymbolTable *osyms; + const SymbolTable *ssyms; + const bool accept; + const bool show_weight_one; + ostream *ostrm; + const string &dest; + + FstPrinterArgs(const FstClass &fst, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accept, + bool show_weight_one, + ostream *ostrm, + const string &dest) : + fst(fst), isyms(isyms), osyms(osyms), ssyms(ssyms), accept(accept), + show_weight_one(show_weight_one), ostrm(ostrm), dest(dest) { } +}; + +template +void PrintFst(FstPrinterArgs *args) { + const Fst &fst = *(args->fst.GetFst()); + + fst::FstPrinter fstprinter(fst, args->isyms, args->osyms, + args->ssyms, args->accept, + args->show_weight_one); + fstprinter.Print(args->ostrm, args->dest); +} + +void PrintFst(const FstClass &fst, ostream &ostrm, const string &dest, + const SymbolTable *isyms, + const SymbolTable *osyms, + const SymbolTable *ssyms, + bool accept, bool show_weight_one); + + +// Below are two printing methods with useful defaults for a few of +// the fst printer arguments. +template +void PrintFst(const Fst &fst, ostream &os, const string dest = "", + const SymbolTable *isyms = NULL, + const SymbolTable *osyms = NULL, + const SymbolTable *ssyms = NULL) { + fst::FstPrinter fstprinter(fst, isyms, osyms, ssyms, true, true); + fstprinter.Print(&os, dest); +} + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PRINT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/project.h b/extlibs/openfstwin-1.3.1/include/fst/script/project.h new file mode 100755 index 00000000000..ab54934d273 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/project.h @@ -0,0 +1,43 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PROJECT_H_ +#define FST_SCRIPT_PROJECT_H_ + +#include +#include +#include // for ProjectType + +namespace fst { +namespace script { + +typedef args::Package ProjectArgs; + +template +void Project(ProjectArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + Project(ofst, args->arg2); +} + +void OPENFSTDLL Project(MutableFstClass *ofst, ProjectType project_type); //ChangedPD + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PROJECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/project.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/project.h.bak new file mode 100755 index 00000000000..12ee890768e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/project.h.bak @@ -0,0 +1,43 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PROJECT_H_ +#define FST_SCRIPT_PROJECT_H_ + +#include +#include +#include // for ProjectType + +namespace fst { +namespace script { + +typedef args::Package ProjectArgs; + +template +void Project(ProjectArgs *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + Project(ofst, args->arg2); +} + +void Project(MutableFstClass *ofst, ProjectType project_type); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PROJECT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/prune.h b/extlibs/openfstwin-1.3.1/include/fst/script/prune.h new file mode 100755 index 00000000000..1a601515087 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/prune.h @@ -0,0 +1,153 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PRUNE_H_ +#define FST_SCRIPT_PRUNE_H_ + +#include +using std::vector; + +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +struct PruneOptions { + WeightClass weight_threshold; + int64 state_threshold; + const vector *distance; + float delta; + + explicit PruneOptions(const WeightClass& w, int64 s, + vector *d = 0, float e = kDelta) + : weight_threshold(w), + state_threshold(s), + distance(d), + delta(e) {} + private: + PruneOptions(); // disallow +}; + +// converts a script::PruneOptions into a fst::PruneOptions. +// Notes: +// If the original opts.distance is not NULL, a new distance will be +// created with new; it's the client's responsibility to delete this. + +template +fst::PruneOptions > ConvertPruneOptions( + const PruneOptions &opts) { + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + Weight weight_threshold = *(opts.weight_threshold.GetWeight()); + StateId state_threshold = opts.state_threshold; + vector *distance = 0; + + if (opts.distance) { + distance = new vector(opts.distance->size()); + for (unsigned i = 0; i < opts.distance->size(); ++i) { + (*distance)[i] = *((*opts.distance)[i].GetWeight()); + } + } + + return fst::PruneOptions >( + weight_threshold, state_threshold, AnyArcFilter(), distance, + opts.delta); +} + +// 1 +typedef args::Package PruneArgs1; + +template +void Prune(PruneArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + fst::PruneOptions > opts = + ConvertPruneOptions(args->arg2); + Prune(ofst, opts); + delete opts.distance; +} + +// 2 +typedef args::Package PruneArgs2; + +template +void Prune(PruneArgs2 *args) { + const Fst& ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + fst::PruneOptions > opts = + ConvertPruneOptions(args->arg3); + Prune(ifst, ofst, opts); + delete opts.distance; +} + +// 3 +typedef args::Package PruneArgs3; + +template +void Prune(PruneArgs3 *args) { + const Fst& ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + typename Arc::Weight w = *(args->arg3.GetWeight()); + + Prune(ifst, ofst, w, args->arg4, args->arg5); +} + +// 4 +typedef args::Package PruneArgs4; +template +void Prune(PruneArgs4 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typename Arc::Weight w = *(args->arg2.GetWeight()); + Prune(fst, w, args->arg3, args->arg4); +} + + +// 1 +void OPENFSTDLL Prune(MutableFstClass *fst, const PruneOptions &opts); //ChangedPD + +// 2 +void OPENFSTDLL Prune(const FstClass &ifst, MutableFstClass *fst, //ChangedPD + const PruneOptions &opts); + +// 3 +void OPENFSTDLL Prune(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + const WeightClass &weight_threshold, + int64 state_threshold = kNoStateId, + float delta = kDelta); + +// 4 +void OPENFSTDLL Prune(MutableFstClass *fst, const WeightClass& weight_threshold, //ChangedPD + int64 state_threshold, float delta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PRUNE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/prune.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/prune.h.bak new file mode 100755 index 00000000000..7118ff1276c --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/prune.h.bak @@ -0,0 +1,153 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PRUNE_H_ +#define FST_SCRIPT_PRUNE_H_ + +#include +using std::vector; + +#include +#include +#include +#include +#include + +namespace fst { +namespace script { + +struct PruneOptions { + WeightClass weight_threshold; + int64 state_threshold; + const vector *distance; + float delta; + + explicit PruneOptions(const WeightClass& w, int64 s, + vector *d = 0, float e = kDelta) + : weight_threshold(w), + state_threshold(s), + distance(d), + delta(e) {} + private: + PruneOptions(); // disallow +}; + +// converts a script::PruneOptions into a fst::PruneOptions. +// Notes: +// If the original opts.distance is not NULL, a new distance will be +// created with new; it's the client's responsibility to delete this. + +template +fst::PruneOptions > ConvertPruneOptions( + const PruneOptions &opts) { + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + Weight weight_threshold = *(opts.weight_threshold.GetWeight()); + StateId state_threshold = opts.state_threshold; + vector *distance = 0; + + if (opts.distance) { + distance = new vector(opts.distance->size()); + for (unsigned i = 0; i < opts.distance->size(); ++i) { + (*distance)[i] = *((*opts.distance)[i].GetWeight()); + } + } + + return fst::PruneOptions >( + weight_threshold, state_threshold, AnyArcFilter(), distance, + opts.delta); +} + +// 1 +typedef args::Package PruneArgs1; + +template +void Prune(PruneArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + fst::PruneOptions > opts = + ConvertPruneOptions(args->arg2); + Prune(ofst, opts); + delete opts.distance; +} + +// 2 +typedef args::Package PruneArgs2; + +template +void Prune(PruneArgs2 *args) { + const Fst& ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + fst::PruneOptions > opts = + ConvertPruneOptions(args->arg3); + Prune(ifst, ofst, opts); + delete opts.distance; +} + +// 3 +typedef args::Package PruneArgs3; + +template +void Prune(PruneArgs3 *args) { + const Fst& ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + typename Arc::Weight w = *(args->arg3.GetWeight()); + + Prune(ifst, ofst, w, args->arg4, args->arg5); +} + +// 4 +typedef args::Package PruneArgs4; +template +void Prune(PruneArgs4 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typename Arc::Weight w = *(args->arg2.GetWeight()); + Prune(fst, w, args->arg3, args->arg4); +} + + +// 1 +void Prune(MutableFstClass *fst, const PruneOptions &opts); + +// 2 +void Prune(const FstClass &ifst, MutableFstClass *fst, + const PruneOptions &opts); + +// 3 +void Prune(const FstClass &ifst, MutableFstClass *ofst, + const WeightClass &weight_threshold, + int64 state_threshold = kNoStateId, + float delta = kDelta); + +// 4 +void Prune(MutableFstClass *fst, const WeightClass& weight_threshold, + int64 state_threshold, float delta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PRUNE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/push.h b/extlibs/openfstwin-1.3.1/include/fst/script/push.h new file mode 100755 index 00000000000..71c2e4cbce1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/push.h @@ -0,0 +1,70 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PUSH_H_ +#define FST_SCRIPT_PUSH_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package PushArgs1; + +template +void Push(PushArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + if (args->arg2 == REWEIGHT_TO_FINAL) { + fst::Push(ofst, REWEIGHT_TO_FINAL, args->arg3, args->arg4); + } else { + fst::Push(ofst, REWEIGHT_TO_INITIAL, args->arg3, args->arg4); + } +} + +// 2 +typedef args::Package PushArgs2; + +template +void Push(PushArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + if (args->arg4 == REWEIGHT_TO_FINAL) { + fst::Push(ifst, ofst, args->arg3, args->arg5); + } else { + fst::Push(ifst, ofst, args->arg3, args->arg5); + } +} + +// 1 +void OPENFSTDLL Push(MutableFstClass *ofst, ReweightType type, float delta = kDelta, //ChangedPD + bool remove_total_weight = false); + +// 2 +void OPENFSTDLL Push(const FstClass &ifst, MutableFstClass *ofst, uint32 flags, //ChangedPD + ReweightType dir, float delta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PUSH_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/push.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/push.h.bak new file mode 100755 index 00000000000..cebd6556fca --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/push.h.bak @@ -0,0 +1,70 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_PUSH_H_ +#define FST_SCRIPT_PUSH_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package PushArgs1; + +template +void Push(PushArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + if (args->arg2 == REWEIGHT_TO_FINAL) { + fst::Push(ofst, REWEIGHT_TO_FINAL, args->arg3, args->arg4); + } else { + fst::Push(ofst, REWEIGHT_TO_INITIAL, args->arg3, args->arg4); + } +} + +// 2 +typedef args::Package PushArgs2; + +template +void Push(PushArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + if (args->arg4 == REWEIGHT_TO_FINAL) { + fst::Push(ifst, ofst, args->arg3, args->arg5); + } else { + fst::Push(ifst, ofst, args->arg3, args->arg5); + } +} + +// 1 +void Push(MutableFstClass *ofst, ReweightType type, float delta = kDelta, + bool remove_total_weight = false); + +// 2 +void Push(const FstClass &ifst, MutableFstClass *ofst, uint32 flags, + ReweightType dir, float delta); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_PUSH_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h b/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h new file mode 100755 index 00000000000..eb25a9f8e5b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h @@ -0,0 +1,105 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RANDEQUIVALENT_H_ +#define FST_SCRIPT_RANDEQUIVALENT_H_ + +#include +#include +#include // for RandArcSelection +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package RandEquivalentInnerArgs1; +typedef args::WithReturnValue RandEquivalentArgs1; + +template +void RandEquivalent(RandEquivalentArgs1 *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg3, args->args.arg4, + args->args.arg5, args->args.arg6); +} + +// 2 +typedef args::Package &> + RandEquivalentInnerArgs2; + +typedef args::WithReturnValue RandEquivalentArgs2; + +template +void RandEquivalent(RandEquivalentArgs2 *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + const RandGenOptions &opts = args->args.arg6; + int32 seed = args->args.arg3; + + if (opts.arc_selector == UNIFORM_ARC_SELECTOR) { + UniformArcSelector arc_selector(seed); + RandGenOptions< UniformArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } else if (opts.arc_selector == FAST_LOG_PROB_ARC_SELECTOR) { + FastLogProbArcSelector arc_selector(seed); + RandGenOptions< FastLogProbArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } else { + LogProbArcSelector arc_selector(seed); + RandGenOptions< LogProbArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } +} + + +// 1 +bool OPENFSTDLL RandEquivalent(const FstClass &fst1, //ChangedPD + const FstClass &fst2, + int32 seed = time(0), + ssize_t num_paths = 1, + float delta = fst::kDelta, + int path_length = INT_MAX); + +// 2 +bool OPENFSTDLL RandEquivalent(const FstClass &fst1, //ChangedPD + const FstClass &fst2, + int32 seed, + ssize_t num_paths, + float delta, + const fst::RandGenOptions< + fst::script::RandArcSelection> &opts); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_RANDEQUIVALENT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h.bak new file mode 100755 index 00000000000..b9296832eaa --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/randequivalent.h.bak @@ -0,0 +1,105 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RANDEQUIVALENT_H_ +#define FST_SCRIPT_RANDEQUIVALENT_H_ + +#include +#include +#include // for RandArcSelection +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package RandEquivalentInnerArgs1; +typedef args::WithReturnValue RandEquivalentArgs1; + +template +void RandEquivalent(RandEquivalentArgs1 *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg3, args->args.arg4, + args->args.arg5, args->args.arg6); +} + +// 2 +typedef args::Package &> + RandEquivalentInnerArgs2; + +typedef args::WithReturnValue RandEquivalentArgs2; + +template +void RandEquivalent(RandEquivalentArgs2 *args) { + const Fst &fst1 = *(args->args.arg1.GetFst()); + const Fst &fst2 = *(args->args.arg2.GetFst()); + const RandGenOptions &opts = args->args.arg6; + int32 seed = args->args.arg3; + + if (opts.arc_selector == UNIFORM_ARC_SELECTOR) { + UniformArcSelector arc_selector(seed); + RandGenOptions< UniformArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } else if (opts.arc_selector == FAST_LOG_PROB_ARC_SELECTOR) { + FastLogProbArcSelector arc_selector(seed); + RandGenOptions< FastLogProbArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } else { + LogProbArcSelector arc_selector(seed); + RandGenOptions< LogProbArcSelector > + ropts(arc_selector, opts.max_length, opts.npath); + args->retval = RandEquivalent(fst1, fst2, args->args.arg4, + args->args.arg5, ropts); + } +} + + +// 1 +bool RandEquivalent(const FstClass &fst1, + const FstClass &fst2, + int32 seed = time(0), + ssize_t num_paths = 1, + float delta = fst::kDelta, + int path_length = INT_MAX); + +// 2 +bool RandEquivalent(const FstClass &fst1, + const FstClass &fst2, + int32 seed, + ssize_t num_paths, + float delta, + const fst::RandGenOptions< + fst::script::RandArcSelection> &opts); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_RANDEQUIVALENT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h b/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h new file mode 100755 index 00000000000..9456019efcd --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h @@ -0,0 +1,76 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RANDGEN_H_ +#define FST_SCRIPT_RANDGEN_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +enum RandArcSelection { + UNIFORM_ARC_SELECTOR, + LOG_PROB_ARC_SELECTOR, + FAST_LOG_PROB_ARC_SELECTOR +}; + +typedef args::Package &> RandGenArgs; + +template +void RandGen(RandGenArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + int32 seed = args->arg3; + const RandGenOptions &opts = args->arg4; + + if (opts.arc_selector == UNIFORM_ARC_SELECTOR) { + UniformArcSelector arc_selector(seed); + RandGenOptions< UniformArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } else if (opts.arc_selector == FAST_LOG_PROB_ARC_SELECTOR) { + FastLogProbArcSelector arc_selector(seed); + RandGenOptions< FastLogProbArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } else { + LogProbArcSelector arc_selector(seed); + RandGenOptions< LogProbArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } +} + + +// Client-facing prototype +void OPENFSTDLL RandGen(const FstClass &ifst, MutableFstClass *ofst, int32 seed = time(0), //ChangedPD + const RandGenOptions &opts = + fst::RandGenOptions( + fst::script::UNIFORM_ARC_SELECTOR)); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_RANDGEN_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h.bak new file mode 100755 index 00000000000..817f9c1671a --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/randgen.h.bak @@ -0,0 +1,76 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RANDGEN_H_ +#define FST_SCRIPT_RANDGEN_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +enum RandArcSelection { + UNIFORM_ARC_SELECTOR, + LOG_PROB_ARC_SELECTOR, + FAST_LOG_PROB_ARC_SELECTOR +}; + +typedef args::Package &> RandGenArgs; + +template +void RandGen(RandGenArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + int32 seed = args->arg3; + const RandGenOptions &opts = args->arg4; + + if (opts.arc_selector == UNIFORM_ARC_SELECTOR) { + UniformArcSelector arc_selector(seed); + RandGenOptions< UniformArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } else if (opts.arc_selector == FAST_LOG_PROB_ARC_SELECTOR) { + FastLogProbArcSelector arc_selector(seed); + RandGenOptions< FastLogProbArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } else { + LogProbArcSelector arc_selector(seed); + RandGenOptions< LogProbArcSelector > + ropts(arc_selector, opts.max_length, + opts.npath, opts.weighted); + RandGen(ifst, ofst, ropts); + } +} + + +// Client-facing prototype +void RandGen(const FstClass &ifst, MutableFstClass *ofst, int32 seed = time(0), + const RandGenOptions &opts = + fst::RandGenOptions( + fst::script::UNIFORM_ARC_SELECTOR)); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_RANDGEN_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/register.h b/extlibs/openfstwin-1.3.1/include/fst/script/register.h new file mode 100755 index 00000000000..03e0e36c5fa --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/register.h @@ -0,0 +1,120 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REGISTER_H_ +#define FST_SCRIPT_REGISTER_H_ + +#include + +#include +#include +#include + +// Holds methods and classes responsible for maintaining +// the register for FstClass arc types. + +namespace fst { +namespace script { + +// +// Registers for reading and converting various kinds of FST classes. +// + +// This class definition is to avoid a nested class definition inside +// the IORegistration struct. +template +struct FstClassRegEntry { + Reader reader; + Creator creator; + Converter converter; + + FstClassRegEntry(Reader r, Creator cr, Converter co) : + reader(r), creator(cr), converter(co) { } + FstClassRegEntry() : reader(0), creator(0), converter(0) { } +}; + +template +class FstClassIORegister + : public GenericRegister, + FstClassIORegister > { + public: + Reader GetReader(const string &arc_type) const { + return this->GetEntry(arc_type).reader; + } + + Creator GetCreator(const string &arc_type) const { + return this->GetEntry(arc_type).creator; + } + + Converter GetConverter(const string &arc_type) const { + return this->GetEntry(arc_type).converter; + } + + protected: + virtual string ConvertKeyToSoFilename( + const string& key) const { + string legal_type(key); + ConvertToLegalCSymbol(&legal_type); + + return legal_type + "-arc.so"; + } +}; + +// +// Struct containing everything needed to register a particular type +// of FST class (e.g. a plain FstClass, or a MutableFstClass, etc) +// +template +struct IORegistration { + typedef FstClassType *(*Reader)(istream &stream, + const FstReadOptions &opts); + + typedef FstClassImplBase *(*Creator)(); + typedef FstClassImplBase *(*Converter)(const FstClass &other); + + typedef FstClassRegEntry Entry; + + // FST class Register + typedef FstClassIORegister Register; + + // FST class Register-er + typedef GenericRegisterer > + Registerer; +}; + + +// +// REGISTRATION MACROS +// + +#define REGISTER_FST_CLASS(Class, Arc) \ + static IORegistration::Registerer Class ## _ ## Arc ## _registerer( \ + Arc::Type(), \ + IORegistration::Entry(Class::Read, \ + Class::Create, \ + Class::Convert)) + +#define REGISTER_FST_CLASSES(Arc) \ + REGISTER_FST_CLASS(FstClass, Arc); \ + REGISTER_FST_CLASS(MutableFstClass, Arc); \ + REGISTER_FST_CLASS(VectorFstClass, Arc); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REGISTER_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h b/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h new file mode 100755 index 00000000000..d936416d5e6 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h @@ -0,0 +1,102 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RELABEL_H_ +#define FST_SCRIPT_RELABEL_H_ + +#include +using std::pair; using std::make_pair; +#include +#include +using std::vector; + +#include +#include +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package RelabelArgs1; + +template +void Relabel(RelabelArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + Relabel(ofst, args->arg2, args->arg3, args->arg4, + args->arg5, args->arg6, args->arg7); +} + +// 2 +typedef args::Package > &, + const vector > > RelabelArgs2; + +template +void Relabel(RelabelArgs2 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + // In case int64 is not the same as Arc::Label, + // copy the reassignments + typedef typename Arc::Label Label; + + vector > converted_ipairs(args->arg2.size()); + copy(args->arg2.begin(), args->arg2.end(), converted_ipairs.begin()); + + vector > converted_opairs(args->arg3.size()); + copy(args->arg3.begin(), args->arg3.end(), converted_opairs.begin()); + + Relabel(ofst, converted_ipairs, converted_opairs); +} + +// 3 +typedef args::Package RelabelArgs3; +template +void Relabel(args::Package *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + Relabel(fst, args->arg2, args->arg3); +} + + +// 1 +void OPENFSTDLL Relabel(MutableFstClass *ofst, //ChangedPD + const SymbolTable *old_isyms, const SymbolTable *relabel_isyms, + bool attach_new_isyms, + const SymbolTable *old_osyms, const SymbolTable *relabel_osyms, + bool attch_new_osyms); + +// 2 +void OPENFSTDLL Relabel(MutableFstClass *ofst, //ChangedPD + const vector > &ipairs, + const vector > &opairs); + + +// 3 +void OPENFSTDLL Relabel(MutableFstClass *fst, //ChangedPD + const SymbolTable *new_isymbols, + const SymbolTable *new_osymbols); + + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_RELABEL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h.bak new file mode 100755 index 00000000000..6bbb4c50bcc --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/relabel.h.bak @@ -0,0 +1,102 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RELABEL_H_ +#define FST_SCRIPT_RELABEL_H_ + +#include +using std::pair; using std::make_pair; +#include +#include +using std::vector; + +#include +#include +#include + +namespace fst { +namespace script { + +// 1 +typedef args::Package RelabelArgs1; + +template +void Relabel(RelabelArgs1 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + Relabel(ofst, args->arg2, args->arg3, args->arg4, + args->arg5, args->arg6, args->arg7); +} + +// 2 +typedef args::Package > &, + const vector > > RelabelArgs2; + +template +void Relabel(RelabelArgs2 *args) { + MutableFst *ofst = args->arg1->GetMutableFst(); + + // In case int64 is not the same as Arc::Label, + // copy the reassignments + typedef typename Arc::Label Label; + + vector > converted_ipairs(args->arg2.size()); + copy(args->arg2.begin(), args->arg2.end(), converted_ipairs.begin()); + + vector > converted_opairs(args->arg3.size()); + copy(args->arg3.begin(), args->arg3.end(), converted_opairs.begin()); + + Relabel(ofst, converted_ipairs, converted_opairs); +} + +// 3 +typedef args::Package RelabelArgs3; +template +void Relabel(args::Package *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + Relabel(fst, args->arg2, args->arg3); +} + + +// 1 +void Relabel(MutableFstClass *ofst, + const SymbolTable *old_isyms, const SymbolTable *relabel_isyms, + bool attach_new_isyms, + const SymbolTable *old_osyms, const SymbolTable *relabel_osyms, + bool attch_new_osyms); + +// 2 +void Relabel(MutableFstClass *ofst, + const vector > &ipairs, + const vector > &opairs); + + +// 3 +void Relabel(MutableFstClass *fst, + const SymbolTable *new_isymbols, + const SymbolTable *new_osymbols); + + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_RELABEL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/replace.h b/extlibs/openfstwin-1.3.1/include/fst/script/replace.h new file mode 100755 index 00000000000..44b40396637 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/replace.h @@ -0,0 +1,62 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REPLACE_H_ +#define FST_SCRIPT_REPLACE_H_ + +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package > &, + MutableFstClass *, const int64, bool> ReplaceArgs; + +template +void Replace(ReplaceArgs *args) { + // Now that we know the arc type, we construct a vector of + // pair that the real Replace will use + const vector >& untyped_tuples = + args->arg1; + + vector *> > fst_tuples( + untyped_tuples.size()); + + for (unsigned i = 0; i < untyped_tuples.size(); ++i) { + fst_tuples[i].first = untyped_tuples[i].first; // convert label + fst_tuples[i].second = untyped_tuples[i].second->GetFst(); + } + + MutableFst *ofst = args->arg2->GetMutableFst(); + + Replace(fst_tuples, ofst, args->arg3, args->arg4); +} + +void OPENFSTDLL Replace(const vector > &tuples, //ChangedPD + MutableFstClass *ofst, const int64 &root, + bool epsilon_on_replace = false); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REPLACE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/replace.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/replace.h.bak new file mode 100755 index 00000000000..5eaf5bf6c00 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/replace.h.bak @@ -0,0 +1,62 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REPLACE_H_ +#define FST_SCRIPT_REPLACE_H_ + +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package > &, + MutableFstClass *, const int64, bool> ReplaceArgs; + +template +void Replace(ReplaceArgs *args) { + // Now that we know the arc type, we construct a vector of + // pair that the real Replace will use + const vector >& untyped_tuples = + args->arg1; + + vector *> > fst_tuples( + untyped_tuples.size()); + + for (unsigned i = 0; i < untyped_tuples.size(); ++i) { + fst_tuples[i].first = untyped_tuples[i].first; // convert label + fst_tuples[i].second = untyped_tuples[i].second->GetFst(); + } + + MutableFst *ofst = args->arg2->GetMutableFst(); + + Replace(fst_tuples, ofst, args->arg3, args->arg4); +} + +void Replace(const vector > &tuples, + MutableFstClass *ofst, const int64 &root, + bool epsilon_on_replace = false); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REPLACE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h b/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h new file mode 100755 index 00000000000..e03e0e0f370 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REVERSE_H_ +#define FST_SCRIPT_REVERSE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ReverseArgs; + +template +void Reverse(ReverseArgs *args) { + const Fst &fst1 = *(args->arg1.GetFst()); + MutableFst *fst2 = args->arg2->GetMutableFst(); + + Reverse(fst1, fst2); +} + +void OPENFSTDLL Reverse(const FstClass &fst1, MutableFstClass *fst2); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REVERSE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h.bak new file mode 100755 index 00000000000..39308755071 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/reverse.h.bak @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REVERSE_H_ +#define FST_SCRIPT_REVERSE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package ReverseArgs; + +template +void Reverse(ReverseArgs *args) { + const Fst &fst1 = *(args->arg1.GetFst()); + MutableFst *fst2 = args->arg2->GetMutableFst(); + + Reverse(fst1, fst2); +} + +void Reverse(const FstClass &fst1, MutableFstClass *fst2); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REVERSE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h b/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h new file mode 100755 index 00000000000..0ed45c5c049 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h @@ -0,0 +1,53 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REWEIGHT_H_ +#define FST_SCRIPT_REWEIGHT_H_ + +#include +using std::vector; + +#include +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package &, + ReweightType> ReweightArgs; + +template +void Reweight(ReweightArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typedef typename Arc::Weight Weight; + vector potentials(args->arg2.size()); + + for (unsigned i = 0; i < args->arg2.size(); ++i) { + potentials[i] = *(args->arg2[i].GetWeight()); + } + + Reweight(fst, potentials, args->arg3); +} + +void OPENFSTDLL Reweight(MutableFstClass *fst, const vector &potential, //ChangedPD + ReweightType reweight_type); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REWEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h.bak new file mode 100755 index 00000000000..7bce8398ef1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/reweight.h.bak @@ -0,0 +1,53 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_REWEIGHT_H_ +#define FST_SCRIPT_REWEIGHT_H_ + +#include +using std::vector; + +#include +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package &, + ReweightType> ReweightArgs; + +template +void Reweight(ReweightArgs *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typedef typename Arc::Weight Weight; + vector potentials(args->arg2.size()); + + for (unsigned i = 0; i < args->arg2.size(); ++i) { + potentials[i] = *(args->arg2[i].GetWeight()); + } + + Reweight(fst, potentials, args->arg3); +} + +void Reweight(MutableFstClass *fst, const vector &potential, + ReweightType reweight_type); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_REWEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h b/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h new file mode 100755 index 00000000000..ea39dc28ab4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h @@ -0,0 +1,211 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RMEPSILON_H_ +#define FST_SCRIPT_RMEPSILON_H_ + +#include +using std::vector; + +#include +#include +#include +#include // for ShortestDistanceOptions +#include +#include + +// the following is necessary, or SWIG complains mightily about +// shortestdistanceoptions not being defined before being used as a base. +#ifdef SWIG +%include "nlp/fst/script/shortest-distance.h" +#endif + + +namespace fst { +namespace script { + +// +// OPTIONS +// + +struct RmEpsilonOptions : public fst::script::ShortestDistanceOptions { + bool connect; + WeightClass weight_threshold; + int64 state_threshold; + + RmEpsilonOptions(QueueType qt = AUTO_QUEUE, float d = kDelta, bool c = true, + WeightClass w = fst::script::WeightClass::Zero(), + int64 n = kNoStateId) + : ShortestDistanceOptions(qt, EPSILON_ARC_FILTER, + kNoStateId, d), + connect(c), weight_threshold(w), state_threshold(n) { } +}; + + +// +// TEMPLATES +// + +// this function takes care of transforming a script-land RmEpsilonOptions +// into a lib-land RmEpsilonOptions +template +void RmEpsilonHelper(MutableFst *fst, + vector *distance, + const RmEpsilonOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + typename Arc::Weight weight_thresh = + *(opts.weight_threshold.GetWeight()); + + switch (opts.queue_type) { + case AUTO_QUEUE: { + AutoQueue queue(*fst, distance, EpsilonArcFilter()); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case FIFO_QUEUE: { + FifoQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case LIFO_QUEUE: { + LifoQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case SHORTEST_FIRST_QUEUE: { + NaturalShortestFirstQueue queue(*distance); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case STATE_ORDER_QUEUE: { + StateOrderQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case TOP_ORDER_QUEUE: { + TopOrderQueue queue(*fst, EpsilonArcFilter()); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + default: + FSTERROR() << "Unknown or unsupported queue type: " << opts.queue_type; + fst->SetProperties(kError, kError); + } +} + +// 1 +typedef args::Package RmEpsilonArgs1; + +template +void RmEpsilon(RmEpsilonArgs1 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + vector distance; + bool reverse = args->arg3; + + if (reverse) { + VectorFst rfst; + Reverse(ifst, &rfst); + RmEpsilonHelper(&rfst, &distance, args->arg4); + Reverse(rfst, ofst); + } else { + *ofst = ifst; + } + RmEpsilonHelper(ofst, &distance, args->arg4); +} + +// 2 +typedef args::Package RmEpsilonArgs2; + +template +void RmEpsilon(RmEpsilonArgs2 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typename Arc::Weight w = *(args->arg3.GetWeight()); + + RmEpsilon(fst, args->arg2, w, args->arg4, args->arg5); +} + +// 3 +typedef args::Package *, + const RmEpsilonOptions &> RmEpsilonArgs3; + +template +void RmEpsilon(RmEpsilonArgs3 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + const RmEpsilonOptions &opts = args->arg3; + + vector weights; + + RmEpsilonHelper(fst, &weights, opts); + + // Copy the weights back + args->arg2->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg2)[i] = WeightClass(weights[i]); + } +} + +// +// PROTOTYPES +// + +// 1 +void OPENFSTDLL RmEpsilon(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + bool reverse = false, + const RmEpsilonOptions& opts = + fst::script::RmEpsilonOptions()); + +// 2 +void OPENFSTDLL RmEpsilon(MutableFstClass *arc, bool connect = true, //ChangedPD + const WeightClass &weight_threshold = + fst::script::WeightClass::Zero(), + int64 state_threshold = fst::kNoStateId, + float delta = fst::kDelta); + +// 3 +void OPENFSTDLL RmEpsilon(MutableFstClass *fst, vector *distance, //ChangedPD + const RmEpsilonOptions &opts); + + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_RMEPSILON_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h.bak new file mode 100755 index 00000000000..62fed037384 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/rmepsilon.h.bak @@ -0,0 +1,211 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_RMEPSILON_H_ +#define FST_SCRIPT_RMEPSILON_H_ + +#include +using std::vector; + +#include +#include +#include +#include // for ShortestDistanceOptions +#include +#include + +// the following is necessary, or SWIG complains mightily about +// shortestdistanceoptions not being defined before being used as a base. +#ifdef SWIG +%include "nlp/fst/script/shortest-distance.h" +#endif + + +namespace fst { +namespace script { + +// +// OPTIONS +// + +struct RmEpsilonOptions : public fst::script::ShortestDistanceOptions { + bool connect; + WeightClass weight_threshold; + int64 state_threshold; + + RmEpsilonOptions(QueueType qt = AUTO_QUEUE, float d = kDelta, bool c = true, + WeightClass w = fst::script::WeightClass::Zero(), + int64 n = kNoStateId) + : ShortestDistanceOptions(qt, EPSILON_ARC_FILTER, + kNoStateId, d), + connect(c), weight_threshold(w), state_threshold(n) { } +}; + + +// +// TEMPLATES +// + +// this function takes care of transforming a script-land RmEpsilonOptions +// into a lib-land RmEpsilonOptions +template +void RmEpsilonHelper(MutableFst *fst, + vector *distance, + const RmEpsilonOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + typename Arc::Weight weight_thresh = + *(opts.weight_threshold.GetWeight()); + + switch (opts.queue_type) { + case AUTO_QUEUE: { + AutoQueue queue(*fst, distance, EpsilonArcFilter()); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case FIFO_QUEUE: { + FifoQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case LIFO_QUEUE: { + LifoQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case SHORTEST_FIRST_QUEUE: { + NaturalShortestFirstQueue queue(*distance); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case STATE_ORDER_QUEUE: { + StateOrderQueue queue; + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + case TOP_ORDER_QUEUE: { + TopOrderQueue queue(*fst, EpsilonArcFilter()); + fst::RmEpsilonOptions > ropts( + &queue, opts.delta, opts.connect, weight_thresh, + opts.state_threshold); + RmEpsilon(fst, distance, ropts); + break; + } + default: + FSTERROR() << "Unknown or unsupported queue type: " << opts.queue_type; + fst->SetProperties(kError, kError); + } +} + +// 1 +typedef args::Package RmEpsilonArgs1; + +template +void RmEpsilon(RmEpsilonArgs1 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + vector distance; + bool reverse = args->arg3; + + if (reverse) { + VectorFst rfst; + Reverse(ifst, &rfst); + RmEpsilonHelper(&rfst, &distance, args->arg4); + Reverse(rfst, ofst); + } else { + *ofst = ifst; + } + RmEpsilonHelper(ofst, &distance, args->arg4); +} + +// 2 +typedef args::Package RmEpsilonArgs2; + +template +void RmEpsilon(RmEpsilonArgs2 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + typename Arc::Weight w = *(args->arg3.GetWeight()); + + RmEpsilon(fst, args->arg2, w, args->arg4, args->arg5); +} + +// 3 +typedef args::Package *, + const RmEpsilonOptions &> RmEpsilonArgs3; + +template +void RmEpsilon(RmEpsilonArgs3 *args) { + MutableFst *fst = args->arg1->GetMutableFst(); + const RmEpsilonOptions &opts = args->arg3; + + vector weights; + + RmEpsilonHelper(fst, &weights, opts); + + // Copy the weights back + args->arg2->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg2)[i] = WeightClass(weights[i]); + } +} + +// +// PROTOTYPES +// + +// 1 +void RmEpsilon(const FstClass &ifst, MutableFstClass *ofst, + bool reverse = false, + const RmEpsilonOptions& opts = + fst::script::RmEpsilonOptions()); + +// 2 +void RmEpsilon(MutableFstClass *arc, bool connect = true, + const WeightClass &weight_threshold = + fst::script::WeightClass::Zero(), + int64 state_threshold = fst::kNoStateId, + float delta = fst::kDelta); + +// 3 +void RmEpsilon(MutableFstClass *fst, vector *distance, + const RmEpsilonOptions &opts); + + +} // namespace script +} // namespace fst + + +#endif // FST_SCRIPT_RMEPSILON_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/script-impl.h b/extlibs/openfstwin-1.3.1/include/fst/script/script-impl.h new file mode 100755 index 00000000000..452c7c5ff07 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/script-impl.h @@ -0,0 +1,206 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// This file defines the registration mechanism for new operations. +// These operations are designed to enable scripts to work with FST classes +// at a high level. + +// If you have a new arc type and want these operations to work with FSTs +// with that arc type, see below for the registration steps +// you must take. + +// These methods are only recommended for use in high-level scripting +// applications. Most users should use the lower-level templated versions +// corresponding to these. + +// If you have a new arc type you'd like these operations to work with, +// use the REGISTER_FST_OPERATIONS macro defined in fstcsript.h + +// If you have a custom operation you'd like to define, you need four +// components. In the following, assume you want to create a new operation +// with the signature +// +// void Foo(const FstClass &ifst, MutableFstClass *ofst); +// +// You need: +// +// 1) A way to bundle the args that your new Foo operation will take, as +// a single struct. The template structs in arg-packs.h provide a handy +// way to do this. In Foo's case, that might look like this: +// +// typedef args::Package FooArgs; +// +// Note: this package of args is going to be passed by non-const pointer. +// +// 2) A function template that is able to perform Foo, given the args and +// arc type. Yours might look like this: +// +// template +// void Foo(FooArgs *args) { +// // Pull out the actual, arc-templated FSTs +// const Fst &ifst = args->arg1.GetFst(); +// MutableFst *ofst = args->arg2->GetMutableFst(); +// +// // actually perform foo on ifst and ofst... +// } +// +// 3) a client-facing function for your operation. This would look like +// the following: +// +// void Foo(const FstClass &ifst, MutableFstClass *ofst) { +// // Check that the arc types of the FSTs match +// if (!ArcTypesMatch(ifst, *ofst, "Foo")) return; +// // package the args +// FooArgs args(ifst, ofst); +// // Finally, call the operation +// Apply >("Foo", ifst->ArcType(), &args); +// } +// +// The Apply<> function template takes care of the link between 2 and 3, +// provided you also have: +// +// 4) A registration for your new operation, on the arc types you care about. +// This can be provided easily by the REGISTER_FST_OPERATION macro in +// operations.h: +// +// REGISTER_FST_OPERATION(Foo, StdArc, FooArgs); +// REGISTER_FST_OPERATION(Foo, MyArc, FooArgs); +// // .. etc +// +// +// That's it! Now when you call Foo(const FstClass &, MutableFstClass *), +// it dispatches (in #3) via the Apply<> function to the correct +// instantiation of the template function in #2. +// + + +#ifndef FST_SCRIPT_SCRIPT_IMPL_H_ +#define FST_SCRIPT_SCRIPT_IMPL_H_ + +// +// This file contains general-purpose templates which are used in the +// implementation of the operations. +// + +#include +using std::pair; using std::make_pair; +#include + +#include +#include +#include + +#include + +namespace fst { +namespace script { + +// +// A generic register for operations with various kinds of signatures. +// Needed since every function signature requires a new registration class. +// The pair is understood to be the operation name and arc +// type; subclasses (or typedefs) need only provide the operation signature. +// + +template +class GenericOperationRegister + : public GenericRegister, + OperationSignature, + GenericOperationRegister > { + public: + void RegisterOperation(const string &operation_name, + const string &arc_type, + OperationSignature op) { + this->SetEntry(make_pair(operation_name, arc_type), op); + } + + OperationSignature GetOperation( + const string &operation_name, const string &arc_type) { + return this->GetEntry(make_pair(operation_name, arc_type)); + } + + protected: + virtual string ConvertKeyToSoFilename( + const pair& key) const { + // Just use the old-style FST for now. + string legal_type(key.second); // the arc type + ConvertToLegalCSymbol(&legal_type); + + return legal_type + "-arc.so"; + } +}; + + +// Operation package - everything you need to register a new type of operation + +// The ArgPack should be the type that's passed into each wrapped function - +// for instance, it might be a struct containing all the args. +// It's always passed by pointer, so const members should be used to enforce +// constness where it's needed. Return values should be implemented as a +// member of ArgPack as well. + +template +struct Operation { + typedef ArgPack Args; + typedef void (*OpType)(ArgPack *args); + + // The register (hash) type + typedef GenericOperationRegister Register; + + // The register-er type + typedef GenericRegisterer Registerer; +}; + + +// Macro for registering new types of operations. + +#define REGISTER_FST_OPERATION(Op, Arc, ArgPack) \ + static fst::script::Operation::Registerer \ + arc_dispatched_operation_ ## ArgPack ## Op ## Arc ## _registerer( \ + make_pair(#Op, Arc::Type()), Op) + + +// +// Template function to apply an operation by name +// + +template +void Apply(const string &op_name, const string &arc_type, + typename OpReg::Args *args) { + typename OpReg::Register *reg = OpReg::Register::GetRegister(); + + typename OpReg::OpType op = reg->GetOperation(op_name, arc_type); + + if (op == 0) { + FSTERROR() << "No operation found for \"" << op_name << "\" on " + << "arc type " << arc_type; + return; + } + + op(args); +} + + +// Helper that logs to ERROR if the arc types of a and b don't match. +// The op_name is also printed. +bool ArcTypesMatch(const FstClass &a, const FstClass &b, + const string &op_name); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_SCRIPT_IMPL_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h new file mode 100755 index 00000000000..f9a6e47267f --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h @@ -0,0 +1,250 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SHORTEST_DISTANCE_H_ +#define FST_SCRIPT_SHORTEST_DISTANCE_H_ + +#include +using std::vector; + +#include +#include +#include +#include // for ArcFilterType +#include // for QueueType +#include + +namespace fst { +namespace script { + +enum ArcFilterType { ANY_ARC_FILTER, EPSILON_ARC_FILTER, + INPUT_EPSILON_ARC_FILTER, OUTPUT_EPSILON_ARC_FILTER }; + +// See nlp/fst/lib/shortest-distance.h for the template options class +// that this one shadows +struct ShortestDistanceOptions { + const QueueType queue_type; + const ArcFilterType arc_filter_type; + const int64 source; + const float delta; + const bool first_path; + + ShortestDistanceOptions(QueueType qt, ArcFilterType aft, int64 s, + float d) + : queue_type(qt), arc_filter_type(aft), source(s), delta(d), + first_path(false) { } +}; + + + +// 1 +typedef args::Package *, + const ShortestDistanceOptions &> ShortestDistanceArgs1; + +template +struct QueueConstructor { + // template + static Queue *Construct(const Fst &, + const vector *) { + return new Queue(); + } +}; + +// Specializations to deal with AutoQueue, NaturalShortestFirstQueue, +// and TopOrderQueue's different constructors +template +struct QueueConstructor, Arc, ArcFilter> { + // template + static AutoQueue *Construct( + const Fst &fst, + const vector *distance) { + return new AutoQueue(fst, distance, ArcFilter()); + } +}; + +template +struct QueueConstructor, + Arc, ArcFilter> { + // template + static NaturalShortestFirstQueue + *Construct(const Fst &fst, + const vector *distance) { + return new NaturalShortestFirstQueue(*distance); + } +}; + +template +struct QueueConstructor, Arc, ArcFilter> { + // template + static TopOrderQueue *Construct( + const Fst &fst, const vector *weights) { + return new TopOrderQueue(fst, ArcFilter()); + } +}; + + +template +void ShortestDistanceHelper(ShortestDistanceArgs1 *args) { + const Fst &fst = *(args->arg1.GetFst()); + const ShortestDistanceOptions &opts = args->arg3; + + vector weights; + + switch (opts.arc_filter_type) { + case ANY_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, AnyArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, EpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case INPUT_EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, InputEpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case OUTPUT_EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, OutputEpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + } + + // Copy the weights back + args->arg2->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg2)[i] = WeightClass(weights[i]); + } +} + +template +void ShortestDistance(ShortestDistanceArgs1 *args) { + const ShortestDistanceOptions &opts = args->arg3; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + // Must consider (opts.queue_type x opts.filter_type) options + switch (opts.queue_type) { + default: + FSTERROR() << "Unknown queue type." << opts.queue_type; + + case AUTO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case FIFO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case LIFO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case SHORTEST_FIRST_QUEUE: + ShortestDistanceHelper >(args); + return; + + case STATE_ORDER_QUEUE: + ShortestDistanceHelper >(args); + return; + + case TOP_ORDER_QUEUE: + ShortestDistanceHelper >(args); + return; + } +} + +// 2 +typedef args::Package*, + bool, double> ShortestDistanceArgs2; + +template +void ShortestDistance(ShortestDistanceArgs2 *args) { + const Fst &fst = *(args->arg1.GetFst()); + vector distance; + + ShortestDistance(fst, &distance, args->arg3, args->arg4); + + // convert the typed weights back into weightclass + vector *retval = args->arg2; + retval->resize(distance.size()); + + for (unsigned i = 0; i < distance.size(); ++i) { + (*retval)[i] = WeightClass(distance[i]); + } +} + +// 3 +typedef args::WithReturnValue ShortestDistanceArgs3; + +template +void ShortestDistance(ShortestDistanceArgs3 *args) { + const Fst &fst = *(args->args.GetFst()); + + args->retval = WeightClass(ShortestDistance(fst)); +} + + +// 1 +void OPENFSTDLL ShortestDistance(const FstClass &fst, vector *distance, //ChangedPD + const ShortestDistanceOptions &opts); + +// 2 +void OPENFSTDLL ShortestDistance(const FstClass &ifst, vector *distance, //ChangedPD + bool reverse = false, double delta = fst::kDelta); + +#ifndef SWIG +// 3 +WeightClass OPENFSTDLL ShortestDistance(const FstClass &ifst); //ChangedPD +#endif + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_SHORTEST_DISTANCE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h.bak new file mode 100755 index 00000000000..5fc2976b7b5 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-distance.h.bak @@ -0,0 +1,250 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SHORTEST_DISTANCE_H_ +#define FST_SCRIPT_SHORTEST_DISTANCE_H_ + +#include +using std::vector; + +#include +#include +#include +#include // for ArcFilterType +#include // for QueueType +#include + +namespace fst { +namespace script { + +enum ArcFilterType { ANY_ARC_FILTER, EPSILON_ARC_FILTER, + INPUT_EPSILON_ARC_FILTER, OUTPUT_EPSILON_ARC_FILTER }; + +// See nlp/fst/lib/shortest-distance.h for the template options class +// that this one shadows +struct ShortestDistanceOptions { + const QueueType queue_type; + const ArcFilterType arc_filter_type; + const int64 source; + const float delta; + const bool first_path; + + ShortestDistanceOptions(QueueType qt, ArcFilterType aft, int64 s, + float d) + : queue_type(qt), arc_filter_type(aft), source(s), delta(d), + first_path(false) { } +}; + + + +// 1 +typedef args::Package *, + const ShortestDistanceOptions &> ShortestDistanceArgs1; + +template +struct QueueConstructor { + // template + static Queue *Construct(const Fst &, + const vector *) { + return new Queue(); + } +}; + +// Specializations to deal with AutoQueue, NaturalShortestFirstQueue, +// and TopOrderQueue's different constructors +template +struct QueueConstructor, Arc, ArcFilter> { + // template + static AutoQueue *Construct( + const Fst &fst, + const vector *distance) { + return new AutoQueue(fst, distance, ArcFilter()); + } +}; + +template +struct QueueConstructor, + Arc, ArcFilter> { + // template + static NaturalShortestFirstQueue + *Construct(const Fst &fst, + const vector *distance) { + return new NaturalShortestFirstQueue(*distance); + } +}; + +template +struct QueueConstructor, Arc, ArcFilter> { + // template + static TopOrderQueue *Construct( + const Fst &fst, const vector *weights) { + return new TopOrderQueue(fst, ArcFilter()); + } +}; + + +template +void ShortestDistanceHelper(ShortestDistanceArgs1 *args) { + const Fst &fst = *(args->arg1.GetFst()); + const ShortestDistanceOptions &opts = args->arg3; + + vector weights; + + switch (opts.arc_filter_type) { + case ANY_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, AnyArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, EpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case INPUT_EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, InputEpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + case OUTPUT_EPSILON_ARC_FILTER: { + Queue *queue = + QueueConstructor >::Construct( + fst, &weights); + fst::ShortestDistanceOptions > sdopts( + queue, OutputEpsilonArcFilter(), opts.source, opts.delta); + ShortestDistance(fst, &weights, sdopts); + delete queue; + break; + } + } + + // Copy the weights back + args->arg2->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg2)[i] = WeightClass(weights[i]); + } +} + +template +void ShortestDistance(ShortestDistanceArgs1 *args) { + const ShortestDistanceOptions &opts = args->arg3; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + // Must consider (opts.queue_type x opts.filter_type) options + switch (opts.queue_type) { + default: + FSTERROR() << "Unknown queue type." << opts.queue_type; + + case AUTO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case FIFO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case LIFO_QUEUE: + ShortestDistanceHelper >(args); + return; + + case SHORTEST_FIRST_QUEUE: + ShortestDistanceHelper >(args); + return; + + case STATE_ORDER_QUEUE: + ShortestDistanceHelper >(args); + return; + + case TOP_ORDER_QUEUE: + ShortestDistanceHelper >(args); + return; + } +} + +// 2 +typedef args::Package*, + bool, double> ShortestDistanceArgs2; + +template +void ShortestDistance(ShortestDistanceArgs2 *args) { + const Fst &fst = *(args->arg1.GetFst()); + vector distance; + + ShortestDistance(fst, &distance, args->arg3, args->arg4); + + // convert the typed weights back into weightclass + vector *retval = args->arg2; + retval->resize(distance.size()); + + for (unsigned i = 0; i < distance.size(); ++i) { + (*retval)[i] = WeightClass(distance[i]); + } +} + +// 3 +typedef args::WithReturnValue ShortestDistanceArgs3; + +template +void ShortestDistance(ShortestDistanceArgs3 *args) { + const Fst &fst = *(args->args.GetFst()); + + args->retval = WeightClass(ShortestDistance(fst)); +} + + +// 1 +void ShortestDistance(const FstClass &fst, vector *distance, + const ShortestDistanceOptions &opts); + +// 2 +void ShortestDistance(const FstClass &ifst, vector *distance, + bool reverse = false, double delta = fst::kDelta); + +#ifndef SWIG +// 3 +WeightClass ShortestDistance(const FstClass &ifst); +#endif + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_SHORTEST_DISTANCE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h new file mode 100755 index 00000000000..f609e79a147 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h @@ -0,0 +1,190 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SHORTEST_PATH_H_ +#define FST_SCRIPT_SHORTEST_PATH_H_ + +#include +using std::vector; + +#include +#include +#include +#include +#include // for ShortestDistanceOptions + +namespace fst { +namespace script { + +struct ShortestPathOptions + : public fst::script::ShortestDistanceOptions { + const size_t nshortest; + const bool unique; + const bool has_distance; + const bool first_path; + const WeightClass weight_threshold; + const int64 state_threshold; + + ShortestPathOptions(QueueType qt, size_t n = 1, + bool u = false, bool hasdist = false, + float d = fst::kDelta, bool fp = false, + WeightClass w = fst::script::WeightClass::Zero(), + int64 s = fst::kNoStateId) + : ShortestDistanceOptions(qt, ANY_ARC_FILTER, kNoStateId, d), + nshortest(n), unique(u), has_distance(hasdist), first_path(fp), + weight_threshold(w), state_threshold(s) { } +}; + +typedef args::Package *, const ShortestPathOptions &> + ShortestPathArgs1; + + +template +void ShortestPath(ShortestPathArgs1 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + const ShortestPathOptions &opts = args->arg4; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef AnyArcFilter ArcFilter; + + vector weights; + typename Arc::Weight weight_threshold = + *(opts.weight_threshold.GetWeight()); + + switch (opts.queue_type) { + case AUTO_QUEUE: { + typedef AutoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case FIFO_QUEUE: { + typedef FifoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case LIFO_QUEUE: { + typedef LifoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case SHORTEST_FIRST_QUEUE: { + typedef NaturalShortestFirstQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case STATE_ORDER_QUEUE: { + typedef StateOrderQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case TOP_ORDER_QUEUE: { + typedef TopOrderQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + default: + FSTERROR() << "Unknown queue type: " << opts.queue_type; + ofst->SetProperties(kError, kError); + } + + // Copy the weights back + args->arg3->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg3)[i] = WeightClass(weights[i]); + } +} + +// 2 +typedef args::Package ShortestPathArgs2; + +template +void ShortestPath(ShortestPathArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + typename Arc::Weight weight_threshold = + *(args->arg6.GetWeight()); + + ShortestPath(ifst, ofst, args->arg3, args->arg4, args->arg5, + weight_threshold, args->arg7); +} + + +// 1 +void OPENFSTDLL ShortestPath(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + vector *distance, + const ShortestPathOptions &opts); + + +// 2 +void OPENFSTDLL ShortestPath(const FstClass &ifst, MutableFstClass *ofst, //ChangedPD + size_t n = 1, bool unique = false, + bool first_path = false, + WeightClass weight_threshold = + fst::script::WeightClass::Zero(), + int64 state_threshold = fst::kNoStateId); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_SHORTEST_PATH_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h.bak new file mode 100755 index 00000000000..b3a3eb9d61c --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/shortest-path.h.bak @@ -0,0 +1,190 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SHORTEST_PATH_H_ +#define FST_SCRIPT_SHORTEST_PATH_H_ + +#include +using std::vector; + +#include +#include +#include +#include +#include // for ShortestDistanceOptions + +namespace fst { +namespace script { + +struct ShortestPathOptions + : public fst::script::ShortestDistanceOptions { + const size_t nshortest; + const bool unique; + const bool has_distance; + const bool first_path; + const WeightClass weight_threshold; + const int64 state_threshold; + + ShortestPathOptions(QueueType qt, size_t n = 1, + bool u = false, bool hasdist = false, + float d = fst::kDelta, bool fp = false, + WeightClass w = fst::script::WeightClass::Zero(), + int64 s = fst::kNoStateId) + : ShortestDistanceOptions(qt, ANY_ARC_FILTER, kNoStateId, d), + nshortest(n), unique(u), has_distance(hasdist), first_path(fp), + weight_threshold(w), state_threshold(s) { } +}; + +typedef args::Package *, const ShortestPathOptions &> + ShortestPathArgs1; + + +template +void ShortestPath(ShortestPathArgs1 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + const ShortestPathOptions &opts = args->arg4; + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef AnyArcFilter ArcFilter; + + vector weights; + typename Arc::Weight weight_threshold = + *(opts.weight_threshold.GetWeight()); + + switch (opts.queue_type) { + case AUTO_QUEUE: { + typedef AutoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case FIFO_QUEUE: { + typedef FifoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case LIFO_QUEUE: { + typedef LifoQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case SHORTEST_FIRST_QUEUE: { + typedef NaturalShortestFirstQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case STATE_ORDER_QUEUE: { + typedef StateOrderQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + case TOP_ORDER_QUEUE: { + typedef TopOrderQueue Queue; + Queue *queue = QueueConstructor::Construct(ifst, &weights); + fst::ShortestPathOptions spopts( + queue, ArcFilter(), opts.nshortest, opts.unique, + opts.has_distance, opts.delta, opts.first_path, + weight_threshold, opts.state_threshold); + ShortestPath(ifst, ofst, &weights, spopts); + delete queue; + return; + } + default: + FSTERROR() << "Unknown queue type: " << opts.queue_type; + ofst->SetProperties(kError, kError); + } + + // Copy the weights back + args->arg3->resize(weights.size()); + for (unsigned i = 0; i < weights.size(); ++i) { + (*args->arg3)[i] = WeightClass(weights[i]); + } +} + +// 2 +typedef args::Package ShortestPathArgs2; + +template +void ShortestPath(ShortestPathArgs2 *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + typename Arc::Weight weight_threshold = + *(args->arg6.GetWeight()); + + ShortestPath(ifst, ofst, args->arg3, args->arg4, args->arg5, + weight_threshold, args->arg7); +} + + +// 1 +void ShortestPath(const FstClass &ifst, MutableFstClass *ofst, + vector *distance, + const ShortestPathOptions &opts); + + +// 2 +void ShortestPath(const FstClass &ifst, MutableFstClass *ofst, + size_t n = 1, bool unique = false, + bool first_path = false, + WeightClass weight_threshold = + fst::script::WeightClass::Zero(), + int64 state_threshold = fst::kNoStateId); + +} // namespace script +} // namespace fst + + + +#endif // FST_SCRIPT_SHORTEST_PATH_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/symbols.h b/extlibs/openfstwin-1.3.1/include/fst/script/symbols.h new file mode 100755 index 00000000000..927600a420d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/symbols.h @@ -0,0 +1,20 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SYMBOLS_H_ +#define FST_SCRIPT_SYMBOLS_H_ + +#endif // FST_SCRIPT_SYMBOLS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h b/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h new file mode 100755 index 00000000000..0d32c3f43b3 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SYNCHRONIZE_H_ +#define FST_SCRIPT_SYNCHRONIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package SynchronizeArgs; + +template +void Synchronize(SynchronizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + Synchronize(ifst, ofst); +} + +void OPENFSTDLL Synchronize(const FstClass &ifst, MutableFstClass *ofst); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_SYNCHRONIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h.bak new file mode 100755 index 00000000000..3c0c9059aa4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/synchronize.h.bak @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_SYNCHRONIZE_H_ +#define FST_SCRIPT_SYNCHRONIZE_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package SynchronizeArgs; + +template +void Synchronize(SynchronizeArgs *args) { + const Fst &ifst = *(args->arg1.GetFst()); + MutableFst *ofst = args->arg2->GetMutableFst(); + + Synchronize(ifst, ofst); +} + +void Synchronize(const FstClass &ifst, MutableFstClass *ofst); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_SYNCHRONIZE_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h b/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h new file mode 100755 index 00000000000..6b6e4817c42 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h @@ -0,0 +1,51 @@ +// text-io.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// Modified: jpr@google.com (Jake Ratkiewicz) to work with generic WeightClass +// +// \file +// Utilities for reading and writing textual strings representing +// states, labels, and weights and files specifying label-label pairs +// and potentials (state-weight pairs). +// + +#ifndef FST_SCRIPT_TEXT_IO_H__ +#define FST_SCRIPT_TEXT_IO_H__ + +#include +#include +using std::vector; + + +#include +#include +#include +#include + +namespace fst { +namespace script { + +bool OPENFSTDLL ReadPotentials(const string &weight_type, //ChangedPD + const string& filename, + vector* potential); + +bool OPENFSTDLL WritePotentials(const string& filename, //ChangedPD + const vector& potential); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_TEXT_IO_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h.bak new file mode 100755 index 00000000000..d97a00799de --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/text-io.h.bak @@ -0,0 +1,51 @@ +// text-io.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// Modified: jpr@google.com (Jake Ratkiewicz) to work with generic WeightClass +// +// \file +// Utilities for reading and writing textual strings representing +// states, labels, and weights and files specifying label-label pairs +// and potentials (state-weight pairs). +// + +#ifndef FST_SCRIPT_TEXT_IO_H__ +#define FST_SCRIPT_TEXT_IO_H__ + +#include +#include +using std::vector; + + +#include +#include +#include +#include + +namespace fst { +namespace script { + +bool ReadPotentials(const string &weight_type, + const string& filename, + vector* potential); + +bool WritePotentials(const string& filename, + const vector& potential); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_TEXT_IO_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h b/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h new file mode 100755 index 00000000000..9a13e255ee8 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h @@ -0,0 +1,40 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_TOPSORT_H_ +#define FST_SCRIPT_TOPSORT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::WithReturnValue TopSortArgs; + +template +void TopSort(TopSortArgs *args) { + MutableFst *fst = args->args->GetMutableFst(); + args->retval = TopSort(fst); +} + +bool OPENFSTDLL TopSort(MutableFstClass *fst); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_TOPSORT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h.bak new file mode 100755 index 00000000000..4e27e482151 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/topsort.h.bak @@ -0,0 +1,40 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_TOPSORT_H_ +#define FST_SCRIPT_TOPSORT_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::WithReturnValue TopSortArgs; + +template +void TopSort(TopSortArgs *args) { + MutableFst *fst = args->args->GetMutableFst(); + args->retval = TopSort(fst); +} + +bool TopSort(MutableFstClass *fst); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_TOPSORT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/union.h b/extlibs/openfstwin-1.3.1/include/fst/script/union.h new file mode 100755 index 00000000000..ca37128d3bd --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/union.h @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_UNION_H_ +#define FST_SCRIPT_UNION_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package UnionArgs; + +template +void Union(UnionArgs *args) { + MutableFst *fst1 = args->arg1->GetMutableFst(); + const Fst &fst2 = *(args->arg2.GetFst()); + + Union(fst1, fst2); +} + +void OPENFSTDLL Union(MutableFstClass *fst1, const FstClass &fst2); //ChangedPD + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_UNION_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/union.h.bak b/extlibs/openfstwin-1.3.1/include/fst/script/union.h.bak new file mode 100755 index 00000000000..780e4847a2e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/union.h.bak @@ -0,0 +1,42 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +#ifndef FST_SCRIPT_UNION_H_ +#define FST_SCRIPT_UNION_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::Package UnionArgs; + +template +void Union(UnionArgs *args) { + MutableFst *fst1 = args->arg1->GetMutableFst(); + const Fst &fst2 = *(args->arg2.GetFst()); + + Union(fst1, fst2); +} + +void Union(MutableFstClass *fst1, const FstClass &fst2); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_UNION_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/verify.h b/extlibs/openfstwin-1.3.1/include/fst/script/verify.h new file mode 100755 index 00000000000..c92215be1d1 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/verify.h @@ -0,0 +1,40 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: sorenj@google.com (Jeffrey Sorensen) + +#ifndef FST_SCRIPT_VERIFY_H_ +#define FST_SCRIPT_VERIFY_H_ + +#include +#include +#include + +namespace fst { +namespace script { + +typedef args::WithReturnValue VerifyArgs; + +template +void Verify(VerifyArgs *args) { + const Fst *fst = args->args->GetFst(); + args->retval = Verify(*fst); +} + +bool OPENFSTDLL Verify(const FstClass &fst1); + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_VERIFY_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/script/weight-class.h b/extlibs/openfstwin-1.3.1/include/fst/script/weight-class.h new file mode 100755 index 00000000000..43a51826599 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/script/weight-class.h @@ -0,0 +1,216 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: jpr@google.com (Jake Ratkiewicz) + +// Represents a generic weight in an FST -- that is, represents a specific +// type of weight underneath while hiding that type from a client. + + +#ifndef FST_SCRIPT_WEIGHT_CLASS_H_ +#define FST_SCRIPT_WEIGHT_CLASS_H_ + +#include + +#include +#include + +namespace fst { +namespace script { + +class WeightImplBase { + public: + virtual WeightImplBase *Copy() const = 0; + virtual void Print(ostream *o) const = 0; + virtual const string &Type() const = 0; + virtual string to_string() const = 0; + virtual bool operator == (const WeightImplBase &other) const = 0; + virtual ~WeightImplBase() { } +}; + +template +struct WeightClassImpl : public WeightImplBase { + W weight; + + explicit WeightClassImpl(const W& weight) : weight(weight) { } + + virtual WeightClassImpl *Copy() const { + return new WeightClassImpl(weight); + } + + virtual const string &Type() const { return W::Type(); } + + virtual void Print(ostream *o) const { + *o << weight; + } + + virtual string to_string() const { + ostringstream s; + s << weight; + return s.str(); + } + + virtual bool operator == (const WeightImplBase &other) const { + if (Type() != other.Type()) { + return false; + } else { + const WeightClassImpl *typed_other = + static_cast *>(&other); + + return typed_other->weight == weight; + } + } +}; + + +class WeightClass { + public: + WeightClass() : element_type_(ZERO), impl_(0) { } + + template + explicit WeightClass(const W& weight) + : element_type_(OTHER), impl_(new WeightClassImpl(weight)) { } + + OPENFSTDLL WeightClass(const string &weight_type, const string &weight_str); //ChangedPD + + WeightClass(const WeightClass &other) : + element_type_(other.element_type_), + impl_(other.impl_ ? other.impl_->Copy() : 0) { } + + WeightClass &operator = (const WeightClass &other) { + if (impl_) delete impl_; + impl_ = other.impl_ ? other.impl_->Copy() : 0; + element_type_ = other.element_type_; + return *this; + } + + template + const W* GetWeight() const; + + string to_string() const { + switch (element_type_) { + case ZERO: + return "ZERO"; + case ONE: + return "ONE"; + default: + case OTHER: + return impl_->to_string(); + } + } + + bool operator == (const WeightClass &other) const { + return element_type_ == other.element_type_ && + ((impl_ && other.impl_ && (*impl_ == *other.impl_)) || + (impl_ == 0 && other.impl_ == 0)); + } + + static const WeightClass &Zero() { + static WeightClass w(ZERO); + + return w; + } + + static const WeightClass &One() { + static WeightClass w(ONE); + + return w; + } + + ~WeightClass() { if (impl_) delete impl_; } + private: + enum ElementType { ZERO, ONE, OTHER }; + ElementType element_type_; + + WeightImplBase *impl_; + + explicit WeightClass(ElementType et) : element_type_(et), impl_(0) { } + + friend ostream &operator << (ostream &o, const WeightClass &c); +}; + +template +const W* WeightClass::GetWeight() const { + // We need to store zero and one as statics, because the weight type + // W might return them as temporaries. We're returning a pointer, + // and it won't do to get the address of a temporary. + static const W zero = W::Zero(); + static const W one = W::One(); + + if (element_type_ == ZERO) { + return &zero; + } else if (element_type_ == ONE) { + return &one; + } else { + if (W::Type() != impl_->Type()) { + return NULL; + } else { + WeightClassImpl *typed_impl = + static_cast *>(impl_); + return &typed_impl->weight; + } + } +} + +// +// Registration for generic weight types. +// + +typedef WeightImplBase* (*StrToWeightImplBaseT)(const string &str, + const string &src, + size_t nline); + +template +WeightImplBase* StrToWeightImplBase(const string &str, + const string &src, size_t nline) { + return new WeightClassImpl(StrToWeight(str, src, nline)); +} + +// The following confuses swig, and doesn't need to be wrapped anyway. +#ifndef SWIG +ostream& operator << (ostream &o, const WeightClass &c); + +class WeightClassRegister : public GenericRegister { + protected: + virtual string ConvertKeyToSoFilename(const string &key) const { + return key + ".so"; + } +}; + +typedef GenericRegisterer WeightClassRegisterer; +#endif + +// internal version, needs to be called by wrapper in order for +// macro args to expand +#define REGISTER_FST_WEIGHT__(Weight, line) \ + static WeightClassRegisterer weight_registerer ## _ ## line( \ + Weight::Type(), \ + StrToWeightImplBase) + +// This layer is where __FILE__ and __LINE__ are expanded +#define REGISTER_FST_WEIGHT_EXPANDER(Weight, line) \ + REGISTER_FST_WEIGHT__(Weight, line) + +// +// Macro for registering new weight types. Clients call this. +// +#define REGISTER_FST_WEIGHT(Weight) \ + REGISTER_FST_WEIGHT_EXPANDER(Weight, __LINE__) + +} // namespace script +} // namespace fst + +#endif // FST_SCRIPT_WEIGHT_CLASS_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/shortest-distance.h b/extlibs/openfstwin-1.3.1/include/fst/shortest-distance.h new file mode 100755 index 00000000000..5d38409c8a7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/shortest-distance.h @@ -0,0 +1,347 @@ +// shortest-distance.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions and classes to find shortest distance in an FST. + +#ifndef FST_LIB_SHORTEST_DISTANCE_H__ +#define FST_LIB_SHORTEST_DISTANCE_H__ + +#include +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +template +struct ShortestDistanceOptions { + typedef typename Arc::StateId StateId; + + Queue *state_queue; // Queue discipline used; owned by caller + ArcFilter arc_filter; // Arc filter (e.g., limit to only epsilon graph) + StateId source; // If kNoStateId, use the Fst's initial state + float delta; // Determines the degree of convergence required + bool first_path; // For a semiring with the path property (o.w. + // undefined), compute the shortest-distances along + // along the first path to a final state found + // by the algorithm. That path is the shortest-path + // only if the FST has a unique final state (or all + // the final states have the same final weight), the + // queue discipline is shortest-first and all the + // weights in the FST are between One() and Zero() + // according to NaturalLess. + + ShortestDistanceOptions(Queue *q, ArcFilter filt, StateId src = kNoStateId, + float d = kDelta) + : state_queue(q), arc_filter(filt), source(src), delta(d), + first_path(false) {} +}; + + +// Computation state of the shortest-distance algorithm. Reusable +// information is maintained across calls to member function +// ShortestDistance(source) when 'retain' is true for improved +// efficiency when calling multiple times from different source states +// (e.g., in epsilon removal). Contrary to usual conventions, 'fst' +// may not be freed before this class. Vector 'distance' should not be +// modified by the user between these calls. +// The Error() method returns true if an error was encountered. +template +class ShortestDistanceState { + public: + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + ShortestDistanceState( + const Fst &fst, + vector *distance, + const ShortestDistanceOptions &opts, + bool retain) + : fst_(fst), distance_(distance), state_queue_(opts.state_queue), + arc_filter_(opts.arc_filter), delta_(opts.delta), + first_path_(opts.first_path), retain_(retain), source_id_(0), + error_(false) { + distance_->clear(); + } + + ~ShortestDistanceState() {} + + void ShortestDistance(StateId source); + + bool Error() const { return error_; } + + private: + const Fst &fst_; + vector *distance_; + Queue *state_queue_; + ArcFilter arc_filter_; + float delta_; + bool first_path_; + bool retain_; // Retain and reuse information across calls + + vector rdistance_; // Relaxation distance. + vector enqueued_; // Is state enqueued? + vector sources_; // Source ID for ith state in 'distance_', + // 'rdistance_', and 'enqueued_' if retained. + StateId source_id_; // Unique ID characterizing each call to SD + + bool error_; +}; + +// Compute the shortest distance. If 'source' is kNoStateId, use +// the initial state of the Fst. +template +void ShortestDistanceState::ShortestDistance( + StateId source) { + if (fst_.Start() == kNoStateId) { + if (fst_.Properties(kError, false)) error_ = true; + return; + } + + if (!(Weight::Properties() & kRightSemiring)) { + FSTERROR() << "ShortestDistance: Weight needs to be right distributive: " + << Weight::Type(); + error_ = true; + return; + } + + if (first_path_ && !(Weight::Properties() & kPath)) { + FSTERROR() << "ShortestDistance: first_path option disallowed when " + << "Weight does not have the path property: " + << Weight::Type(); + error_ = true; + return; + } + + state_queue_->Clear(); + + if (!retain_) { + distance_->clear(); + rdistance_.clear(); + enqueued_.clear(); + } + + if (source == kNoStateId) + source = fst_.Start(); + + while (distance_->size() <= source) { + distance_->push_back(Weight::Zero()); + rdistance_.push_back(Weight::Zero()); + enqueued_.push_back(false); + } + if (retain_) { + while (sources_.size() <= source) + sources_.push_back(kNoStateId); + sources_[source] = source_id_; + } + (*distance_)[source] = Weight::One(); + rdistance_[source] = Weight::One(); + enqueued_[source] = true; + + state_queue_->Enqueue(source); + + while (!state_queue_->Empty()) { + StateId s = state_queue_->Head(); + state_queue_->Dequeue(); + while (distance_->size() <= s) { + distance_->push_back(Weight::Zero()); + rdistance_.push_back(Weight::Zero()); + enqueued_.push_back(false); + } + if (first_path_ && (fst_.Final(s) != Weight::Zero())) + break; + enqueued_[s] = false; + Weight r = rdistance_[s]; + rdistance_[s] = Weight::Zero(); + for (ArcIterator< Fst > aiter(fst_, s); + !aiter.Done(); + aiter.Next()) { + const Arc &arc = aiter.Value(); + if (!arc_filter_(arc) || arc.weight == Weight::Zero()) + continue; + while (distance_->size() <= arc.nextstate) { + distance_->push_back(Weight::Zero()); + rdistance_.push_back(Weight::Zero()); + enqueued_.push_back(false); + } + if (retain_) { + while (sources_.size() <= arc.nextstate) + sources_.push_back(kNoStateId); + if (sources_[arc.nextstate] != source_id_) { + (*distance_)[arc.nextstate] = Weight::Zero(); + rdistance_[arc.nextstate] = Weight::Zero(); + enqueued_[arc.nextstate] = false; + sources_[arc.nextstate] = source_id_; + } + } + Weight &nd = (*distance_)[arc.nextstate]; + Weight &nr = rdistance_[arc.nextstate]; + Weight w = Times(r, arc.weight); + if (!ApproxEqual(nd, Plus(nd, w), delta_)) { + nd = Plus(nd, w); + nr = Plus(nr, w); + if (!nd.Member() || !nr.Member()) { + error_ = true; + return; + } + if (!enqueued_[arc.nextstate]) { + state_queue_->Enqueue(arc.nextstate); + enqueued_[arc.nextstate] = true; + } else { + state_queue_->Update(arc.nextstate); + } + } + } + } + ++source_id_; + if (fst_.Properties(kError, false)) error_ = true; +} + + +// Shortest-distance algorithm: this version allows fine control +// via the options argument. See below for a simpler interface. +// +// This computes the shortest distance from the 'opts.source' state to +// each visited state S and stores the value in the 'distance' vector. +// An unvisited state S has distance Zero(), which will be stored in +// the 'distance' vector if S is less than the maximum visited state. +// The state queue discipline, arc filter, and convergence delta are +// taken in the options argument. +// The 'distance' vector will contain a unique element for which +// Member() is false if an error was encountered. +// +// The weights must must be right distributive and k-closed (i.e., 1 + +// x + x^2 + ... + x^(k +1) = 1 + x + x^2 + ... + x^k). +// +// The algorithm is from Mohri, "Semiring Framweork and Algorithms for +// Shortest-Distance Problems", Journal of Automata, Languages and +// Combinatorics 7(3):321-350, 2002. The complexity of algorithm +// depends on the properties of the semiring and the queue discipline +// used. Refer to the paper for more details. +template +void ShortestDistance( + const Fst &fst, + vector *distance, + const ShortestDistanceOptions &opts) { + + ShortestDistanceState + sd_state(fst, distance, opts, false); + sd_state.ShortestDistance(opts.source); + if (sd_state.Error()) { + distance->clear(); + distance->resize(1, Arc::Weight::NoWeight()); + } +} + +// Shortest-distance algorithm: simplified interface. See above for a +// version that allows finer control. +// +// If 'reverse' is false, this computes the shortest distance from the +// initial state to each state S and stores the value in the +// 'distance' vector. If 'reverse' is true, this computes the shortest +// distance from each state to the final states. An unvisited state S +// has distance Zero(), which will be stored in the 'distance' vector +// if S is less than the maximum visited state. The state queue +// discipline is automatically-selected. +// The 'distance' vector will contain a unique element for which +// Member() is false if an error was encountered. +// +// The weights must must be right (left) distributive if reverse is +// false (true) and k-closed (i.e., 1 + x + x^2 + ... + x^(k +1) = 1 + +// x + x^2 + ... + x^k). +// +// The algorithm is from Mohri, "Semiring Framweork and Algorithms for +// Shortest-Distance Problems", Journal of Automata, Languages and +// Combinatorics 7(3):321-350, 2002. The complexity of algorithm +// depends on the properties of the semiring and the queue discipline +// used. Refer to the paper for more details. +template +void ShortestDistance(const Fst &fst, + vector *distance, + bool reverse = false, + float delta = kDelta) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + if (!reverse) { + AnyArcFilter arc_filter; + AutoQueue state_queue(fst, distance, arc_filter); + ShortestDistanceOptions< Arc, AutoQueue, AnyArcFilter > + opts(&state_queue, arc_filter); + opts.delta = delta; + ShortestDistance(fst, distance, opts); + } else { + typedef ReverseArc ReverseArc; + typedef typename ReverseArc::Weight ReverseWeight; + AnyArcFilter rarc_filter; + VectorFst rfst; + Reverse(fst, &rfst); + vector rdistance; + AutoQueue state_queue(rfst, &rdistance, rarc_filter); + ShortestDistanceOptions< ReverseArc, AutoQueue, + AnyArcFilter > + ropts(&state_queue, rarc_filter); + ropts.delta = delta; + ShortestDistance(rfst, &rdistance, ropts); + distance->clear(); + if (rdistance.size() == 1 && !rdistance[0].Member()) { + distance->resize(1, Arc::Weight::NoWeight()); + return; + } + while (distance->size() < rdistance.size() - 1) + distance->push_back(rdistance[distance->size() + 1].Reverse()); + } +} + + +// Return the sum of the weight of all successful paths in an FST, i.e., +// the shortest-distance from the initial state to the final states. +// Returns a weight such that Member() is false if an error was encountered. +template +typename Arc::Weight ShortestDistance(const Fst &fst, float delta = kDelta) { + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + vector distance; + if (Weight::Properties() & kRightSemiring) { + ShortestDistance(fst, &distance, false, delta); + if (distance.size() == 1 && !distance[0].Member()) + return Arc::Weight::NoWeight(); + Weight sum = Weight::Zero(); + for (StateId s = 0; s < distance.size(); ++s) + sum = Plus(sum, Times(distance[s], fst.Final(s))); + return sum; + } else { + ShortestDistance(fst, &distance, true, delta); + StateId s = fst.Start(); + if (distance.size() == 1 && !distance[0].Member()) + return Arc::Weight::NoWeight(); + return s != kNoStateId && s < distance.size() ? + distance[s] : Weight::Zero(); + } +} + + +} // namespace fst + +#endif // FST_LIB_SHORTEST_DISTANCE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/shortest-path.h b/extlibs/openfstwin-1.3.1/include/fst/shortest-path.h new file mode 100755 index 00000000000..f12970cf0e0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/shortest-path.h @@ -0,0 +1,501 @@ +// shortest-path.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Functions to find shortest paths in an FST. + +#ifndef FST_LIB_SHORTEST_PATH_H__ +#define FST_LIB_SHORTEST_PATH_H__ + +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include +#include +#include +#include + + +namespace fst { + +template +struct ShortestPathOptions + : public ShortestDistanceOptions { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + size_t nshortest; // return n-shortest paths + bool unique; // only return paths with distinct input strings + bool has_distance; // distance vector already contains the + // shortest distance from the initial state + bool first_path; // Single shortest path stops after finding the first + // path to a final state. That path is the shortest path + // only when using the ShortestFirstQueue and + // only when all the weights in the FST are between + // One() and Zero() according to NaturalLess. + Weight weight_threshold; // pruning weight threshold. + StateId state_threshold; // pruning state threshold. + + ShortestPathOptions(Queue *q, ArcFilter filt, size_t n = 1, bool u = false, + bool hasdist = false, float d = kDelta, + bool fp = false, Weight w = Weight::Zero(), + StateId s = kNoStateId) + : ShortestDistanceOptions(q, filt, kNoStateId, d), + nshortest(n), unique(u), has_distance(hasdist), first_path(fp), + weight_threshold(w), state_threshold(s) {} +}; + + +// Shortest-path algorithm: normally not called directly; prefer +// 'ShortestPath' below with n=1. 'ofst' contains the shortest path in +// 'ifst'. 'distance' returns the shortest distances from the source +// state to each state in 'ifst'. 'opts' is used to specify options +// such as the queue discipline, the arc filter and delta. +// +// The shortest path is the lowest weight path w.r.t. the natural +// semiring order. +// +// The weights need to be right distributive and have the path (kPath) +// property. +template +void SingleShortestPath(const Fst &ifst, + MutableFst *ofst, + vector *distance, + ShortestPathOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + ofst->DeleteStates(); + ofst->SetInputSymbols(ifst.InputSymbols()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + + if (ifst.Start() == kNoStateId) { + if (ifst.Properties(kError, false)) ofst->SetProperties(kError, kError); + return; + } + + vector enqueued; + vector parent; + vector arc_parent; + + Queue *state_queue = opts.state_queue; + StateId source = opts.source == kNoStateId ? ifst.Start() : opts.source; + Weight f_distance = Weight::Zero(); + StateId f_parent = kNoStateId; + + distance->clear(); + state_queue->Clear(); + if (opts.nshortest != 1) { + FSTERROR() << "SingleShortestPath: for nshortest > 1, use ShortestPath" + << " instead"; + ofst->SetProperties(kError, kError); + return; + } + if (opts.weight_threshold != Weight::Zero() || + opts.state_threshold != kNoStateId) { + FSTERROR() << + "SingleShortestPath: weight and state thresholds not applicable"; + ofst->SetProperties(kError, kError); + return; + } + if ((Weight::Properties() & (kPath | kRightSemiring)) + != (kPath | kRightSemiring)) { + FSTERROR() << "SingleShortestPath: Weight needs to have the path" + << " property and be right distributive: " << Weight::Type(); + ofst->SetProperties(kError, kError); + return; + } + while (distance->size() < source) { + distance->push_back(Weight::Zero()); + enqueued.push_back(false); + parent.push_back(kNoStateId); + arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(), kNoStateId)); + } + distance->push_back(Weight::One()); + parent.push_back(kNoStateId); + arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(), kNoStateId)); + state_queue->Enqueue(source); + enqueued.push_back(true); + + while (!state_queue->Empty()) { + StateId s = state_queue->Head(); + state_queue->Dequeue(); + enqueued[s] = false; + Weight sd = (*distance)[s]; + if (ifst.Final(s) != Weight::Zero()) { + Weight w = Times(sd, ifst.Final(s)); + if (f_distance != Plus(f_distance, w)) { + f_distance = Plus(f_distance, w); + f_parent = s; + } + if (!f_distance.Member()) { + ofst->SetProperties(kError, kError); + return; + } + if (opts.first_path) + break; + } + for (ArcIterator< Fst > aiter(ifst, s); + !aiter.Done(); + aiter.Next()) { + const Arc &arc = aiter.Value(); + while (distance->size() <= arc.nextstate) { + distance->push_back(Weight::Zero()); + enqueued.push_back(false); + parent.push_back(kNoStateId); + arc_parent.push_back(Arc(kNoLabel, kNoLabel, Weight::Zero(), + kNoStateId)); + } + Weight &nd = (*distance)[arc.nextstate]; + Weight w = Times(sd, arc.weight); + if (nd != Plus(nd, w)) { + nd = Plus(nd, w); + if (!nd.Member()) { + ofst->SetProperties(kError, kError); + return; + } + parent[arc.nextstate] = s; + arc_parent[arc.nextstate] = arc; + if (!enqueued[arc.nextstate]) { + state_queue->Enqueue(arc.nextstate); + enqueued[arc.nextstate] = true; + } else { + state_queue->Update(arc.nextstate); + } + } + } + } + + StateId s_p = kNoStateId, d_p = kNoStateId; + for (StateId s = f_parent, d = kNoStateId; + s != kNoStateId; + d = s, s = parent[s]) { + d_p = s_p; + s_p = ofst->AddState(); + if (d == kNoStateId) { + ofst->SetFinal(s_p, ifst.Final(f_parent)); + } else { + arc_parent[d].nextstate = d_p; + ofst->AddArc(s_p, arc_parent[d]); + } + } + ofst->SetStart(s_p); + if (ifst.Properties(kError, false)) ofst->SetProperties(kError, kError); + ofst->SetProperties( + ShortestPathProperties(ofst->Properties(kFstProperties, false)), + kFstProperties); +} + + +template +class ShortestPathCompare { + public: + typedef S StateId; + typedef W Weight; + typedef pair Pair; + + ShortestPathCompare(const vector& pairs, + const vector& distance, + StateId sfinal, float d) + : pairs_(pairs), distance_(distance), superfinal_(sfinal), delta_(d) {} + + bool operator()(const StateId x, const StateId y) const { + const Pair &px = pairs_[x]; + const Pair &py = pairs_[y]; + Weight dx = px.first == superfinal_ ? Weight::One() : + px.first < distance_.size() ? distance_[px.first] : Weight::Zero(); + Weight dy = py.first == superfinal_ ? Weight::One() : + py.first < distance_.size() ? distance_[py.first] : Weight::Zero(); + Weight wx = Times(dx, px.second); + Weight wy = Times(dy, py.second); + // Penalize complete paths to ensure correct results with inexact weights. + // This forms a strict weak order so long as ApproxEqual(a, b) => + // ApproxEqual(a, c) for all c s.t. less_(a, c) && less_(c, b). + if (px.first == superfinal_ && py.first != superfinal_) { + return less_(wy, wx) || ApproxEqual(wx, wy, delta_); + } else if (py.first == superfinal_ && px.first != superfinal_) { + return less_(wy, wx) && !ApproxEqual(wx, wy, delta_); + } else { + return less_(wy, wx); + } + } + + private: + const vector &pairs_; + const vector &distance_; + StateId superfinal_; + float delta_; + NaturalLess less_; +}; + + +// N-Shortest-path algorithm: implements the core n-shortest path +// algorithm. The output is built REVERSED. See below for versions with +// more options and not reversed. +// +// 'ofst' contains the REVERSE of 'n'-shortest paths in 'ifst'. +// 'distance' must contain the shortest distance from each state to a final +// state in 'ifst'. 'delta' is the convergence delta. +// +// The n-shortest paths are the n-lowest weight paths w.r.t. the +// natural semiring order. The single path that can be read from the +// ith of at most n transitions leaving the initial state of 'ofst' is +// the ith shortest path. Disregarding the initial state and initial +// transitions, the n-shortest paths, in fact, form a tree rooted at +// the single final state. +// +// The weights need to be left and right distributive (kSemiring) and +// have the path (kPath) property. +// +// The algorithm is from Mohri and Riley, "An Efficient Algorithm for +// the n-best-strings problem", ICSLP 2002. The algorithm relies on +// the shortest-distance algorithm. There are some issues with the +// pseudo-code as written in the paper (viz., line 11). +// +// IMPLEMENTATION NOTE: The input fst 'ifst' can be a delayed fst and +// and at any state in its expansion the values of distance vector need only +// be defined at that time for the states that are known to exist. +template +void NShortestPath(const Fst &ifst, + MutableFst *ofst, + const vector &distance, + size_t n, + float delta = kDelta, + typename Arc::Weight weight_threshold = Arc::Weight::Zero(), + typename Arc::StateId state_threshold = kNoStateId) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef pair Pair; + typedef typename RevArc::Weight RevWeight; + + if (n <= 0) return; + if ((Weight::Properties() & (kPath | kSemiring)) != (kPath | kSemiring)) { + FSTERROR() << "NShortestPath: Weight needs to have the " + << "path property and be distributive: " + << Weight::Type(); + ofst->SetProperties(kError, kError); + return; + } + ofst->DeleteStates(); + ofst->SetInputSymbols(ifst.InputSymbols()); + ofst->SetOutputSymbols(ifst.OutputSymbols()); + // Each state in 'ofst' corresponds to a path with weight w from the + // initial state of 'ifst' to a state s in 'ifst', that can be + // characterized by a pair (s,w). The vector 'pairs' maps each + // state in 'ofst' to the corresponding pair maps states in OFST to + // the corresponding pair (s,w). + vector pairs; + // The supefinal state is denoted by -1, 'compare' knows that the + // distance from 'superfinal' to the final state is 'Weight::One()', + // hence 'distance[superfinal]' is not needed. + StateId superfinal = -1; + ShortestPathCompare + compare(pairs, distance, superfinal, delta); + vector heap; + // 'r[s + 1]', 's' state in 'fst', is the number of states in 'ofst' + // which corresponding pair contains 's' ,i.e. , it is number of + // paths computed so far to 's'. Valid for 's == -1' (superfinal). + vector r; + NaturalLess less; + if (ifst.Start() == kNoStateId || + distance.size() <= ifst.Start() || + distance[ifst.Start()] == Weight::Zero() || + less(weight_threshold, Weight::One()) || + state_threshold == 0) { + if (ifst.Properties(kError, false)) ofst->SetProperties(kError, kError); + return; + } + ofst->SetStart(ofst->AddState()); + StateId final = ofst->AddState(); + ofst->SetFinal(final, Weight::One()); + while (pairs.size() <= final) + pairs.push_back(Pair(kNoStateId, Weight::Zero())); + pairs[final] = Pair(ifst.Start(), Weight::One()); + heap.push_back(final); + Weight limit = Times(distance[ifst.Start()], weight_threshold); + + while (!heap.empty()) { + pop_heap(heap.begin(), heap.end(), compare); + StateId state = heap.back(); + Pair p = pairs[state]; + heap.pop_back(); + Weight d = p.first == superfinal ? Weight::One() : + p.first < distance.size() ? distance[p.first] : Weight::Zero(); + + if (less(limit, Times(d, p.second)) || + (state_threshold != kNoStateId && + ofst->NumStates() >= state_threshold)) + continue; + + while (r.size() <= p.first + 1) r.push_back(0); + ++r[p.first + 1]; + if (p.first == superfinal) + ofst->AddArc(ofst->Start(), Arc(0, 0, Weight::One(), state)); + if ((p.first == superfinal) && (r[p.first + 1] == n)) break; + if (r[p.first + 1] > n) continue; + if (p.first == superfinal) continue; + + for (ArcIterator< Fst > aiter(ifst, p.first); + !aiter.Done(); + aiter.Next()) { + const RevArc &rarc = aiter.Value(); + Arc arc(rarc.ilabel, rarc.olabel, rarc.weight.Reverse(), rarc.nextstate); + Weight w = Times(p.second, arc.weight); + StateId next = ofst->AddState(); + pairs.push_back(Pair(arc.nextstate, w)); + arc.nextstate = state; + ofst->AddArc(next, arc); + heap.push_back(next); + push_heap(heap.begin(), heap.end(), compare); + } + + Weight finalw = ifst.Final(p.first).Reverse(); + if (finalw != Weight::Zero()) { + Weight w = Times(p.second, finalw); + StateId next = ofst->AddState(); + pairs.push_back(Pair(superfinal, w)); + ofst->AddArc(next, Arc(0, 0, finalw, state)); + heap.push_back(next); + push_heap(heap.begin(), heap.end(), compare); + } + } + Connect(ofst); + if (ifst.Properties(kError, false)) ofst->SetProperties(kError, kError); + ofst->SetProperties( + ShortestPathProperties(ofst->Properties(kFstProperties, false)), + kFstProperties); +} + + +// N-Shortest-path algorithm: this version allow fine control +// via the options argument. See below for a simpler interface. +// +// 'ofst' contains the n-shortest paths in 'ifst'. 'distance' returns +// the shortest distances from the source state to each state in +// 'ifst'. 'opts' is used to specify options such as the number of +// paths to return, whether they need to have distinct input +// strings, the queue discipline, the arc filter and the convergence +// delta. +// +// The n-shortest paths are the n-lowest weight paths w.r.t. the +// natural semiring order. The single path that can be read from the +// ith of at most n transitions leaving the initial state of 'ofst' is +// the ith shortest path. Disregarding the initial state and initial +// transitions, The n-shortest paths, in fact, form a tree rooted at +// the single final state. + +// The weights need to be right distributive and have the path (kPath) +// property. They need to be left distributive as well for nshortest +// > 1. +// +// The algorithm is from Mohri and Riley, "An Efficient Algorithm for +// the n-best-strings problem", ICSLP 2002. The algorithm relies on +// the shortest-distance algorithm. There are some issues with the +// pseudo-code as written in the paper (viz., line 11). +template +void ShortestPath(const Fst &ifst, MutableFst *ofst, + vector *distance, + ShortestPathOptions &opts) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + typedef ReverseArc ReverseArc; + + size_t n = opts.nshortest; + if (n == 1) { + SingleShortestPath(ifst, ofst, distance, opts); + return; + } + if (n <= 0) return; + if ((Weight::Properties() & (kPath | kSemiring)) != (kPath | kSemiring)) { + FSTERROR() << "ShortestPath: n-shortest: Weight needs to have the " + << "path property and be distributive: " + << Weight::Type(); + ofst->SetProperties(kError, kError); + return; + } + if (!opts.has_distance) { + ShortestDistance(ifst, distance, opts); + if (distance->size() == 1 && !(*distance)[0].Member()) { + ofst->SetProperties(kError, kError); + return; + } + } + // Algorithm works on the reverse of 'fst' : 'rfst', 'distance' is + // the distance to the final state in 'rfst', 'ofst' is built as the + // reverse of the tree of n-shortest path in 'rfst'. + VectorFst rfst; + Reverse(ifst, &rfst); + Weight d = Weight::Zero(); + for (ArcIterator< VectorFst > aiter(rfst, 0); + !aiter.Done(); aiter.Next()) { + const ReverseArc &arc = aiter.Value(); + StateId s = arc.nextstate - 1; + if (s < distance->size()) + d = Plus(d, Times(arc.weight.Reverse(), (*distance)[s])); + } + distance->insert(distance->begin(), d); + + if (!opts.unique) { + NShortestPath(rfst, ofst, *distance, n, opts.delta, + opts.weight_threshold, opts.state_threshold); + } else { + vector ddistance; + DeterminizeFstOptions dopts(opts.delta); + DeterminizeFst dfst(rfst, *distance, &ddistance, dopts); + NShortestPath(dfst, ofst, ddistance, n, opts.delta, + opts.weight_threshold, opts.state_threshold); + } + distance->erase(distance->begin()); +} + + +// Shortest-path algorithm: simplified interface. See above for a +// version that allows finer control. +// +// 'ofst' contains the 'n'-shortest paths in 'ifst'. The queue +// discipline is automatically selected. When 'unique' == true, only +// paths with distinct input labels are returned. +// +// The n-shortest paths are the n-lowest weight paths w.r.t. the +// natural semiring order. The single path that can be read from the +// ith of at most n transitions leaving the initial state of 'ofst' is +// the ith best path. +// +// The weights need to be right distributive and have the path +// (kPath) property. +template +void ShortestPath(const Fst &ifst, MutableFst *ofst, + size_t n = 1, bool unique = false, + bool first_path = false, + typename Arc::Weight weight_threshold = Arc::Weight::Zero(), + typename Arc::StateId state_threshold = kNoStateId) { + vector distance; + AnyArcFilter arc_filter; + AutoQueue state_queue(ifst, &distance, arc_filter); + ShortestPathOptions< Arc, AutoQueue, + AnyArcFilter > opts(&state_queue, arc_filter, n, unique, false, + kDelta, first_path, weight_threshold, + state_threshold); + ShortestPath(ifst, ofst, &distance, opts); +} + +} // namespace fst + +#endif // FST_LIB_SHORTEST_PATH_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/signed-log-weight.h b/extlibs/openfstwin-1.3.1/include/fst/signed-log-weight.h new file mode 100755 index 00000000000..da964791826 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/signed-log-weight.h @@ -0,0 +1,367 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: krr@google.com (Kasturi Rangan Raghavan) +// \file +// LogWeight along with sign information that represents the value X in the +// linear domain as +// The sign is a TropicalWeight: +// positive, TropicalWeight.Value() > 0.0, recommended value 1.0 +// negative, TropicalWeight.Value() <= 0.0, recommended value -1.0 + +#ifndef FST_LIB_SIGNED_LOG_WEIGHT_H_ +#define FST_LIB_SIGNED_LOG_WEIGHT_H_ + +#include +#include + + +namespace fst { +template +class SignedLogWeightTpl + : public PairWeight > { + public: + typedef TropicalWeight X1; + typedef LogWeightTpl X2; + using PairWeight::Value1; + using PairWeight::Value2; + + using PairWeight::Reverse; + using PairWeight::Quantize; + using PairWeight::Member; + + typedef SignedLogWeightTpl ReverseWeight; + + SignedLogWeightTpl() : PairWeight() {} + + SignedLogWeightTpl(const SignedLogWeightTpl& w) + : PairWeight (w) { } + + SignedLogWeightTpl(const PairWeight& w) + : PairWeight (w) { } + + SignedLogWeightTpl(const X1& x1, const X2& x2) + : PairWeight(x1, x2) { } + + static const SignedLogWeightTpl &Zero() { + static const SignedLogWeightTpl zero(X1(1.0), X2::Zero()); + return zero; + } + + static const SignedLogWeightTpl &One() { + static const SignedLogWeightTpl one(X1(1.0), X2::One()); + return one; + } + + static const SignedLogWeightTpl &NoWeight() { + static const SignedLogWeightTpl no_weight(X1(1.0), X2::NoWeight()); + return no_weight; + } + + static const string &Type() { + static const string type = "signed_log_" + X1::Type() + "_" + X2::Type(); + return type; + } + + ProductWeight Quantize(float delta = kDelta) const { + return PairWeight::Quantize(); + } + + ReverseWeight Reverse() const { + return PairWeight::Reverse(); + } + + bool Member() const { + return PairWeight::Member(); + } + + static uint64 Properties() { + // not idempotent nor path + return kLeftSemiring | kRightSemiring | kCommutative; + } + + size_t Hash() const { + size_t h1; + if (Value2() == X2::Zero() || Value1().Value() > 0.0) + h1 = TropicalWeight(1.0).Hash(); + else + h1 = TropicalWeight(-1.0).Hash(); + size_t h2 = Value2().Hash(); + const int lshift = 5; + const int rshift = CHAR_BIT * sizeof(size_t) - 5; + return h1 << lshift ^ h1 >> rshift ^ h2; + } +}; + +template +inline SignedLogWeightTpl Plus(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return SignedLogWeightTpl::NoWeight(); + bool s1 = w1.Value1().Value() > 0.0; + bool s2 = w2.Value1().Value() > 0.0; + T f1 = w1.Value2().Value(); + T f2 = w2.Value2().Value(); + if (f1 == FloatLimits::kPosInfinity) + return w2; + else if (f2 == FloatLimits::kPosInfinity) + return w1; + else if (f1 == f2) { + if (s1 == s2) + return SignedLogWeightTpl(w1.Value1(), (f2 - log(2.0F))); + else + return SignedLogWeightTpl::Zero(); + } else if (f1 > f2) { + if (s1 == s2) { + return SignedLogWeightTpl( + w1.Value1(), (f2 - log(1.0F + exp(f2 - f1)))); + } else { + return SignedLogWeightTpl( + w2.Value1(), (f2 - log(1.0F - exp(f2 - f1)))); + } + } else { + if (s2 == s1) { + return SignedLogWeightTpl( + w2.Value1(), (f1 - log(1.0F + exp(f1 - f2)))); + } else { + return SignedLogWeightTpl( + w1.Value1(), (f1 - log(1.0F - exp(f1 - f2)))); + } + } +} + +template +inline SignedLogWeightTpl Minus(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2) { + SignedLogWeightTpl minus_w2(-w2.Value1().Value(), w2.Value2()); + return Plus(w1, minus_w2); +} + +template +inline SignedLogWeightTpl Times(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2) { + if (!w1.Member() || !w2.Member()) + return SignedLogWeightTpl::NoWeight(); + bool s1 = w1.Value1().Value() > 0.0; + bool s2 = w2.Value1().Value() > 0.0; + T f1 = w1.Value2().Value(); + T f2 = w2.Value2().Value(); + if (s1 == s2) + return SignedLogWeightTpl(TropicalWeight(1.0), (f1 + f2)); + else + return SignedLogWeightTpl(TropicalWeight(-1.0), (f1 + f2)); +} + +template +inline SignedLogWeightTpl Divide(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2, + DivideType typ = DIVIDE_ANY) { + if (!w1.Member() || !w2.Member()) + return SignedLogWeightTpl::NoWeight(); + bool s1 = w1.Value1().Value() > 0.0; + bool s2 = w2.Value1().Value() > 0.0; + T f1 = w1.Value2().Value(); + T f2 = w2.Value2().Value(); + if (f2 == FloatLimits::kPosInfinity) + return SignedLogWeightTpl(TropicalWeight(1.0), + FloatLimits::kNumberBad); + else if (f1 == FloatLimits::kPosInfinity) + return SignedLogWeightTpl(TropicalWeight(1.0), + FloatLimits::kPosInfinity); + else if (s1 == s2) + return SignedLogWeightTpl(TropicalWeight(1.0), (f1 - f2)); + else + return SignedLogWeightTpl(TropicalWeight(-1.0), (f1 - f2)); +} + +template +inline bool ApproxEqual(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2, + float delta = kDelta) { + bool s1 = w1.Value1().Value() > 0.0; + bool s2 = w2.Value1().Value() > 0.0; + if (s1 == s2) { + return ApproxEqual(w1.Value2(), w2.Value2(), delta); + } else { + return w1.Value2() == LogWeightTpl::Zero() + && w2.Value2() == LogWeightTpl::Zero(); + } +} + +template +inline bool operator==(const SignedLogWeightTpl &w1, + const SignedLogWeightTpl &w2) { + bool s1 = w1.Value1().Value() > 0.0; + bool s2 = w2.Value1().Value() > 0.0; + if (s1 == s2) + return w1.Value2() == w2.Value2(); + else + return (w1.Value2() == LogWeightTpl::Zero()) && + (w2.Value2() == LogWeightTpl::Zero()); +} + + +// Single-precision signed-log weight +typedef SignedLogWeightTpl SignedLogWeight; +// Double-precision signed-log weight +typedef SignedLogWeightTpl SignedLog64Weight; + +// +// WEIGHT CONVERTER SPECIALIZATIONS. +// + +template +bool SignedLogConvertCheck(W1 w) { + if (w.Value1().Value() < 0.0) { + FSTERROR() << "WeightConvert: can't convert weight from \"" + << W1::Type() << "\" to \"" << W2::Type(); + return false; + } + return true; +} + +// Convert to tropical +template <> +struct WeightConvert { + TropicalWeight operator()(SignedLogWeight w) const { + if (!SignedLogConvertCheck(w)) + return TropicalWeight::NoWeight(); + return w.Value2().Value(); + } +}; + +template <> +struct WeightConvert { + TropicalWeight operator()(SignedLog64Weight w) const { + if (!SignedLogConvertCheck(w)) + return TropicalWeight::NoWeight(); + return w.Value2().Value(); + } +}; + +// Convert to log +template <> +struct WeightConvert { + LogWeight operator()(SignedLogWeight w) const { + if (!SignedLogConvertCheck(w)) + return LogWeight::NoWeight(); + return w.Value2().Value(); + } +}; + +template <> +struct WeightConvert { + LogWeight operator()(SignedLog64Weight w) const { + if (!SignedLogConvertCheck(w)) + return LogWeight::NoWeight(); + return w.Value2().Value(); + } +}; + +// Convert to log64 +template <> +struct WeightConvert { + Log64Weight operator()(SignedLogWeight w) const { + if (!SignedLogConvertCheck(w)) + return Log64Weight::NoWeight(); + return w.Value2().Value(); + } +}; + +template <> +struct WeightConvert { + Log64Weight operator()(SignedLog64Weight w) const { + if (!SignedLogConvertCheck(w)) + return Log64Weight::NoWeight(); + return w.Value2().Value(); + } +}; + +// Convert to signed log +template <> +struct WeightConvert { + SignedLogWeight operator()(TropicalWeight w) const { + TropicalWeight x1 = 1.0; + LogWeight x2 = w.Value(); + return SignedLogWeight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLogWeight operator()(LogWeight w) const { + TropicalWeight x1 = 1.0; + LogWeight x2 = w.Value(); + return SignedLogWeight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLogWeight operator()(Log64Weight w) const { + TropicalWeight x1 = 1.0; + LogWeight x2 = w.Value(); + return SignedLogWeight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLogWeight operator()(SignedLog64Weight w) const { + TropicalWeight x1 = w.Value1(); + LogWeight x2 = w.Value2().Value(); + return SignedLogWeight(x1, x2); + } +}; + +// Convert to signed log64 +template <> +struct WeightConvert { + SignedLog64Weight operator()(TropicalWeight w) const { + TropicalWeight x1 = 1.0; + Log64Weight x2 = w.Value(); + return SignedLog64Weight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLog64Weight operator()(LogWeight w) const { + TropicalWeight x1 = 1.0; + Log64Weight x2 = w.Value(); + return SignedLog64Weight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLog64Weight operator()(Log64Weight w) const { + TropicalWeight x1 = 1.0; + Log64Weight x2 = w.Value(); + return SignedLog64Weight(x1, x2); + } +}; + +template <> +struct WeightConvert { + SignedLog64Weight operator()(SignedLogWeight w) const { + TropicalWeight x1 = w.Value1(); + Log64Weight x2 = w.Value2().Value(); + return SignedLog64Weight(x1, x2); + } +}; + +} // namespace fst + +#endif // FST_LIB_SIGNED_LOG_WEIGHT_H_ diff --git a/extlibs/openfstwin-1.3.1/include/fst/slist.h b/extlibs/openfstwin-1.3.1/include/fst/slist.h new file mode 100755 index 00000000000..b800522c75d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/slist.h @@ -0,0 +1,61 @@ +// slist.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Includes slist definition or defines in terms of STL list as a fallback. + +#ifndef FST_LIB_SLIST_H__ +#define FST_LIB_SLIST_H__ + +#include + +#ifdef HAVE___GNU_CXX__SLIST_INT_ + +#include + +namespace fst { + +using __gnu_cxx::slist; + +} + +#else + +#include + +namespace fst { + +using std::list; + +template class slist : public list { + public: + typedef typename list::iterator iterator; + typedef typename list::const_iterator const_iterator; + + using list::erase; + + iterator erase_after(iterator pos) { + iterator npos = pos; + erase(++npos); + return pos; + } +}; + +} // namespace fst + +#endif // HAVE___GNU_CXX__SLIST_INT_ + +#endif // FST_LIB_SLIST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/sparse-power-weight.h b/extlibs/openfstwin-1.3.1/include/fst/sparse-power-weight.h new file mode 100755 index 00000000000..a1ff56ac5c4 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/sparse-power-weight.h @@ -0,0 +1,225 @@ +// sparse-power-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: krr@google.com (Kasturi Rangan Raghavan) +// Inspiration: allauzen@google.com (Cyril Allauzen) +// +// \file +// Cartesian power weight semiring operation definitions. +// Uses SparseTupleWeight as underlying representation. + +#ifndef FST_LIB_SPARSE_POWER_WEIGHT_H__ +#define FST_LIB_SPARSE_POWER_WEIGHT_H__ + +#include + +#include +#include + + +namespace fst { + +// Below SparseTupleWeight*Mapper are used in conjunction with +// SparseTupleWeightMap to compute the respective semiring operations +template +struct SparseTupleWeightPlusMapper { + W Map(const K& k, const W& v1, const W& v2) const { + return Plus(v1, v2); + } +}; + +template +struct SparseTupleWeightTimesMapper { + W Map(const K& k, const W& v1, const W& v2) const { + return Times(v1, v2); + } +}; + +template +struct SparseTupleWeightDivideMapper { + SparseTupleWeightDivideMapper(DivideType divide_type) { + divide_type_ = divide_type; + } + W Map(const K& k, const W& v1, const W& v2) const { + return Divide(v1, v2, divide_type_); + } + DivideType divide_type_; +}; + +template +struct SparseTupleWeightApproxMapper { + SparseTupleWeightApproxMapper(float delta) { delta_ = delta; } + W Map(const K& k, const W& v1, const W& v2) const { + return ApproxEqual(v1, v2, delta_) ? W::One() : W::Zero(); + } + float delta_; +}; + +// Sparse cartesian power semiring: W ^ n +// Forms: +// - a left semimodule when W is a left semiring, +// - a right semimodule when W is a right semiring, +// - a bisemimodule when W is a semiring, +// the free semimodule of rank n over W +// The Times operation is overloaded to provide the +// left and right scalar products. +// K is the key value type. kNoKey(-1) is reserved for internal use +template +class SparsePowerWeight : public SparseTupleWeight { + public: + using SparseTupleWeight::Zero; + using SparseTupleWeight::One; + using SparseTupleWeight::NoWeight; + using SparseTupleWeight::Quantize; + using SparseTupleWeight::Reverse; + + typedef SparsePowerWeight ReverseWeight; + + SparsePowerWeight() {} + + SparsePowerWeight(const SparseTupleWeight &w) : + SparseTupleWeight(w) { } + + template + SparsePowerWeight(Iterator begin, Iterator end) : + SparseTupleWeight(begin, end) { } + + SparsePowerWeight(const K &key, const W &w) : + SparseTupleWeight(key, w) { } + + static const SparsePowerWeight &Zero() { + static const SparsePowerWeight zero(SparseTupleWeight::Zero()); + return zero; + } + + static const SparsePowerWeight &One() { + static const SparsePowerWeight one(SparseTupleWeight::One()); + return one; + } + + static const SparsePowerWeight &NoWeight() { + static const SparsePowerWeight no_weight( + SparseTupleWeight::NoWeight()); + return no_weight; + } + + // Overide this: Overwrite the Type method to reflect the key type + // if using non-default key type. + static const string &Type() { + static string type; + if(type.empty()) { + type = W::Type() + "_^n"; + if(sizeof(K) != sizeof(uint32)) { + string size; + Int64ToStr(8 * sizeof(K), &size); + type += "_" + size; + } + } + return type; + } + + static uint64 Properties() { + uint64 props = W::Properties(); + return props & (kLeftSemiring | kRightSemiring | + kCommutative | kIdempotent); + } + + SparsePowerWeight Quantize(float delta = kDelta) const { + return SparseTupleWeight::Quantize(delta); + } + + ReverseWeight Reverse() const { + return SparseTupleWeight::Reverse(); + } +}; + +// Semimodule plus operation +template +inline SparsePowerWeight Plus(const SparsePowerWeight &w1, + const SparsePowerWeight &w2) { + SparsePowerWeight ret; + SparseTupleWeightPlusMapper operator_mapper; + SparseTupleWeightMap(&ret, w1, w2, operator_mapper); + return ret; +} + +// Semimodule times operation +template +inline SparsePowerWeight Times(const SparsePowerWeight &w1, + const SparsePowerWeight &w2) { + SparsePowerWeight ret; + SparseTupleWeightTimesMapper operator_mapper; + SparseTupleWeightMap(&ret, w1, w2, operator_mapper); + return ret; +} + +// Semimodule divide operation +template +inline SparsePowerWeight Divide(const SparsePowerWeight &w1, + const SparsePowerWeight &w2, + DivideType type = DIVIDE_ANY) { + SparsePowerWeight ret; + SparseTupleWeightDivideMapper operator_mapper(type); + SparseTupleWeightMap(&ret, w1, w2, operator_mapper); + return ret; +} + +// Semimodule dot product +template +inline const W& DotProduct(const SparsePowerWeight &w1, + const SparsePowerWeight &w2) { + const SparsePowerWeight& product = Times(w1, w2); + W ret(W::Zero()); + for (SparseTupleWeightIterator it(product); !it.Done(); it.Next()) { + ret = Plus(ret, it.Value().second); + } + return ret; +} + +template +inline bool ApproxEqual(const SparsePowerWeight &w1, + const SparsePowerWeight &w2, + float delta = kDelta) { + SparseTupleWeight ret; + SparseTupleWeightApproxMapper operator_mapper(kDelta); + SparseTupleWeightMap(&ret, w1, w2, operator_mapper); + return ret == SparsePowerWeight::One(); +} + +template +inline SparsePowerWeight Times(const W &k, + const SparsePowerWeight &w2) { + SparsePowerWeight w1(k); + return Times(w1, w2); +} + +template +inline SparsePowerWeight Times(const SparsePowerWeight &w1, + const W &k) { + SparsePowerWeight w2(k); + return Times(w1, w2); +} + +template +inline SparsePowerWeight Divide(const SparsePowerWeight &w1, + const W &k, + DivideType divide_type = DIVIDE_ANY) { + SparsePowerWeight w2(k); + return Divide(w1, w2, divide_type); +} + +} // namespace fst + +#endif // FST_LIB_SPARSE_POWER_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h b/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h new file mode 100755 index 00000000000..29f59534439 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h @@ -0,0 +1,640 @@ +// sparse-tuple-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: krr@google.com (Kasturi Rangan Raghavan) +// Inspiration: allauzen@google.com (Cyril Allauzen) +// \file +// Sparse version of tuple-weight, based on tuple-weight.h +// Internally stores sparse key, value pairs in linked list +// Default value elemnt is the assumed value of unset keys +// Internal singleton implementation that stores first key, +// value pair as a initialized member variable to avoide +// unnecessary allocation on heap. +// Use SparseTupleWeightIterator to iterate through the key,value pairs +// Note: this does NOT iterate through the default value. +// +// Sparse tuple weight set operation definitions. + +#ifndef FST_LIB_SPARSE_TUPLE_WEIGHT_H__ +#define FST_LIB_SPARSE_TUPLE_WEIGHT_H__ + +#include +#include +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; + +#include + + +DECLARE_string(fst_weight_parentheses); +DECLARE_string(fst_weight_separator); + +namespace fst { + +template class SparseTupleWeight; + +template +class SparseTupleWeightIterator; + +template +istream &operator>>(istream &strm, SparseTupleWeight &w); + +// Arbitrary dimension tuple weight, stored as a sorted linked-list +// W is any weight class, +// K is the key value type. kNoKey(-1) is reserved for internal use +template +class SparseTupleWeight { + public: + typedef pair Pair; + typedef SparseTupleWeight ReverseWeight; + + const static K kNoKey = -1; + SparseTupleWeight() { + Init(); + } + + template + SparseTupleWeight(Iterator begin, Iterator end) { + Init(); + // Assumes input iterator is sorted + for (Iterator it = begin; it != end; ++it) + Push(*it); + } + + + SparseTupleWeight(const K& key, const W &w) { + Init(); + Push(key, w); + } + + SparseTupleWeight(const W &w) { + Init(w); + } + + SparseTupleWeight(const SparseTupleWeight &w) { + Init(w.DefaultValue()); + SetDefaultValue(w.DefaultValue()); + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + Push(it.Value()); + } + } + + static const SparseTupleWeight &Zero() { + static SparseTupleWeight zero; + return zero; + } + + static const SparseTupleWeight &One() { + static SparseTupleWeight one(W::One()); + return one; + } + + static const SparseTupleWeight &NoWeight() { + static SparseTupleWeight no_weight(W::NoWeight()); + return no_weight; + } + + istream &Read(istream &strm) { + ReadType(strm, &default_); + ReadType(strm, &first_); + return ReadType(strm, &rest_); + } + + ostream &Write(ostream &strm) const { + WriteType(strm, default_); + WriteType(strm, first_); + return WriteType(strm, rest_); + } + + SparseTupleWeight &operator=(const SparseTupleWeight &w) { + if (this == &w) return *this; // check for w = w + Init(w.DefaultValue()); + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + Push(it.Value()); + } + return *this; + } + + bool Member() const { + if (!DefaultValue().Member()) return false; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + if (!it.Value().second.Member()) return false; + } + return true; + } + + // Assumes H() function exists for the hash of the key value + size_t Hash() const { + uint64 h = 0; + std::tr1::hash H; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + h = 5 * h + H(it.Value().first); + h = 13 * h + it.Value().second.Hash(); + } + return size_t(h); + } + + SparseTupleWeight Quantize(float delta = kDelta) const { + SparseTupleWeight w; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + w.Push(it.Value().first, it.Value().second.Quantize(delta)); + } + return w; + } + + ReverseWeight Reverse() const { + SparseTupleWeight w; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + w.Push(it.Value().first, it.Value().second.Reverse()); + } + return w; + } + + // Common initializer among constructors. + void Init() { + Init(W::Zero()); + } + + void Init(const W& default_value) { + first_.first = kNoKey; + /* initialized to the reserved key value */ + default_ = default_value; + rest_.clear(); + } + + size_t Size() const { + if (first_.first == kNoKey) + return 0; + else + return rest_.size() + 1; + } + + inline void Push(const K &k, const W &w, bool default_value_check = true) { + Push(make_pair(k, w), default_value_check); + } + + inline void Push(const Pair &p, bool default_value_check = true) { + if (default_value_check && p.second == default_) return; + if (first_.first == kNoKey) { + first_ = p; + } else { + rest_.push_back(p); + } + } + + void SetDefaultValue(const W& val) { default_ = val; } + + const W& DefaultValue() const { return default_; } + + protected: + static istream& ReadNoParen( + istream&, SparseTupleWeight&, char separator); + + static istream& ReadWithParen( + istream&, SparseTupleWeight&, + char separator, char open_paren, char close_paren); + + private: + // Assumed default value of uninitialized keys, by default W::Zero() + W default_; + + // Key values pairs are first stored in first_, then fill rest_ + // this way we can avoid dynamic allocation in the common case + // where the weight is a single key,val pair. + Pair first_; + list rest_; + + friend istream &operator>>(istream&, SparseTupleWeight&); + friend class SparseTupleWeightIterator; +}; + +template +class SparseTupleWeightIterator { + public: + typedef typename SparseTupleWeight::Pair Pair; + typedef typename list::const_iterator const_iterator; + typedef typename list::iterator iterator; + + explicit SparseTupleWeightIterator(const SparseTupleWeight& w) + : first_(w.first_), rest_(w.rest_), init_(true), + iter_(rest_.begin()) {} + + bool Done() const { + if (init_) + return first_.first == SparseTupleWeight::kNoKey; + else + return iter_ == rest_.end(); + } + + const Pair& Value() const { return init_ ? first_ : *iter_; } + + void Next() { + if (init_) + init_ = false; + else + ++iter_; + } + + void Reset() { + init_ = true; + iter_ = rest_.begin(); + } + + private: + const Pair &first_; + const list & rest_; + bool init_; // in the initialized state? + typename list::const_iterator iter_; + + DISALLOW_COPY_AND_ASSIGN(SparseTupleWeightIterator); +}; + +template +inline void SparseTupleWeightMap( + SparseTupleWeight* ret, + const SparseTupleWeight& w1, + const SparseTupleWeight& w2, + const M& operator_mapper) { + SparseTupleWeightIterator w1_it(w1); + SparseTupleWeightIterator w2_it(w2); + const W& v1_def = w1.DefaultValue(); + const W& v2_def = w2.DefaultValue(); + ret->SetDefaultValue(operator_mapper.Map(0, v1_def, v2_def)); + while (!w1_it.Done() || !w2_it.Done()) { + const K& k1 = (w1_it.Done()) ? w2_it.Value().first : w1_it.Value().first; + const K& k2 = (w2_it.Done()) ? w1_it.Value().first : w2_it.Value().first; + const W& v1 = (w1_it.Done()) ? v1_def : w1_it.Value().second; + const W& v2 = (w2_it.Done()) ? v2_def : w2_it.Value().second; + if (k1 == k2) { + ret->Push(k1, operator_mapper.Map(k1, v1, v2)); + if (!w1_it.Done()) w1_it.Next(); + if (!w2_it.Done()) w2_it.Next(); + } else if (k1 < k2) { + ret->Push(k1, operator_mapper.Map(k1, v1, v2_def)); + w1_it.Next(); + } else { + ret->Push(k2, operator_mapper.Map(k2, v1_def, v2)); + w2_it.Next(); + } + } +} + +template +inline bool operator==(const SparseTupleWeight &w1, + const SparseTupleWeight &w2) { + const W& v1_def = w1.DefaultValue(); + const W& v2_def = w2.DefaultValue(); + if (v1_def != v2_def) return false; + + SparseTupleWeightIterator w1_it(w1); + SparseTupleWeightIterator w2_it(w2); + while (!w1_it.Done() || !w2_it.Done()) { + const K& k1 = (w1_it.Done()) ? w2_it.Value().first : w1_it.Value().first; + const K& k2 = (w2_it.Done()) ? w1_it.Value().first : w2_it.Value().first; + const W& v1 = (w1_it.Done()) ? v1_def : w1_it.Value().second; + const W& v2 = (w2_it.Done()) ? v2_def : w2_it.Value().second; + if (k1 == k2) { + if (v1 != v2) return false; + if (!w1_it.Done()) w1_it.Next(); + if (!w2_it.Done()) w2_it.Next(); + } else if (k1 < k2) { + if (v1 != v2_def) return false; + w1_it.Next(); + } else { + if (v1_def != v2) return false; + w2_it.Next(); + } + } + return true; +} + +template +inline bool operator!=(const SparseTupleWeight &w1, + const SparseTupleWeight &w2) { + return !(w1 == w2); +} + +template +inline ostream &operator<<(ostream &strm, const SparseTupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + bool write_parens = false; + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + write_parens = true; + } + + if (write_parens) + strm << FLAGS_fst_weight_parentheses[0]; + + strm << w.DefaultValue(); + strm << separator; + + size_t n = w.Size(); + strm << n; + strm << separator; + + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + strm << it.Value().first; + strm << separator; + strm << it.Value().second; + strm << separator; + } + + if (write_parens) + strm << FLAGS_fst_weight_parentheses[1]; + + return strm; +} + +template +inline istream &operator>>(istream &strm, SparseTupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + return SparseTupleWeight::ReadWithParen( + strm, w, separator, FLAGS_fst_weight_parentheses[0], + FLAGS_fst_weight_parentheses[1]); + } else { + return SparseTupleWeight::ReadNoParen(strm, w, separator); + } +} + +// Reads SparseTupleWeight when there are no parentheses around tuple terms +template +inline istream& SparseTupleWeight::ReadNoParen( + istream &strm, + SparseTupleWeight &w, + char separator) { + int c; + size_t n; + + do { + c = strm.get(); + } while (isspace(c)); + + + { // Read default weight + W default_value; + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> default_value; + w.SetDefaultValue(default_value); + } + + c = strm.get(); + + { // Read n + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> n; + } + + // Read n elements + for (size_t i = 0; i < n; ++i) { + // discard separator + c = strm.get(); + K p; + W r; + + { // read key + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> p; + } + + c = strm.get(); + + { // read weight + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> r; + } + + w.Push(p, r); + } + + c = strm.get(); + if (c != separator) { + strm.clear(std::ios::badbit); + } + + return strm; +} + +// Reads SparseTupleWeight when there are parentheses around tuple terms +template +inline istream& SparseTupleWeight::ReadWithParen( + istream &strm, + SparseTupleWeight &w, + char separator, + char open_paren, + char close_paren) { + int c; + size_t n; + + do { + c = strm.get(); + } while (isspace(c)); + + if (c != open_paren) { + FSTERROR() << "is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::badbit); + return strm; + } + + c = strm.get(); + + { // Read weight + W default_value; + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> default_value; + w.SetDefaultValue(default_value); + } + + c = strm.get(); + + { // Read n + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> n; + } + + // Read n elements + for (size_t i = 0; i < n; ++i) { + // discard separator + c = strm.get(); + K p; + W r; + + { // Read key + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> p; + } + + c = strm.get(); + + { // Read weight + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> r; + } + + w.Push(p, r); + } + + if (c != separator) { + FSTERROR() << " separator expected, not found! "; + strm.clear(std::ios::badbit); + return strm; + } + + c = strm.get(); + if (c != close_paren) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::badbit); + return strm; + } + + return strm; +} + + + +} // namespace fst + +#endif // FST_LIB_SPARSE_TUPLE_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h.bak b/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h.bak new file mode 100755 index 00000000000..c12ef4f468e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/sparse-tuple-weight.h.bak @@ -0,0 +1,640 @@ +// sparse-tuple-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: krr@google.com (Kasturi Rangan Raghavan) +// Inspiration: allauzen@google.com (Cyril Allauzen) +// \file +// Sparse version of tuple-weight, based on tuple-weight.h +// Internally stores sparse key, value pairs in linked list +// Default value elemnt is the assumed value of unset keys +// Internal singleton implementation that stores first key, +// value pair as a initialized member variable to avoide +// unnecessary allocation on heap. +// Use SparseTupleWeightIterator to iterate through the key,value pairs +// Note: this does NOT iterate through the default value. +// +// Sparse tuple weight set operation definitions. + +#ifndef FST_LIB_SPARSE_TUPLE_WEIGHT_H__ +#define FST_LIB_SPARSE_TUPLE_WEIGHT_H__ + +#include +#include +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; + +#include + + +DECLARE_string(fst_weight_parentheses); +DECLARE_string(fst_weight_separator); + +namespace fst { + +template class SparseTupleWeight; + +template +class SparseTupleWeightIterator; + +template +istream &operator>>(istream &strm, SparseTupleWeight &w); + +// Arbitrary dimension tuple weight, stored as a sorted linked-list +// W is any weight class, +// K is the key value type. kNoKey(-1) is reserved for internal use +template +class SparseTupleWeight { + public: + typedef pair Pair; + typedef SparseTupleWeight ReverseWeight; + + const static K kNoKey = -1; + SparseTupleWeight() { + Init(); + } + + template + SparseTupleWeight(Iterator begin, Iterator end) { + Init(); + // Assumes input iterator is sorted + for (Iterator it = begin; it != end; ++it) + Push(*it); + } + + + SparseTupleWeight(const K& key, const W &w) { + Init(); + Push(key, w); + } + + SparseTupleWeight(const W &w) { + Init(w); + } + + SparseTupleWeight(const SparseTupleWeight &w) { + Init(w.DefaultValue()); + SetDefaultValue(w.DefaultValue()); + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + Push(it.Value()); + } + } + + static const SparseTupleWeight &Zero() { + static SparseTupleWeight zero; + return zero; + } + + static const SparseTupleWeight &One() { + static SparseTupleWeight one(W::One()); + return one; + } + + static const SparseTupleWeight &NoWeight() { + static SparseTupleWeight no_weight(W::NoWeight()); + return no_weight; + } + + istream &Read(istream &strm) { + ReadType(strm, &default_); + ReadType(strm, &first_); + return ReadType(strm, &rest_); + } + + ostream &Write(ostream &strm) const { + WriteType(strm, default_); + WriteType(strm, first_); + return WriteType(strm, rest_); + } + + SparseTupleWeight &operator=(const SparseTupleWeight &w) { + if (this == &w) return *this; // check for w = w + Init(w.DefaultValue()); + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + Push(it.Value()); + } + return *this; + } + + bool Member() const { + if (!DefaultValue().Member()) return false; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + if (!it.Value().second.Member()) return false; + } + return true; + } + + // Assumes H() function exists for the hash of the key value + size_t Hash() const { + uint64 h = 0; + std::tr1::hash H; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + h = 5 * h + H(it.Value().first); + h = 13 * h + it.Value().second.Hash(); + } + return size_t(h); + } + + SparseTupleWeight Quantize(float delta = kDelta) const { + SparseTupleWeight w; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + w.Push(it.Value().first, it.Value().second.Quantize(delta)); + } + return w; + } + + ReverseWeight Reverse() const { + SparseTupleWeight w; + for (SparseTupleWeightIterator it(*this); !it.Done(); it.Next()) { + w.Push(it.Value().first, it.Value().second.Reverse()); + } + return w; + } + + // Common initializer among constructors. + void Init() { + Init(W::Zero()); + } + + void Init(const W& default_value) { + first_.first = kNoKey; + /* initialized to the reserved key value */ + default_ = default_value; + rest_.clear(); + } + + size_t Size() const { + if (first_.first == kNoKey) + return 0; + else + return rest_.size() + 1; + } + + inline void Push(const K &k, const W &w, bool default_value_check = true) { + Push(make_pair(k, w), default_value_check); + } + + inline void Push(const Pair &p, bool default_value_check = true) { + if (default_value_check && p.second == default_) return; + if (first_.first == kNoKey) { + first_ = p; + } else { + rest_.push_back(p); + } + } + + void SetDefaultValue(const W& val) { default_ = val; } + + const W& DefaultValue() const { return default_; } + + protected: + static istream& ReadNoParen( + istream&, SparseTupleWeight&, char separator); + + static istream& ReadWithParen( + istream&, SparseTupleWeight&, + char separator, char open_paren, char close_paren); + + private: + // Assumed default value of uninitialized keys, by default W::Zero() + W default_; + + // Key values pairs are first stored in first_, then fill rest_ + // this way we can avoid dynamic allocation in the common case + // where the weight is a single key,val pair. + Pair first_; + list rest_; + + friend istream &operator>>(istream&, SparseTupleWeight&); + friend class SparseTupleWeightIterator; +}; + +template +class SparseTupleWeightIterator { + public: + typedef typename SparseTupleWeight::Pair Pair; + typedef typename list::const_iterator const_iterator; + typedef typename list::iterator iterator; + + explicit SparseTupleWeightIterator(const SparseTupleWeight& w) + : first_(w.first_), rest_(w.rest_), init_(true), + iter_(rest_.begin()) {} + + bool Done() const { + if (init_) + return first_.first == SparseTupleWeight::kNoKey; + else + return iter_ == rest_.end(); + } + + const Pair& Value() const { return init_ ? first_ : *iter_; } + + void Next() { + if (init_) + init_ = false; + else + ++iter_; + } + + void Reset() { + init_ = true; + iter_ = rest_.begin(); + } + + private: + const Pair &first_; + const list & rest_; + bool init_; // in the initialized state? + typename list::const_iterator iter_; + + DISALLOW_COPY_AND_ASSIGN(SparseTupleWeightIterator); +}; + +template +inline void SparseTupleWeightMap( + SparseTupleWeight* ret, + const SparseTupleWeight& w1, + const SparseTupleWeight& w2, + const M& operator_mapper) { + SparseTupleWeightIterator w1_it(w1); + SparseTupleWeightIterator w2_it(w2); + const W& v1_def = w1.DefaultValue(); + const W& v2_def = w2.DefaultValue(); + ret->SetDefaultValue(operator_mapper.Map(0, v1_def, v2_def)); + while (!w1_it.Done() || !w2_it.Done()) { + const K& k1 = (w1_it.Done()) ? w2_it.Value().first : w1_it.Value().first; + const K& k2 = (w2_it.Done()) ? w1_it.Value().first : w2_it.Value().first; + const W& v1 = (w1_it.Done()) ? v1_def : w1_it.Value().second; + const W& v2 = (w2_it.Done()) ? v2_def : w2_it.Value().second; + if (k1 == k2) { + ret->Push(k1, operator_mapper.Map(k1, v1, v2)); + if (!w1_it.Done()) w1_it.Next(); + if (!w2_it.Done()) w2_it.Next(); + } else if (k1 < k2) { + ret->Push(k1, operator_mapper.Map(k1, v1, v2_def)); + w1_it.Next(); + } else { + ret->Push(k2, operator_mapper.Map(k2, v1_def, v2)); + w2_it.Next(); + } + } +} + +template +inline bool operator==(const SparseTupleWeight &w1, + const SparseTupleWeight &w2) { + const W& v1_def = w1.DefaultValue(); + const W& v2_def = w2.DefaultValue(); + if (v1_def != v2_def) return false; + + SparseTupleWeightIterator w1_it(w1); + SparseTupleWeightIterator w2_it(w2); + while (!w1_it.Done() || !w2_it.Done()) { + const K& k1 = (w1_it.Done()) ? w2_it.Value().first : w1_it.Value().first; + const K& k2 = (w2_it.Done()) ? w1_it.Value().first : w2_it.Value().first; + const W& v1 = (w1_it.Done()) ? v1_def : w1_it.Value().second; + const W& v2 = (w2_it.Done()) ? v2_def : w2_it.Value().second; + if (k1 == k2) { + if (v1 != v2) return false; + if (!w1_it.Done()) w1_it.Next(); + if (!w2_it.Done()) w2_it.Next(); + } else if (k1 < k2) { + if (v1 != v2_def) return false; + w1_it.Next(); + } else { + if (v1_def != v2) return false; + w2_it.Next(); + } + } + return true; +} + +template +inline bool operator!=(const SparseTupleWeight &w1, + const SparseTupleWeight &w2) { + return !(w1 == w2); +} + +template +inline ostream &operator<<(ostream &strm, const SparseTupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + bool write_parens = false; + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + write_parens = true; + } + + if (write_parens) + strm << FLAGS_fst_weight_parentheses[0]; + + strm << w.DefaultValue(); + strm << separator; + + size_t n = w.Size(); + strm << n; + strm << separator; + + for (SparseTupleWeightIterator it(w); !it.Done(); it.Next()) { + strm << it.Value().first; + strm << separator; + strm << it.Value().second; + strm << separator; + } + + if (write_parens) + strm << FLAGS_fst_weight_parentheses[1]; + + return strm; +} + +template +inline istream &operator>>(istream &strm, SparseTupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + return SparseTupleWeight::ReadWithParen( + strm, w, separator, FLAGS_fst_weight_parentheses[0], + FLAGS_fst_weight_parentheses[1]); + } else { + return SparseTupleWeight::ReadNoParen(strm, w, separator); + } +} + +// Reads SparseTupleWeight when there are no parentheses around tuple terms +template +inline istream& SparseTupleWeight::ReadNoParen( + istream &strm, + SparseTupleWeight &w, + char separator) { + int c; + size_t n; + + do { + c = strm.get(); + } while (isspace(c)); + + + { // Read default weight + W default_value; + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> default_value; + w.SetDefaultValue(default_value); + } + + c = strm.get(); + + { // Read n + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> n; + } + + // Read n elements + for (size_t i = 0; i < n; ++i) { + // discard separator + c = strm.get(); + K p; + W r; + + { // read key + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> p; + } + + c = strm.get(); + + { // read weight + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> r; + } + + w.Push(p, r); + } + + c = strm.get(); + if (c != separator) { + strm.clear(std::ios::badbit); + } + + return strm; +} + +// Reads SparseTupleWeight when there are parentheses around tuple terms +template +inline istream& SparseTupleWeight::ReadWithParen( + istream &strm, + SparseTupleWeight &w, + char separator, + char open_paren, + char close_paren) { + int c; + size_t n; + + do { + c = strm.get(); + } while (isspace(c)); + + if (c != open_paren) { + FSTERROR() << "is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::badbit); + return strm; + } + + c = strm.get(); + + { // Read weight + W default_value; + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> default_value; + w.SetDefaultValue(default_value); + } + + c = strm.get(); + + { // Read n + string s; + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> n; + } + + // Read n elements + for (size_t i = 0; i < n; ++i) { + // discard separator + c = strm.get(); + K p; + W r; + + { // Read key + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> p; + } + + c = strm.get(); + + { // Read weight + stack parens; + string s; + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // If parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + sstrm >> r; + } + + w.Push(p, r); + } + + if (c != separator) { + FSTERROR() << " separator expected, not found! "; + strm.clear(std::ios::badbit); + return strm; + } + + c = strm.get(); + if (c != close_paren) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::badbit); + return strm; + } + + return strm; +} + + + +} // namespace fst + +#endif // FST_LIB_SPARSE_TUPLE_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/state-map.h b/extlibs/openfstwin-1.3.1/include/fst/state-map.h new file mode 100755 index 00000000000..d1441f5274f --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/state-map.h @@ -0,0 +1,601 @@ +// map.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to map over/transform states e.g., sort transitions +// Consider using when operation does not change the number of states. + +#ifndef FST_LIB_STATE_MAP_H__ +#define FST_LIB_STATE_MAP_H__ + +#include +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; + +#include +#include +#include + + +namespace fst { + +// StateMapper Interface - class determinies how states are mapped. +// Useful for implementing operations that do not change the number of states. +// +// class StateMapper { +// public: +// typedef A FromArc; +// typedef B ToArc; +// +// // Typical constructor +// StateMapper(const Fst &fst); +// // Required copy constructor that allows updating Fst argument; +// // pass only if relevant and changed. +// StateMapper(const StateMapper &mapper, const Fst *fst = 0); +// +// // Specifies initial state of result +// B::StateId Start() const; +// // Specifies state's final weight in result +// B::Weight Final(B::StateId s) const; +// +// // These methods iterate through a state's arcs in result +// // Specifies state to iterate over +// void SetState(B::StateId s); +// // End of arcs? +// bool Done() const; +// // Current arc + +// const B &Value() const; +// // Advance to next arc (when !Done) +// void Next(); +// +// // Specifies input symbol table action the mapper requires (see above). +// MapSymbolsAction InputSymbolsAction() const; +// // Specifies output symbol table action the mapper requires (see above). +// MapSymbolsAction OutputSymbolsAction() const; +// // This specifies the known properties of an Fst mapped by this +// // mapper. It takes as argument the input Fst's known properties. +// uint64 Properties(uint64 props) const; +// }; +// +// We include a various state map versions below. One dimension of +// variation is whether the mapping mutates its input, writes to a +// new result Fst, or is an on-the-fly Fst. Another dimension is how +// we pass the mapper. We allow passing the mapper by pointer +// for cases that we need to change the state of the user's mapper. +// We also include map versions that pass the mapper +// by value or const reference when this suffices. + +// Maps an arc type A using a mapper function object C, passed +// by pointer. This version modifies its Fst input. +template +void StateMap(MutableFst *fst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetOutputSymbols(0); + + if (fst->Start() == kNoStateId) + return; + + uint64 props = fst->Properties(kFstProperties, false); + + fst->SetStart(mapper->Start()); + + for (StateId s = 0; s < fst->NumStates(); ++s) { + mapper->SetState(s); + fst->DeleteArcs(s); + for (; !mapper->Done(); mapper->Next()) + fst->AddArc(s, mapper->Value()); + fst->SetFinal(s, mapper->Final(s)); + } + + fst->SetProperties(mapper->Properties(props), kFstProperties); +} + +// Maps an arc type A using a mapper function object C, passed +// by value. This version modifies its Fst input. +template +void StateMap(MutableFst *fst, C mapper) { + StateMap(fst, &mapper); +} + + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by pointer. This version writes the mapped +// input Fst to an output MutableFst. +template +void StateMap(const Fst &ifst, MutableFst *ofst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + ofst->DeleteStates(); + + if (mapper->InputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetInputSymbols(ifst.InputSymbols()); + else if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetOutputSymbols(ifst.OutputSymbols()); + else if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetOutputSymbols(0); + + uint64 iprops = ifst.Properties(kCopyProperties, false); + + if (ifst.Start() == kNoStateId) { + if (iprops & kError) ofst->SetProperties(kError, kError); + return; + } + + // Add all states. + if (ifst.Properties(kExpanded, false)) + ofst->ReserveStates(CountStates(ifst)); + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) + ofst->AddState(); + + ofst->SetStart(mapper->Start()); + + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + mapper->SetState(s); + for (; !mapper->Done(); mapper->Next()) + ofst->AddArc(s, mapper->Value()); + ofst->SetFinal(s, mapper->Final(s)); + } + + uint64 oprops = ofst->Properties(kFstProperties, false); + ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties); +} + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by value. This version writes the mapped input +// Fst to an output MutableFst. +template +void StateMap(const Fst &ifst, MutableFst *ofst, C mapper) { + StateMap(ifst, ofst, &mapper); +} + +typedef CacheOptions StateMapFstOptions; + +template class StateMapFst; + +// Implementation of delayed StateMapFst. +template +class StateMapFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using VectorFstBaseImpl::State>::NumStates; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + friend class StateIterator< StateMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + + StateMapFstImpl(const Fst &fst, const C &mapper, + const StateMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(new C(mapper, fst_)), + own_mapper_(true) { + Init(); + } + + StateMapFstImpl(const Fst &fst, C *mapper, + const StateMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(mapper), + own_mapper_(false) { + Init(); + } + + StateMapFstImpl(const StateMapFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + mapper_(new C(*impl.mapper_, fst_)), + own_mapper_(true) { + Init(); + } + + ~StateMapFstImpl() { + delete fst_; + if (own_mapper_) delete mapper_; + } + + StateId Start() { + if (!HasStart()) + SetStart(mapper_->Start()); + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) + SetFinal(s, mapper_->Final(s)); + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitStateIterator(StateIteratorData *data) const { + fst_->InitStateIterator(data); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (fst_->Properties(kError, false) || + (mapper_->Properties(0) & kError))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void Expand(StateId s) { + // Add exiting arcs. + for (mapper_->SetState(s); !mapper_->Done(); mapper_->Next()) + PushArc(s, mapper_->Value()); + SetArcs(s); + } + + private: + void Init() { + SetType("statemap"); + + if (mapper_->InputSymbolsAction() == MAP_COPY_SYMBOLS) + SetInputSymbols(fst_->InputSymbols()); + else if (mapper_->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetInputSymbols(0); + + if (mapper_->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + SetOutputSymbols(fst_->OutputSymbols()); + else if (mapper_->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetOutputSymbols(0); + + uint64 props = fst_->Properties(kCopyProperties, false); + SetProperties(mapper_->Properties(props)); + } + + const Fst *fst_; + C* mapper_; + bool own_mapper_; + + void operator=(const StateMapFstImpl &); // disallow +}; + + +// Maps an arc type A to an arc type B using Mapper function object +// C. This version is a delayed Fst. +template +class StateMapFst : public ImplToFst< StateMapFstImpl > { + public: + friend class ArcIterator< StateMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + typedef CacheState State; + typedef StateMapFstImpl Impl; + + StateMapFst(const Fst &fst, const C &mapper, + const StateMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + StateMapFst(const Fst &fst, C* mapper, const StateMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + StateMapFst(const Fst &fst, const C &mapper) + : ImplToFst(new Impl(fst, mapper, StateMapFstOptions())) {} + + StateMapFst(const Fst &fst, C* mapper) + : ImplToFst(new Impl(fst, mapper, StateMapFstOptions())) {} + + // See Fst<>::Copy() for doc. + StateMapFst(const StateMapFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this StateMapFst. See Fst<>::Copy() for further doc. + virtual StateMapFst *Copy(bool safe = false) const { + return new StateMapFst(*this, safe); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const StateMapFst &fst); // disallow +}; + + +// Specialization for StateMapFst. +template +class ArcIterator< StateMapFst > + : public CacheArcIterator< StateMapFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const StateMapFst &fst, StateId s) + : CacheArcIterator< StateMapFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// +// Utility Mappers +// + +// Mapper that returns its input. +template +class IdentityStateMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit IdentityStateMapper(const Fst &fst) : fst_(fst), aiter_(0) {} + + // Allows updating Fst argument; pass only if changed. + IdentityStateMapper(const IdentityStateMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), aiter_(0) {} + + ~IdentityStateMapper() { delete aiter_; } + + StateId Start() const { return fst_.Start(); } + + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + if (aiter_) delete aiter_; + aiter_ = new ArcIterator< Fst >(fst_, s); + } + + bool Done() const { return aiter_->Done(); } + const A &Value() const { return aiter_->Value(); } + void Next() { aiter_->Next(); } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } + + private: + const Fst &fst_; + ArcIterator< Fst > *aiter_; +}; + +template +class ArcSumMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit ArcSumMapper(const Fst &fst) : fst_(fst), i_(0) {} + + // Allows updating Fst argument; pass only if changed. + ArcSumMapper(const ArcSumMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), i_(0) {} + + StateId Start() const { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + i_ = 0; + arcs_.clear(); + arcs_.reserve(fst_.NumArcs(s)); + for (ArcIterator > aiter(fst_, s); !aiter.Done(); aiter.Next()) + arcs_.push_back(aiter.Value()); + + // First sorts the exiting arcs by input label, output label + // and destination state and then sums weights of arcs with + // the same input label, output label, and destination state. + sort(arcs_.begin(), arcs_.end(), comp_); + size_t narcs = 0; + for (size_t i = 0; i < arcs_.size(); ++i) { + if (narcs > 0 && equal_(arcs_[i], arcs_[narcs - 1])) { + arcs_[narcs - 1].weight = Plus(arcs_[narcs - 1].weight, + arcs_[i].weight); + } else { + arcs_[narcs++] = arcs_[i]; + } + } + arcs_.resize(narcs); + } + + bool Done() const { return i_ >= arcs_.size(); } + const A &Value() const { return arcs_[i_]; } + void Next() { ++i_; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + uint64 Properties(uint64 props) const { + return props & kArcSortProperties & + kDeleteArcsProperties & kWeightInvariantProperties; + } + + private: + struct Compare { + bool operator()(const A& x, const A& y) { + if (x.ilabel < y.ilabel) return true; + if (x.ilabel > y.ilabel) return false; + if (x.olabel < y.olabel) return true; + if (x.olabel > y.olabel) return false; + if (x.nextstate < y.nextstate) return true; + if (x.nextstate > y.nextstate) return false; + return false; + } + }; + + struct Equal { + bool operator()(const A& x, const A& y) { + return (x.ilabel == y.ilabel && + x.olabel == y.olabel && + x.nextstate == y.nextstate); + } + }; + + const Fst &fst_; + Compare comp_; + Equal equal_; + vector arcs_; + ssize_t i_; // current arc position + + void operator=(const ArcSumMapper &); // disallow +}; + +template +class ArcUniqueMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit ArcUniqueMapper(const Fst &fst) : fst_(fst), i_(0) {} + + // Allows updating Fst argument; pass only if changed. + ArcUniqueMapper(const ArcSumMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), i_(0) {} + + StateId Start() const { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + i_ = 0; + arcs_.clear(); + arcs_.reserve(fst_.NumArcs(s)); + for (ArcIterator > aiter(fst_, s); !aiter.Done(); aiter.Next()) + arcs_.push_back(aiter.Value()); + + // First sorts the exiting arcs by input label, output label + // and destination state and then uniques identical arcs + sort(arcs_.begin(), arcs_.end(), comp_); + typename vector::iterator unique_end = + unique(arcs_.begin(), arcs_.end(), equal_); + arcs_.resize(unique_end - arcs_.begin()); + } + + bool Done() const { return i_ >= arcs_.size(); } + const A &Value() const { return arcs_[i_]; } + void Next() { ++i_; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + uint64 Properties(uint64 props) const { + return props & kArcSortProperties & kDeleteArcsProperties; + } + + private: + struct Compare { + bool operator()(const A& x, const A& y) { + if (x.ilabel < y.ilabel) return true; + if (x.ilabel > y.ilabel) return false; + if (x.olabel < y.olabel) return true; + if (x.olabel > y.olabel) return false; + if (x.nextstate < y.nextstate) return true; + if (x.nextstate > y.nextstate) return false; + return false; + } + }; + + struct Equal { + bool operator()(const A& x, const A& y) { + return (x.ilabel == y.ilabel && + x.olabel == y.olabel && + x.nextstate == y.nextstate && + x.weight == y.weight); + } + }; + + const Fst &fst_; + Compare comp_; + Equal equal_; + vector arcs_; + ssize_t i_; // current arc position + + void operator=(const ArcUniqueMapper &); // disallow +}; + + +} // namespace fst + +#endif // FST_LIB_STATE_MAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/state-map.h.bak b/extlibs/openfstwin-1.3.1/include/fst/state-map.h.bak new file mode 100755 index 00000000000..bdf59d6065b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/state-map.h.bak @@ -0,0 +1,601 @@ +// map.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to map over/transform states e.g., sort transitions +// Consider using when operation does not change the number of states. + +#ifndef FST_LIB_STATE_MAP_H__ +#define FST_LIB_STATE_MAP_H__ + +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +#include +using std::pair; using std::make_pair; + +#include +#include +#include + + +namespace fst { + +// StateMapper Interface - class determinies how states are mapped. +// Useful for implementing operations that do not change the number of states. +// +// class StateMapper { +// public: +// typedef A FromArc; +// typedef B ToArc; +// +// // Typical constructor +// StateMapper(const Fst &fst); +// // Required copy constructor that allows updating Fst argument; +// // pass only if relevant and changed. +// StateMapper(const StateMapper &mapper, const Fst *fst = 0); +// +// // Specifies initial state of result +// B::StateId Start() const; +// // Specifies state's final weight in result +// B::Weight Final(B::StateId s) const; +// +// // These methods iterate through a state's arcs in result +// // Specifies state to iterate over +// void SetState(B::StateId s); +// // End of arcs? +// bool Done() const; +// // Current arc + +// const B &Value() const; +// // Advance to next arc (when !Done) +// void Next(); +// +// // Specifies input symbol table action the mapper requires (see above). +// MapSymbolsAction InputSymbolsAction() const; +// // Specifies output symbol table action the mapper requires (see above). +// MapSymbolsAction OutputSymbolsAction() const; +// // This specifies the known properties of an Fst mapped by this +// // mapper. It takes as argument the input Fst's known properties. +// uint64 Properties(uint64 props) const; +// }; +// +// We include a various state map versions below. One dimension of +// variation is whether the mapping mutates its input, writes to a +// new result Fst, or is an on-the-fly Fst. Another dimension is how +// we pass the mapper. We allow passing the mapper by pointer +// for cases that we need to change the state of the user's mapper. +// We also include map versions that pass the mapper +// by value or const reference when this suffices. + +// Maps an arc type A using a mapper function object C, passed +// by pointer. This version modifies its Fst input. +template +void StateMap(MutableFst *fst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + fst->SetOutputSymbols(0); + + if (fst->Start() == kNoStateId) + return; + + uint64 props = fst->Properties(kFstProperties, false); + + fst->SetStart(mapper->Start()); + + for (StateId s = 0; s < fst->NumStates(); ++s) { + mapper->SetState(s); + fst->DeleteArcs(s); + for (; !mapper->Done(); mapper->Next()) + fst->AddArc(s, mapper->Value()); + fst->SetFinal(s, mapper->Final(s)); + } + + fst->SetProperties(mapper->Properties(props), kFstProperties); +} + +// Maps an arc type A using a mapper function object C, passed +// by value. This version modifies its Fst input. +template +void StateMap(MutableFst *fst, C mapper) { + StateMap(fst, &mapper); +} + + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by pointer. This version writes the mapped +// input Fst to an output MutableFst. +template +void StateMap(const Fst &ifst, MutableFst *ofst, C* mapper) { + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + ofst->DeleteStates(); + + if (mapper->InputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetInputSymbols(ifst.InputSymbols()); + else if (mapper->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetInputSymbols(0); + + if (mapper->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + ofst->SetOutputSymbols(ifst.OutputSymbols()); + else if (mapper->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + ofst->SetOutputSymbols(0); + + uint64 iprops = ifst.Properties(kCopyProperties, false); + + if (ifst.Start() == kNoStateId) { + if (iprops & kError) ofst->SetProperties(kError, kError); + return; + } + + // Add all states. + if (ifst.Properties(kExpanded, false)) + ofst->ReserveStates(CountStates(ifst)); + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) + ofst->AddState(); + + ofst->SetStart(mapper->Start()); + + for (StateIterator< Fst > siter(ifst); !siter.Done(); siter.Next()) { + StateId s = siter.Value(); + mapper->SetState(s); + for (; !mapper->Done(); mapper->Next()) + ofst->AddArc(s, mapper->Value()); + ofst->SetFinal(s, mapper->Final(s)); + } + + uint64 oprops = ofst->Properties(kFstProperties, false); + ofst->SetProperties(mapper->Properties(iprops) | oprops, kFstProperties); +} + +// Maps an arc type A to an arc type B using mapper function +// object C, passed by value. This version writes the mapped input +// Fst to an output MutableFst. +template +void StateMap(const Fst &ifst, MutableFst *ofst, C mapper) { + StateMap(ifst, ofst, &mapper); +} + +typedef CacheOptions StateMapFstOptions; + +template class StateMapFst; + +// Implementation of delayed StateMapFst. +template +class StateMapFstImpl : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using VectorFstBaseImpl::State>::NumStates; + + using CacheImpl::PushArc; + using CacheImpl::HasArcs; + using CacheImpl::HasFinal; + using CacheImpl::HasStart; + using CacheImpl::SetArcs; + using CacheImpl::SetFinal; + using CacheImpl::SetStart; + + friend class StateIterator< StateMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + + StateMapFstImpl(const Fst &fst, const C &mapper, + const StateMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(new C(mapper, fst_)), + own_mapper_(true) { + Init(); + } + + StateMapFstImpl(const Fst &fst, C *mapper, + const StateMapFstOptions& opts) + : CacheImpl(opts), + fst_(fst.Copy()), + mapper_(mapper), + own_mapper_(false) { + Init(); + } + + StateMapFstImpl(const StateMapFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)), + mapper_(new C(*impl.mapper_, fst_)), + own_mapper_(true) { + Init(); + } + + ~StateMapFstImpl() { + delete fst_; + if (own_mapper_) delete mapper_; + } + + StateId Start() { + if (!HasStart()) + SetStart(mapper_->Start()); + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) + SetFinal(s, mapper_->Final(s)); + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + void InitStateIterator(StateIteratorData *data) const { + fst_->InitStateIterator(data); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && (fst_->Properties(kError, false) || + (mapper_->Properties(0) & kError))) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void Expand(StateId s) { + // Add exiting arcs. + for (mapper_->SetState(s); !mapper_->Done(); mapper_->Next()) + PushArc(s, mapper_->Value()); + SetArcs(s); + } + + private: + void Init() { + SetType("statemap"); + + if (mapper_->InputSymbolsAction() == MAP_COPY_SYMBOLS) + SetInputSymbols(fst_->InputSymbols()); + else if (mapper_->InputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetInputSymbols(0); + + if (mapper_->OutputSymbolsAction() == MAP_COPY_SYMBOLS) + SetOutputSymbols(fst_->OutputSymbols()); + else if (mapper_->OutputSymbolsAction() == MAP_CLEAR_SYMBOLS) + SetOutputSymbols(0); + + uint64 props = fst_->Properties(kCopyProperties, false); + SetProperties(mapper_->Properties(props)); + } + + const Fst *fst_; + C* mapper_; + bool own_mapper_; + + void operator=(const StateMapFstImpl &); // disallow +}; + + +// Maps an arc type A to an arc type B using Mapper function object +// C. This version is a delayed Fst. +template +class StateMapFst : public ImplToFst< StateMapFstImpl > { + public: + friend class ArcIterator< StateMapFst >; + + typedef B Arc; + typedef typename B::Weight Weight; + typedef typename B::StateId StateId; + typedef CacheState State; + typedef StateMapFstImpl Impl; + + StateMapFst(const Fst &fst, const C &mapper, + const StateMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + StateMapFst(const Fst &fst, C* mapper, const StateMapFstOptions& opts) + : ImplToFst(new Impl(fst, mapper, opts)) {} + + StateMapFst(const Fst &fst, const C &mapper) + : ImplToFst(new Impl(fst, mapper, StateMapFstOptions())) {} + + StateMapFst(const Fst &fst, C* mapper) + : ImplToFst(new Impl(fst, mapper, StateMapFstOptions())) {} + + // See Fst<>::Copy() for doc. + StateMapFst(const StateMapFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this StateMapFst. See Fst<>::Copy() for further doc. + virtual StateMapFst *Copy(bool safe = false) const { + return new StateMapFst(*this, safe); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const StateMapFst &fst); // disallow +}; + + +// Specialization for StateMapFst. +template +class ArcIterator< StateMapFst > + : public CacheArcIterator< StateMapFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const StateMapFst &fst, StateId s) + : CacheArcIterator< StateMapFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// +// Utility Mappers +// + +// Mapper that returns its input. +template +class IdentityStateMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit IdentityStateMapper(const Fst &fst) : fst_(fst), aiter_(0) {} + + // Allows updating Fst argument; pass only if changed. + IdentityStateMapper(const IdentityStateMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), aiter_(0) {} + + ~IdentityStateMapper() { delete aiter_; } + + StateId Start() const { return fst_.Start(); } + + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + if (aiter_) delete aiter_; + aiter_ = new ArcIterator< Fst >(fst_, s); + } + + bool Done() const { return aiter_->Done(); } + const A &Value() const { return aiter_->Value(); } + void Next() { aiter_->Next(); } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS;} + + uint64 Properties(uint64 props) const { return props; } + + private: + const Fst &fst_; + ArcIterator< Fst > *aiter_; +}; + +template +class ArcSumMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit ArcSumMapper(const Fst &fst) : fst_(fst), i_(0) {} + + // Allows updating Fst argument; pass only if changed. + ArcSumMapper(const ArcSumMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), i_(0) {} + + StateId Start() const { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + i_ = 0; + arcs_.clear(); + arcs_.reserve(fst_.NumArcs(s)); + for (ArcIterator > aiter(fst_, s); !aiter.Done(); aiter.Next()) + arcs_.push_back(aiter.Value()); + + // First sorts the exiting arcs by input label, output label + // and destination state and then sums weights of arcs with + // the same input label, output label, and destination state. + sort(arcs_.begin(), arcs_.end(), comp_); + size_t narcs = 0; + for (size_t i = 0; i < arcs_.size(); ++i) { + if (narcs > 0 && equal_(arcs_[i], arcs_[narcs - 1])) { + arcs_[narcs - 1].weight = Plus(arcs_[narcs - 1].weight, + arcs_[i].weight); + } else { + arcs_[narcs++] = arcs_[i]; + } + } + arcs_.resize(narcs); + } + + bool Done() const { return i_ >= arcs_.size(); } + const A &Value() const { return arcs_[i_]; } + void Next() { ++i_; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + uint64 Properties(uint64 props) const { + return props & kArcSortProperties & + kDeleteArcsProperties & kWeightInvariantProperties; + } + + private: + struct Compare { + bool operator()(const A& x, const A& y) { + if (x.ilabel < y.ilabel) return true; + if (x.ilabel > y.ilabel) return false; + if (x.olabel < y.olabel) return true; + if (x.olabel > y.olabel) return false; + if (x.nextstate < y.nextstate) return true; + if (x.nextstate > y.nextstate) return false; + return false; + } + }; + + struct Equal { + bool operator()(const A& x, const A& y) { + return (x.ilabel == y.ilabel && + x.olabel == y.olabel && + x.nextstate == y.nextstate); + } + }; + + const Fst &fst_; + Compare comp_; + Equal equal_; + vector arcs_; + ssize_t i_; // current arc position + + void operator=(const ArcSumMapper &); // disallow +}; + +template +class ArcUniqueMapper { + public: + typedef A FromArc; + typedef A ToArc; + + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + explicit ArcUniqueMapper(const Fst &fst) : fst_(fst), i_(0) {} + + // Allows updating Fst argument; pass only if changed. + ArcUniqueMapper(const ArcSumMapper &mapper, + const Fst *fst = 0) + : fst_(fst ? *fst : mapper.fst_), i_(0) {} + + StateId Start() const { return fst_.Start(); } + Weight Final(StateId s) const { return fst_.Final(s); } + + void SetState(StateId s) { + i_ = 0; + arcs_.clear(); + arcs_.reserve(fst_.NumArcs(s)); + for (ArcIterator > aiter(fst_, s); !aiter.Done(); aiter.Next()) + arcs_.push_back(aiter.Value()); + + // First sorts the exiting arcs by input label, output label + // and destination state and then uniques identical arcs + sort(arcs_.begin(), arcs_.end(), comp_); + typename vector::iterator unique_end = + unique(arcs_.begin(), arcs_.end(), equal_); + arcs_.resize(unique_end - arcs_.begin()); + } + + bool Done() const { return i_ >= arcs_.size(); } + const A &Value() const { return arcs_[i_]; } + void Next() { ++i_; } + + MapSymbolsAction InputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + MapSymbolsAction OutputSymbolsAction() const { return MAP_COPY_SYMBOLS; } + + uint64 Properties(uint64 props) const { + return props & kArcSortProperties & kDeleteArcsProperties; + } + + private: + struct Compare { + bool operator()(const A& x, const A& y) { + if (x.ilabel < y.ilabel) return true; + if (x.ilabel > y.ilabel) return false; + if (x.olabel < y.olabel) return true; + if (x.olabel > y.olabel) return false; + if (x.nextstate < y.nextstate) return true; + if (x.nextstate > y.nextstate) return false; + return false; + } + }; + + struct Equal { + bool operator()(const A& x, const A& y) { + return (x.ilabel == y.ilabel && + x.olabel == y.olabel && + x.nextstate == y.nextstate && + x.weight == y.weight); + } + }; + + const Fst &fst_; + Compare comp_; + Equal equal_; + vector arcs_; + ssize_t i_; // current arc position + + void operator=(const ArcUniqueMapper &); // disallow +}; + + +} // namespace fst + +#endif // FST_LIB_STATE_MAP_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/state-reachable.h b/extlibs/openfstwin-1.3.1/include/fst/state-reachable.h new file mode 100755 index 00000000000..6d0c971baa0 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/state-reachable.h @@ -0,0 +1,198 @@ +// state-reachable.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Class to determine whether a given (final) state can be reached from some +// other given state. + +#ifndef FST_LIB_STATE_REACHABLE_H__ +#define FST_LIB_STATE_REACHABLE_H__ + +#include +using std::vector; + +#include +#include +#include + + +namespace fst { + +// Computes the (final) states reachable from a given state in an FST. +// After this visitor has been called, a final state f can be reached +// from a state s iff (*isets)[s].Member(state2index[f]) is true, where +// (*isets[s]) is a set of half-open inteval of final state indices +// and state2index[f] maps from a final state to its index. +// +// If state2index is empty, it is filled-in with suitable indices. +// If it is non-empty, those indices are used; in this case, the +// final states must have out-degree 0. +template +class IntervalReachVisitor { + public: + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename IntervalSet::Interval Interval; + + IntervalReachVisitor(const Fst &fst, + vector< IntervalSet > *isets, + vector *state2index) + : fst_(fst), + isets_(isets), + state2index_(state2index), + index_(state2index->empty() ? 1 : -1), + error_(false) { + isets_->clear(); + } + + void InitVisit(const Fst &fst) { error_ = false; } + + bool InitState(StateId s, StateId r) { + while (isets_->size() <= s) + isets_->push_back(IntervalSet &fst_; + vector< IntervalSet > *isets_; + vector *state2index_; + I index_; + bool error_; +}; + + +// Tests reachability of final states from a given state. To test for +// reachability from a state s, first do SetState(s). Then a final +// state f can be reached from state s of FST iff Reach(f) is true. +template +class StateReachable { + public: + typedef A Arc; + typedef I Index; + typedef typename A::StateId StateId; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename IntervalSet::Interval Interval; + + StateReachable(const Fst &fst) + : error_(false) { + IntervalReachVisitor reach_visitor(fst, &isets_, &state2index_); + DfsVisit(fst, &reach_visitor); + if (reach_visitor.Error()) error_ = true; + } + + StateReachable(const StateReachable &reachable) { + FSTERROR() << "Copy constructor for state reachable class " + << "not yet implemented."; + error_ = true; + } + + // Set current state. + void SetState(StateId s) { s_ = s; } + + // Can reach this label from current state? + bool Reach(StateId s) { + if (s >= state2index_.size()) + return false; + + I i = state2index_[s]; + if (i < 0) { + FSTERROR() << "StateReachable: state non-final: " << s; + error_ = true; + return false; + } + return isets_[s_].Member(i); + } + + // Access to the state-to-index mapping. Unassigned states have index -1. + vector &State2Index() { return state2index_; } + + // Access to the interval sets. These specify the reachability + // to the final states as intervals of the final state indices. + const vector< IntervalSet > &IntervalSets() { return isets_; } + + bool Error() const { return error_; } + + private: + StateId s_; // Current state + vector< IntervalSet > isets_; // Interval sets per state + vector state2index_; // Finds index for a final state + bool error_; + + void operator=(const StateReachable &); // Disallow +}; + +} // namespace fst + +#endif // FST_LIB_STATE_REACHABLE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/state-table.h b/extlibs/openfstwin-1.3.1/include/fst/state-table.h new file mode 100755 index 00000000000..7d863a04813 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/state-table.h @@ -0,0 +1,469 @@ +// state-table.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Classes for representing the mapping between state tuples and state Ids. + +#ifndef FST_LIB_STATE_TABLE_H__ +#define FST_LIB_STATE_TABLE_H__ + +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +// STATE TABLES - these determine the bijective mapping between state +// tuples (e.g. in composition triples of two FST states and a +// composition filter state) and their corresponding state IDs. +// They are classes, templated on state tuples, of the form: +// +// template +// class StateTable { +// public: +// typedef typename T StateTuple; +// +// // Required constructors. +// StateTable(); +// +// // Lookup state ID by tuple. If it doesn't exist, then add it. +// StateId FindState(const StateTuple &); +// // Lookup state tuple by state ID. +// const StateTuple &Tuple(StateId) const; +// // # of stored tuples. +// StateId Size() const; +// }; +// +// A state tuple has the form: +// +// template +// struct StateTuple { +// typedef typename S StateId; +// +// // Required constructor. +// StateTuple(); +// }; + + +// An implementation using a hash map for the tuple to state ID mapping. +// The state tuple T must have == defined and the default constructor +// must produce a tuple that will never be seen. H is the hash function. +template +class HashStateTable : public HashBiTable { + public: + typedef T StateTuple; + typedef typename StateTuple::StateId StateId; + using HashBiTable::FindId; + using HashBiTable::FindEntry; + using HashBiTable::Size; + + HashStateTable() : HashBiTable() {} + StateId FindState(const StateTuple &tuple) { return FindId(tuple); } + const StateTuple &Tuple(StateId s) const { return FindEntry(s); } +}; + + +// An implementation using a hash set for the tuple to state ID +// mapping. The state tuple T must have == defined and the default +// constructor must produce a tuple that will never be seen. H is the +// hash function. +template +class CompactHashStateTable + : public CompactHashBiTable { + public: + typedef T StateTuple; + typedef typename StateTuple::StateId StateId; + using CompactHashBiTable::FindId; + using CompactHashBiTable::FindEntry; + using CompactHashBiTable::Size; + + CompactHashStateTable() : CompactHashBiTable() {} + + // Reserves space for table_size elements. + explicit CompactHashStateTable(size_t table_size) + : CompactHashBiTable(table_size) {} + + StateId FindState(const StateTuple &tuple) { return FindId(tuple); } + const StateTuple &Tuple(StateId s) const { return FindEntry(s); } +}; + +// An implementation using a vector for the tuple to state mapping. +// It is passed a function object FP that should fingerprint tuples +// uniquely to an integer that can used as a vector index. Normally, +// VectorStateTable constructs the FP object. The user can instead +// pass in this object; in that case, VectorStateTable takes its +// ownership. +template +class VectorStateTable + : public VectorBiTable { + public: + typedef T StateTuple; + typedef typename StateTuple::StateId StateId; + using VectorBiTable::FindId; + using VectorBiTable::FindEntry; + using VectorBiTable::Size; + using VectorBiTable::Fingerprint; + + explicit VectorStateTable(FP *fp = 0) : VectorBiTable(fp) {} + StateId FindState(const StateTuple &tuple) { return FindId(tuple); } + const StateTuple &Tuple(StateId s) const { return FindEntry(s); } +}; + + +// An implementation using a vector and a compact hash table. The +// selecting functor S returns true for tuples to be hashed in the +// vector. The fingerprinting functor FP returns a unique fingerprint +// for each tuple to be hashed in the vector (these need to be +// suitable for indexing in a vector). The hash functor H is used when +// hashing tuple into the compact hash table. +template +class VectorHashStateTable + : public VectorHashBiTable { + public: + typedef T StateTuple; + typedef typename StateTuple::StateId StateId; + using VectorHashBiTable::FindId; + using VectorHashBiTable::FindEntry; + using VectorHashBiTable::Size; + using VectorHashBiTable::Selector; + using VectorHashBiTable::Fingerprint; + using VectorHashBiTable::Hash; + + VectorHashStateTable(S *s, FP *fp, H *h, + size_t vector_size = 0, + size_t tuple_size = 0) + : VectorHashBiTable( + s, fp, h, vector_size, tuple_size) {} + + StateId FindState(const StateTuple &tuple) { return FindId(tuple); } + const StateTuple &Tuple(StateId s) const { return FindEntry(s); } +}; + + +// An implementation using a hash map for the tuple to state ID +// mapping. This version permits erasing of states. The state tuple T +// must have == defined and its default constructor must produce a +// tuple that will never be seen. F is the hash function. +template +class ErasableStateTable : public ErasableBiTable { + public: + typedef T StateTuple; + typedef typename StateTuple::StateId StateId; + using ErasableBiTable::FindId; + using ErasableBiTable::FindEntry; + using ErasableBiTable::Size; + using ErasableBiTable::Erase; + + ErasableStateTable() : ErasableBiTable() {} + StateId FindState(const StateTuple &tuple) { return FindId(tuple); } + const StateTuple &Tuple(StateId s) const { return FindEntry(s); } +}; + +// +// COMPOSITION STATE TUPLES AND TABLES +// +// The composition state table has the form: +// +// template +// class ComposeStateTable { +// public: +// typedef A Arc; +// typedef F FilterState; +// typedef typename A::StateId StateId; +// typedef ComposeStateTuple StateTuple; +// +// // Required constructors. Copy constructor does not copy state. +// ComposeStateTable(const Fst &fst1, const Fst &fst2); +// ComposeStateTable(const ComposeStateTable &table); +// // Lookup state ID by tuple. If it doesn't exist, then add it. +// StateId FindState(const StateTuple &); +// // Lookup state tuple by state ID. +// const StateTuple &Tuple(StateId) const; +// // # of stored tuples. +// StateId Size() const; +// // Return true if error encountered +// bool Error() const; +// }; + +// Represents the composition state. +template +struct ComposeStateTuple { + typedef S StateId; + typedef F FilterState; + + ComposeStateTuple() + : state_id1(kNoStateId), state_id2(kNoStateId), + filter_state(FilterState::NoState()) {} + + ComposeStateTuple(StateId s1, StateId s2, const FilterState &f) + : state_id1(s1), state_id2(s2), filter_state(f) {} + + StateId state_id1; // State Id on fst1 + StateId state_id2; // State Id on fst2 + FilterState filter_state; // State of composition filter +}; + +// Equality of composition state tuples. +template +inline bool operator==(const ComposeStateTuple& x, + const ComposeStateTuple& y) { + if (&x == &y) + return true; + return x.state_id1 == y.state_id1 && + x.state_id2 == y.state_id2 && + x.filter_state == y.filter_state; +} + + +// Hashing of composition state tuples. +template +class ComposeHash { + public: + size_t operator()(const ComposeStateTuple& t) const { + return t.state_id1 + t.state_id2 * kPrime0 + + t.filter_state.Hash() * kPrime1; + } + private: + static const size_t kPrime0; + static const size_t kPrime1; +}; + +template +const size_t ComposeHash::kPrime0 = 7853; + +template +const size_t ComposeHash::kPrime1 = 7867; + + +// A HashStateTable over composition tuples. +template , + ComposeHash > > +class GenericComposeStateTable : public H { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + GenericComposeStateTable(const Fst &fst1, const Fst &fst2) {} + + GenericComposeStateTable(const GenericComposeStateTable &table) {} + + bool Error() const { return false; } + + private: + void operator=(const GenericComposeStateTable &table); // disallow +}; + + +// Fingerprint for general composition tuples. +template +class ComposeFingerprint { + public: + typedef S StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + // Required but suboptimal constructor. + ComposeFingerprint() : mult1_(8192), mult2_(8192) { + LOG(WARNING) << "TupleFingerprint: # of FST states should be provided."; + } + + // Constructor is provided the sizes of the input FSTs + ComposeFingerprint(StateId nstates1, StateId nstates2) + : mult1_(nstates1), mult2_(nstates1 * nstates2) { } + + size_t operator()(const StateTuple &tuple) { + return tuple.state_id1 + tuple.state_id2 * mult1_ + + tuple.filter_state.Hash() * mult2_; + } + + private: + ssize_t mult1_; + ssize_t mult2_; +}; + + +// Useful when the first composition state determines the tuple. +template +class ComposeState1Fingerprint { + public: + typedef S StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + size_t operator()(const StateTuple &tuple) { return tuple.state_id1; } +}; + + +// Useful when the second composition state determines the tuple. +template +class ComposeState2Fingerprint { + public: + typedef S StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + size_t operator()(const StateTuple &tuple) { return tuple.state_id2; } +}; + + +// A VectorStateTable over composition tuples. This can be used when +// the product of number of states in FST1 and FST2 (and the +// composition filter state hash) is manageable. If the FSTs are not +// expanded Fsts, they will first have their states counted. +template +class ProductComposeStateTable : public +VectorStateTable, + ComposeFingerprint > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + ProductComposeStateTable(const Fst &fst1, const Fst &fst2) + : VectorStateTable, + ComposeFingerprint > + (new ComposeFingerprint(CountStates(fst1), + CountStates(fst2))) { } + + ProductComposeStateTable(const ProductComposeStateTable &table) + : VectorStateTable, + ComposeFingerprint > + (new ComposeFingerprint(table.Fingerprint())) {} + + bool Error() const { return false; } + + private: + void operator=(const ProductComposeStateTable &table); // disallow +}; + +// A VectorStateTable over composition tuples. This can be used when +// FST1 is a string (satisfies kStringProperties) and FST2 is +// epsilon-free and deterministic. It should be used with a +// composition filter that creates at most one filter state per tuple +// under these conditions (e.g. SequenceComposeFilter or +// MatchComposeFilter). +template +class StringDetComposeStateTable : public +VectorStateTable, + ComposeState1Fingerprint > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + StringDetComposeStateTable(const Fst &fst1, const Fst &fst2) + : error_(false) { + uint64 props1 = kString; + uint64 props2 = kIDeterministic | kNoIEpsilons; + if (fst1.Properties(props1, true) != props1 || + fst2.Properties(props2, true) != props2) { + FSTERROR() << "StringDetComposeStateTable: fst1 not a string or" + << " fst2 not input deterministic and epsilon-free"; + error_ = true; + } + } + + StringDetComposeStateTable(const StringDetComposeStateTable &table) + : error_(table.error_) {} + + bool Error() const { return error_; } + + private: + bool error_; + + void operator=(const StringDetComposeStateTable &table); // disallow +}; + + +// A VectorStateTable over composition tuples. This can be used when +// FST2 is a string (satisfies kStringProperties) and FST1 is +// epsilon-free and deterministic. It should be used with a +// composition filter that creates at most one filter state per tuple +// under these conditions (e.g. SequenceComposeFilter or +// MatchComposeFilter). +template +class DetStringComposeStateTable : public +VectorStateTable, + ComposeState1Fingerprint > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + DetStringComposeStateTable(const Fst &fst1, const Fst &fst2) + :error_(false) { + uint64 props1 = kODeterministic | kNoOEpsilons; + uint64 props2 = kString; + if (fst1.Properties(props1, true) != props1 || + fst2.Properties(props2, true) != props2) { + FSTERROR() << "StringDetComposeStateTable: fst2 not a string or" + << " fst1 not output deterministic and epsilon-free"; + error_ = true; + } + } + + DetStringComposeStateTable(const DetStringComposeStateTable &table) + : error_(table.error_) {} + + bool Error() const { return error_; } + + private: + bool error_; + + void operator=(const DetStringComposeStateTable &table); // disallow +}; + + +// An ErasableStateTable over composition tuples. The Erase(StateId) method +// can be called if the user either is sure that composition will never return +// to that tuple or doesn't care that if it does, it is assigned a new +// state ID. +template +class ErasableComposeStateTable : public +ErasableStateTable, + ComposeHash > { + public: + typedef A Arc; + typedef typename A::StateId StateId; + typedef F FilterState; + typedef ComposeStateTuple StateTuple; + + ErasableComposeStateTable(const Fst &fst1, const Fst &fst2) {} + + ErasableComposeStateTable(const ErasableComposeStateTable &table) {} + + bool Error() const { return false; } + + private: + void operator=(const ErasableComposeStateTable &table); // disallow +}; + +} // namespace fst + +#endif // FST_LIB_STATE_TABLE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/statesort.h b/extlibs/openfstwin-1.3.1/include/fst/statesort.h new file mode 100755 index 00000000000..6f827f4747d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/statesort.h @@ -0,0 +1,97 @@ +// statesort.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Function to sort states of an Fst. + +#ifndef FST_LIB_STATESORT_H__ +#define FST_LIB_STATESORT_H__ + +#include +using std::vector; +#include + +#include + + +namespace fst { + +// Sorts the input states of an FST, modifying it. ORDER[i] gives the +// the state Id after sorting that corresponds to state Id i before +// sorting. ORDER must be a permutation of FST's states ID sequence: +// (0, 1, 2, ..., fst->NumStates() - 1). +template +void StateSort(MutableFst *fst, + const vector &order) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Weight Weight; + + if (order.size() != fst->NumStates()) { + FSTERROR() << "StateSort: bad order vector size: " << order.size(); + fst->SetProperties(kError, kError); + return; + } + + if (fst->Start() == kNoStateId) + return; + + uint64 props = fst->Properties(kStateSortProperties, false); + + vector done(order.size(), false); + vector arcsa, arcsb; + vector *arcs1 = &arcsa, *arcs2 = &arcsb; + + fst->SetStart(order[fst->Start()]); + + for (StateIterator< MutableFst > siter(*fst); + !siter.Done(); + siter.Next()) { + StateId s1 = siter.Value(), s2; + if (done[s1]) + continue; + Weight final1 = fst->Final(s1), final2 = Weight::Zero(); + arcs1->clear(); + for (ArcIterator< MutableFst > aiter(*fst, s1); + !aiter.Done(); + aiter.Next()) + arcs1->push_back(aiter.Value()); + for (; !done[s1]; s1 = s2, final1 = final2, swap(arcs1, arcs2)) { + s2 = order[s1]; + if (!done[s2]) { + final2 = fst->Final(s2); + arcs2->clear(); + for (ArcIterator< MutableFst > aiter(*fst, s2); + !aiter.Done(); + aiter.Next()) + arcs2->push_back(aiter.Value()); + } + fst->SetFinal(s2, final1); + fst->DeleteArcs(s2); + for (size_t i = 0; i < arcs1->size(); ++i) { + Arc arc = (*arcs1)[i]; + arc.nextstate = order[arc.nextstate]; + fst->AddArc(s2, arc); + } + done[s1] = true; + } + } + fst->SetProperties(props, kFstProperties); +} + +} // namespace fst + +#endif // FST_LIB_STATESORT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/string-weight.h b/extlibs/openfstwin-1.3.1/include/fst/string-weight.h new file mode 100755 index 00000000000..1beeb3327e5 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/string-weight.h @@ -0,0 +1,560 @@ +// string-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// String weight set and associated semiring operation definitions. + +#ifndef FST_LIB_STRING_WEIGHT_H__ +#define FST_LIB_STRING_WEIGHT_H__ + +#include +#include + +#include +#include + +namespace fst { + +const int kStringInfinity = -1; // Label for the infinite string +const int kStringBad = -2; // Label for a non-string +const char kStringSeparator = '_'; // Label separator in strings + +// Determines whether to use left or right string semiring. Includes +// restricted versions that signal an error if proper prefixes +// (suffixes) would otherwise be returned by Plus, useful with various +// algorithms that require functional transducer input with the +// string semirings. +enum StringType { STRING_LEFT = 0, STRING_RIGHT = 1 , + STRING_LEFT_RESTRICT = 2, STRING_RIGHT_RESTRICT }; + +#define REVERSE_STRING_TYPE(S) \ + ((S) == STRING_LEFT ? STRING_RIGHT : \ + ((S) == STRING_RIGHT ? STRING_LEFT : \ + ((S) == STRING_LEFT_RESTRICT ? STRING_RIGHT_RESTRICT : \ + STRING_LEFT_RESTRICT))) + +template +class StringWeight; + +template +class StringWeightIterator; + +template +class StringWeightReverseIterator; + +template +bool operator==(const StringWeight &, const StringWeight &); + + +// String semiring: (longest_common_prefix/suffix, ., Infinity, Epsilon) +template +class StringWeight { + public: + typedef L Label; + typedef StringWeight ReverseWeight; + + friend class StringWeightIterator; + friend class StringWeightReverseIterator; + friend bool operator==<>(const StringWeight &, + const StringWeight &); + + StringWeight() { Init(); } + + template + StringWeight(const Iter &begin, const Iter &end) { + Init(); + for (Iter iter = begin; iter != end; ++iter) + PushBack(*iter); + } + + explicit StringWeight(L l) { Init(); PushBack(l); } + + static const StringWeight &Zero() { + static const StringWeight zero(kStringInfinity); + return zero; + } + + static const StringWeight &One() { + static const StringWeight one; + return one; + } + + static const StringWeight &NoWeight() { + static const StringWeight no_weight(kStringBad); + return no_weight; + } + + static const string &Type() { + static const string type = + S == STRING_LEFT ? "string" : + (S == STRING_RIGHT ? "right_string" : + (S == STRING_LEFT_RESTRICT ? "restricted_string" : + "right_restricted_string")); + return type; + } + + bool Member() const; + + istream &Read(istream &strm); + + ostream &Write(ostream &strm) const; + + size_t Hash() const; + + StringWeight Quantize(float delta = kDelta) const { + return *this; + } + + ReverseWeight Reverse() const; + + static uint64 Properties() { + return (S == STRING_LEFT || S == STRING_LEFT_RESTRICT ? + kLeftSemiring : kRightSemiring) | kIdempotent; + } + + // NB: This needs to be uncommented only if default fails for this impl. + // StringWeight &operator=(const StringWeight &w); + + // These operations combined with the StringWeightIterator and + // StringWeightReverseIterator provide the access and mutation of + // the string internal elements. + + // Common initializer among constructors. + void Init() { first_ = 0; } + + // Clear existing StringWeight. + void Clear() { first_ = 0; rest_.clear(); } + + size_t Size() const { return first_ ? rest_.size() + 1 : 0; } + + void PushFront(L l) { + if (first_) + rest_.push_front(first_); + first_ = l; + } + + void PushBack(L l) { + if (!first_) + first_ = l; + else + rest_.push_back(l); + } + + private: + L first_; // first label in string (0 if empty) + list rest_; // remaining labels in string +}; + + +// Traverses string in forward direction. +template +class StringWeightIterator { + public: + explicit StringWeightIterator(const StringWeight& w) + : first_(w.first_), rest_(w.rest_), init_(true), + iter_(rest_.begin()) {} + + bool Done() const { + if (init_) return first_ == 0; + else return iter_ == rest_.end(); + } + + const L& Value() const { return init_ ? first_ : *iter_; } + + void Next() { + if (init_) init_ = false; + else ++iter_; + } + + void Reset() { + init_ = true; + iter_ = rest_.begin(); + } + + private: + const L &first_; + const list &rest_; + bool init_; // in the initialized state? + typename list::const_iterator iter_; + + DISALLOW_COPY_AND_ASSIGN(StringWeightIterator); +}; + + +// Traverses string in backward direction. +template +class StringWeightReverseIterator { + public: + explicit StringWeightReverseIterator(const StringWeight& w) + : first_(w.first_), rest_(w.rest_), fin_(first_ == 0), + iter_(rest_.rbegin()) {} + + bool Done() const { return fin_; } + + const L& Value() const { return iter_ == rest_.rend() ? first_ : *iter_; } + + void Next() { + if (iter_ == rest_.rend()) fin_ = true; + else ++iter_; + } + + void Reset() { + fin_ = false; + iter_ = rest_.rbegin(); + } + + private: + const L &first_; + const list &rest_; + bool fin_; // in the final state? + typename list::const_reverse_iterator iter_; + + DISALLOW_COPY_AND_ASSIGN(StringWeightReverseIterator); +}; + + +// StringWeight member functions follow that require +// StringWeightIterator or StringWeightReverseIterator. + +template +inline istream &StringWeight::Read(istream &strm) { + Clear(); + int32 size; + ReadType(strm, &size); + for (int i = 0; i < size; ++i) { + L label; + ReadType(strm, &label); + PushBack(label); + } + return strm; +} + +template +inline ostream &StringWeight::Write(ostream &strm) const { + int32 size = Size(); + WriteType(strm, size); + for (StringWeightIterator iter(*this); !iter.Done(); iter.Next()) { + L label = iter.Value(); + WriteType(strm, label); + } + return strm; +} + +template +inline bool StringWeight::Member() const { + if (Size() != 1) + return true; + StringWeightIterator iter(*this); + return iter.Value() != kStringBad; +} + +template +inline typename StringWeight::ReverseWeight +StringWeight::Reverse() const { + ReverseWeight rw; + for (StringWeightIterator iter(*this); !iter.Done(); iter.Next()) + rw.PushFront(iter.Value()); + return rw; +} + +template +inline size_t StringWeight::Hash() const { + size_t h = 0; + for (StringWeightIterator iter(*this); !iter.Done(); iter.Next()) + h ^= h<<1 ^ iter.Value(); + return h; +} + +// NB: This needs to be uncommented only if default fails for this the impl. +// +// template +// inline StringWeight +// &StringWeight::operator=(const StringWeight &w) { +// if (this != &w) { +// Clear(); +// for (StringWeightIterator iter(w); !iter.Done(); iter.Next()) +// PushBack(iter.Value()); +// } +// return *this; +// } + +template +inline bool operator==(const StringWeight &w1, + const StringWeight &w2) { + if (w1.Size() != w2.Size()) + return false; + + StringWeightIterator iter1(w1); + StringWeightIterator iter2(w2); + + for (; !iter1.Done() ; iter1.Next(), iter2.Next()) + if (iter1.Value() != iter2.Value()) + return false; + + return true; +} + +template +inline bool operator!=(const StringWeight &w1, + const StringWeight &w2) { + return !(w1 == w2); +} + +template +inline bool ApproxEqual(const StringWeight &w1, + const StringWeight &w2, + float delta = kDelta) { + return w1 == w2; +} + +template +inline ostream &operator<<(ostream &strm, const StringWeight &w) { + StringWeightIterator iter(w); + if (iter.Done()) + return strm << "Epsilon"; + else if (iter.Value() == kStringInfinity) + return strm << "Infinity"; + else if (iter.Value() == kStringBad) + return strm << "BadString"; + else + for (size_t i = 0; !iter.Done(); ++i, iter.Next()) { + if (i > 0) + strm << kStringSeparator; + strm << iter.Value(); + } + return strm; +} + +template +inline istream &operator>>(istream &strm, StringWeight &w) { + string s; + strm >> s; + if (s == "Infinity") { + w = StringWeight::Zero(); + } else if (s == "Epsilon") { + w = StringWeight::One(); + } else { + w.Clear(); + char *p = 0; + for (const char *cs = s.c_str(); !p || *p != '\0'; cs = p + 1) { + int l = strtoll(cs, &p, 10); + if (p == cs || (*p != 0 && *p != kStringSeparator)) { + strm.clear(std::ios::badbit); + break; + } + w.PushBack(l); + } + } + return strm; +} + + +// Default is for the restricted left and right semirings. String +// equality is required (for non-Zero() input. This restriction +// is used in e.g. Determinize to ensure functional input. +template inline StringWeight +Plus(const StringWeight &w1, + const StringWeight &w2) { + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + if (w1 == StringWeight::Zero()) + return w2; + if (w2 == StringWeight::Zero()) + return w1; + + if (w1 != w2) { + FSTERROR() << "StringWeight::Plus: unequal arguments " + << "(non-functional FST?)" + << " w1 = " << w1 + << " w2 = " << w2; + return StringWeight::NoWeight(); + } + + return w1; +} + + +// Longest common prefix for left string semiring. +template inline StringWeight +Plus(const StringWeight &w1, + const StringWeight &w2) { + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + if (w1 == StringWeight::Zero()) + return w2; + if (w2 == StringWeight::Zero()) + return w1; + + StringWeight sum; + StringWeightIterator iter1(w1); + StringWeightIterator iter2(w2); + for (; !iter1.Done() && !iter2.Done() && iter1.Value() == iter2.Value(); + iter1.Next(), iter2.Next()) + sum.PushBack(iter1.Value()); + return sum; +} + + +// Longest common suffix for right string semiring. +template inline StringWeight +Plus(const StringWeight &w1, + const StringWeight &w2) { + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + if (w1 == StringWeight::Zero()) + return w2; + if (w2 == StringWeight::Zero()) + return w1; + + StringWeight sum; + StringWeightReverseIterator iter1(w1); + StringWeightReverseIterator iter2(w2); + for (; !iter1.Done() && !iter2.Done() && iter1.Value() == iter2.Value(); + iter1.Next(), iter2.Next()) + sum.PushFront(iter1.Value()); + return sum; +} + + +template +inline StringWeight Times(const StringWeight &w1, + const StringWeight &w2) { + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + if (w1 == StringWeight::Zero() || w2 == StringWeight::Zero()) + return StringWeight::Zero(); + + StringWeight prod(w1); + for (StringWeightIterator iter(w2); !iter.Done(); iter.Next()) + prod.PushBack(iter.Value()); + + return prod; +} + + +// Default is for left division in the left string and the +// left restricted string semirings. +template inline StringWeight +Divide(const StringWeight &w1, + const StringWeight &w2, + DivideType typ) { + + if (typ != DIVIDE_LEFT) { + FSTERROR() << "StringWeight::Divide: only left division is defined " + << "for the " << StringWeight::Type() << " semiring"; + return StringWeight::NoWeight(); + } + + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + + if (w2 == StringWeight::Zero()) + return StringWeight(kStringBad); + else if (w1 == StringWeight::Zero()) + return StringWeight::Zero(); + + StringWeight div; + StringWeightIterator iter(w1); + for (int i = 0; !iter.Done(); iter.Next(), ++i) { + if (i >= w2.Size()) + div.PushBack(iter.Value()); + } + return div; +} + + +// Right division in the right string semiring. +template inline StringWeight +Divide(const StringWeight &w1, + const StringWeight &w2, + DivideType typ) { + + if (typ != DIVIDE_RIGHT) { + FSTERROR() << "StringWeight::Divide: only right division is defined " + << "for the right string semiring"; + return StringWeight::NoWeight(); + } + + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + + if (w2 == StringWeight::Zero()) + return StringWeight(kStringBad); + else if (w1 == StringWeight::Zero()) + return StringWeight::Zero(); + + StringWeight div; + StringWeightReverseIterator iter(w1); + for (int i = 0; !iter.Done(); iter.Next(), ++i) { + if (i >= w2.Size()) + div.PushFront(iter.Value()); + } + return div; +} + + +// Right division in the right restricted string semiring. +template inline StringWeight +Divide(const StringWeight &w1, + const StringWeight &w2, + DivideType typ) { + + if (typ != DIVIDE_RIGHT) { + FSTERROR() << "StringWeight::Divide: only right division is defined " + << "for the right restricted string semiring"; + return StringWeight::NoWeight(); + } + + if (!w1.Member() || !w2.Member()) + return StringWeight::NoWeight(); + + if (w2 == StringWeight::Zero()) + return StringWeight(kStringBad); + else if (w1 == StringWeight::Zero()) + return StringWeight::Zero(); + + StringWeight div; + StringWeightReverseIterator iter(w1); + for (int i = 0; !iter.Done(); iter.Next(), ++i) { + if (i >= w2.Size()) + div.PushFront(iter.Value()); + } + return div; +} + + +// Product of string weight and an arbitray weight. +template +struct GallicWeight : public ProductWeight, W> { + typedef GallicWeight + ReverseWeight; + + GallicWeight() {} + + GallicWeight(StringWeight w1, W w2) + : ProductWeight, W>(w1, w2) {} + + explicit GallicWeight(const string &s, int *nread = 0) + : ProductWeight, W>(s, nread) {} + + GallicWeight(const ProductWeight, W> &w) + : ProductWeight, W>(w) {} +}; + +} // namespace fst + +#endif // FST_LIB_STRING_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/string.h b/extlibs/openfstwin-1.3.1/include/fst/string.h new file mode 100755 index 00000000000..d51182e7938 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/string.h @@ -0,0 +1,248 @@ + +// string.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Utilities to convert strings into FSTs. +// + +#ifndef FST_LIB_STRING_H_ +#define FST_LIB_STRING_H_ + +#include +#include +#include + +DECLARE_string(fst_field_separator); + +namespace fst { + +// Functor compiling a string in an FST +template +class StringCompiler { + public: + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + + enum TokenType { SYMBOL = 1, BYTE = 2, UTF8 = 3 }; + + StringCompiler(TokenType type, const SymbolTable *syms = 0, + Label unknown_label = kNoLabel, + bool allow_negative = false) + : token_type_(type), syms_(syms), unknown_label_(unknown_label), + allow_negative_(allow_negative) {} + + // Compile string 's' into FST 'fst'. + template + bool operator()(const string &s, F *fst) const { + vector *fst) const { + fst->DeleteStates(); + while (fst->NumStates() <= labels.size()) + fst->AddState(); + for (size_t i = 0; i < labels.size(); ++i) + fst->AddArc(i, Arc(labels[i], labels[i], Weight::One(), i + 1)); + fst->SetStart(0); + fst->SetFinal(labels.size(), Weight::One()); + } + + template + void Compile(const vector &fst, string *output) { + bool is_a_string = FstToLabels(fst); + if (!is_a_string) { + VLOG(1) << "StringPrinter::operator(): Fst is not a string."; + return false; + } + + output->clear(); + + if (token_type_ == SYMBOL) { + stringstream sstrm; + for (size_t i = 0; i < labels_.size(); ++i) { + if (i) + sstrm << *(FLAGS_fst_field_separator.rbegin()); + if (!PrintLabel(labels_[i], sstrm)) + return false; + } + *output = sstrm.str(); + } else if (token_type_ == BYTE) { + for (size_t i = 0; i < labels_.size(); ++i) { + output->push_back(labels_[i]); + } + } else if (token_type_ == UTF8) { + return LabelsToUTF8String(labels_, output); + } else { + VLOG(1) << "StringPrinter::operator(): Unknown token type: " + << token_type_; + return false; + } + return true; + } + + private: + bool FstToLabels(const Fst &fst) { + labels_.clear(); + + StateId s = fst.Start(); + if (s == kNoStateId) { + VLOG(2) << "StringPrinter::FstToLabels: Invalid starting state for " + << "string fst."; + return false; + } + + while (fst.Final(s) == Weight::Zero()) { + ArcIterator > aiter(fst, s); + if (aiter.Done()) { + VLOG(2) << "StringPrinter::FstToLabels: String fst traversal does " + << "not reach final state."; + return false; + } + + const A& arc = aiter.Value(); + labels_.push_back(arc.olabel); + + s = arc.nextstate; + if (s == kNoStateId) { + VLOG(2) << "StringPrinter::FstToLabels: Transition to invalid " + << "state."; + return false; + } + + aiter.Next(); + if (!aiter.Done()) { + VLOG(2) << "StringPrinter::FstToLabels: State with multiple " + << "outgoing arcs found."; + return false; + } + } + + return true; + } + + bool PrintLabel(Label lab, ostream& ostrm) { + if (syms_) { + string symbol = syms_->Find(lab); + if (symbol == "") { + VLOG(2) << "StringPrinter::PrintLabel: Integer " << lab << " is not " + << "mapped to any textual symbol, symbol table = " + << syms_->Name(); + return false; + } + ostrm << symbol; + } else { + ostrm << lab; + } + return true; + } + + TokenType token_type_; // Token type: symbol, byte or utf8 encoded + const SymbolTable *syms_; // Symbol table used when token type is symbol + vector { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + typedef basic_string &fst, const SynchronizeFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()) { + SetType("synchronize"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(SynchronizeProperties(props), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + SynchronizeFstImpl(const SynchronizeFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)) { + SetType("synchronize"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~SynchronizeFstImpl() { + delete fst_; + // Extract pointers from the hash set + vector strings; + typename StringSet::iterator it = string_set_.begin(); + for (; it != string_set_.end(); ++it) + strings.push_back(*it); + // Free the extracted pointers + for (size_t i = 0; i < strings.size(); ++i) + delete strings[i]; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + const String *empty = FindString(new String()); + StateId start = FindState(Element(fst_->Start(), empty, empty)); + SetStart(start); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + const Element &e = elements_[s]; + Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state); + if ((w != Weight::Zero()) && (e.istring)->empty() && (e.ostring)->empty()) + SetFinal(s, w); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + // Returns the first character of the string obtained by + // concatenating s and l. + Label Car(const String *s, Label l = 0) const { + if (!s->empty()) + return (*s)[0]; + else + return l; + } + + // Computes the residual string obtained by removing the first + // character in the concatenation of s and l. + const String *Cdr(const String *s, Label l = 0) { + String *r = new String(); + for (int i = 1; i < s->size(); ++i) + r->push_back((*s)[i]); + if (l && !(s->empty())) r->push_back(l); + return FindString(r); + } + + // Computes the concatenation of s and l. + const String *Concat(const String *s, Label l = 0) { + String *r = new String(); + for (int i = 0; i < s->size(); ++i) + r->push_back((*s)[i]); + if (l) r->push_back(l); + return FindString(r); + } + + // Tests if the concatenation of s and l is empty + bool Empty(const String *s, Label l = 0) const { + if (s->empty()) + return l == 0; + else + return false; + } + + // Finds the string pointed by s in the hash set. Transfers the + // pointer ownership to the hash set. + const String *FindString(const String *s) { + typename StringSet::iterator it = string_set_.find(s); + if (it != string_set_.end()) { + delete s; + return (*it); + } else { + string_set_.insert(s); + return s; + } + } + + // Finds state corresponding to an element. Creates new state + // if element not found. + StateId FindState(const Element &e) { + typename ElementMap::iterator eit = element_map_.find(e); + if (eit != element_map_.end()) { + return (*eit).second; + } else { + StateId s = elements_.size(); + elements_.push_back(e); + element_map_.insert(pair(e, s)); + return s; + } + } + + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void Expand(StateId s) { + Element e = elements_[s]; + + if (e.state != kNoStateId) + for (ArcIterator< Fst > ait(*fst_, e.state); + !ait.Done(); + ait.Next()) { + const A &arc = ait.Value(); + if (!Empty(e.istring, arc.ilabel) && !Empty(e.ostring, arc.olabel)) { + const String *istring = Cdr(e.istring, arc.ilabel); + const String *ostring = Cdr(e.ostring, arc.olabel); + StateId d = FindState(Element(arc.nextstate, istring, ostring)); + PushArc(s, Arc(Car(e.istring, arc.ilabel), + Car(e.ostring, arc.olabel), arc.weight, d)); + } else { + const String *istring = Concat(e.istring, arc.ilabel); + const String *ostring = Concat(e.ostring, arc.olabel); + StateId d = FindState(Element(arc.nextstate, istring, ostring)); + PushArc(s, Arc(0 , 0, arc.weight, d)); + } + } + + Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state); + if ((w != Weight::Zero()) && + ((e.istring)->size() + (e.ostring)->size() > 0)) { + const String *istring = Cdr(e.istring); + const String *ostring = Cdr(e.ostring); + StateId d = FindState(Element(kNoStateId, istring, ostring)); + PushArc(s, Arc(Car(e.istring), Car(e.ostring), w, d)); + } + SetArcs(s); + } + + private: + // Equality function for Elements, assume strings have been hashed. + class ElementEqual { + public: + bool operator()(const Element &x, const Element &y) const { + return x.state == y.state && + x.istring == y.istring && + x.ostring == y.ostring; + } + }; + + // Hash function for Elements to Fst states. + class ElementKey { + public: + size_t operator()(const Element &x) const { + size_t key = x.state; + key = (key << 1) ^ (x.istring)->size(); + for (size_t i = 0; i < (x.istring)->size(); ++i) + key = (key << 1) ^ (*x.istring)[i]; + key = (key << 1) ^ (x.ostring)->size(); + for (size_t i = 0; i < (x.ostring)->size(); ++i) + key = (key << 1) ^ (*x.ostring)[i]; + return key; + } + }; + + // Equality function for strings + class StringEqual { + public: + bool operator()(const String * const &x, const String * const &y) const { + if (x->size() != y->size()) return false; + for (size_t i = 0; i < x->size(); ++i) + if ((*x)[i] != (*y)[i]) return false; + return true; + } + }; + + // Hash function for set of strings + class StringKey{ + public: + size_t operator()(const String * const & x) const { + size_t key = x->size(); + for (size_t i = 0; i < x->size(); ++i) + key = (key << 1) ^ (*x)[i]; + return key; + } + }; + + + typedef unordered_map ElementMap; + typedef unordered_set StringSet; + + const Fst *fst_; + vector elements_; // mapping Fst state to Elements + ElementMap element_map_; // mapping Elements to Fst state + StringSet string_set_; + + void operator=(const SynchronizeFstImpl &); // disallow +}; + + +// Synchronizes a transducer. This version is a delayed Fst. The +// result will be an equivalent FST that has the property that during +// the traversal of a path, the delay is either zero or strictly +// increasing, where the delay is the difference between the number of +// non-epsilon output labels and input labels along the path. +// +// For the algorithm to terminate, the input transducer must have +// bounded delay, i.e., the delay of every cycle must be zero. +// +// Complexity: +// - A has bounded delay: exponential +// - A does not have bounded delay: does not terminate +// +// References: +// - Mehryar Mohri. Edit-Distance of Weighted Automata: General +// Definitions and Algorithms, International Journal of Computer +// Science, 14(6): 957-982 (2003). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class SynchronizeFst : public ImplToFst< SynchronizeFstImpl > { + public: + friend class ArcIterator< SynchronizeFst >; + friend class StateIterator< SynchronizeFst >; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef SynchronizeFstImpl Impl; + + SynchronizeFst(const Fst &fst) + : ImplToFst(new Impl(fst, SynchronizeFstOptions())) {} + + SynchronizeFst(const Fst &fst, const SynchronizeFstOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + SynchronizeFst(const SynchronizeFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this SynchronizeFst. See Fst<>::Copy() for further doc. + virtual SynchronizeFst *Copy(bool safe = false) const { + return new SynchronizeFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const SynchronizeFst &fst); // Disallow +}; + + +// Specialization for SynchronizeFst. +template +class StateIterator< SynchronizeFst > + : public CacheStateIterator< SynchronizeFst > { + public: + explicit StateIterator(const SynchronizeFst &fst) + : CacheStateIterator< SynchronizeFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for SynchronizeFst. +template +class ArcIterator< SynchronizeFst > + : public CacheArcIterator< SynchronizeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const SynchronizeFst &fst, StateId s) + : CacheArcIterator< SynchronizeFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void SynchronizeFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< SynchronizeFst >(*this); +} + + + +// Synchronizes a transducer. This version writes the synchronized +// result to a MutableFst. The result will be an equivalent FST that +// has the property that during the traversal of a path, the delay is +// either zero or strictly increasing, where the delay is the +// difference between the number of non-epsilon output labels and +// input labels along the path. +// +// For the algorithm to terminate, the input transducer must have +// bounded delay, i.e., the delay of every cycle must be zero. +// +// Complexity: +// - A has bounded delay: exponential +// - A does not have bounded delay: does not terminate +// +// References: +// - Mehryar Mohri. Edit-Distance of Weighted Automata: General +// Definitions and Algorithms, International Journal of Computer +// Science, 14(6): 957-982 (2003). +template +void Synchronize(const Fst &ifst, MutableFst *ofst) { + SynchronizeFstOptions opts; + opts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = SynchronizeFst(ifst, opts); +} + +} // namespace fst + +#endif // FST_LIB_SYNCHRONIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/synchronize.h.bak b/extlibs/openfstwin-1.3.1/include/fst/synchronize.h.bak new file mode 100755 index 00000000000..9582926ee4e --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/synchronize.h.bak @@ -0,0 +1,457 @@ +// synchronize.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google.com (Cyril Allauzen) +// +// \file +// Synchronize an FST with bounded delay. + +#ifndef FST_LIB_SYNCHRONIZE_H__ +#define FST_LIB_SYNCHRONIZE_H__ + +#include +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +#include +using std::pair; using std::make_pair; +#include +using std::vector; + +#include +#include + + +namespace fst { + +typedef CacheOptions SynchronizeFstOptions; + + +// Implementation class for SynchronizeFst +template +class SynchronizeFstImpl + : public CacheImpl { + public: + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + + using CacheBaseImpl< CacheState >::PushArc; + using CacheBaseImpl< CacheState >::HasArcs; + using CacheBaseImpl< CacheState >::HasFinal; + using CacheBaseImpl< CacheState >::HasStart; + using CacheBaseImpl< CacheState >::SetArcs; + using CacheBaseImpl< CacheState >::SetFinal; + using CacheBaseImpl< CacheState >::SetStart; + + typedef A Arc; + typedef typename A::Label Label; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + typedef basic_string &fst, const SynchronizeFstOptions &opts) + : CacheImpl(opts), fst_(fst.Copy()) { + SetType("synchronize"); + uint64 props = fst.Properties(kFstProperties, false); + SetProperties(SynchronizeProperties(props), kCopyProperties); + + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + } + + SynchronizeFstImpl(const SynchronizeFstImpl &impl) + : CacheImpl(impl), + fst_(impl.fst_->Copy(true)) { + SetType("synchronize"); + SetProperties(impl.Properties(), kCopyProperties); + SetInputSymbols(impl.InputSymbols()); + SetOutputSymbols(impl.OutputSymbols()); + } + + ~SynchronizeFstImpl() { + delete fst_; + // Extract pointers from the hash set + vector strings; + typename StringSet::iterator it = string_set_.begin(); + for (; it != string_set_.end(); ++it) + strings.push_back(*it); + // Free the extracted pointers + for (size_t i = 0; i < strings.size(); ++i) + delete strings[i]; + } + + StateId Start() { + if (!HasStart()) { + StateId s = fst_->Start(); + if (s == kNoStateId) + return kNoStateId; + const String *empty = FindString(new String()); + StateId start = FindState(Element(fst_->Start(), empty, empty)); + SetStart(start); + } + return CacheImpl::Start(); + } + + Weight Final(StateId s) { + if (!HasFinal(s)) { + const Element &e = elements_[s]; + Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state); + if ((w != Weight::Zero()) && (e.istring)->empty() && (e.ostring)->empty()) + SetFinal(s, w); + else + SetFinal(s, Weight::Zero()); + } + return CacheImpl::Final(s); + } + + size_t NumArcs(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumArcs(s); + } + + size_t NumInputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumInputEpsilons(s); + } + + size_t NumOutputEpsilons(StateId s) { + if (!HasArcs(s)) + Expand(s); + return CacheImpl::NumOutputEpsilons(s); + } + + uint64 Properties() const { return Properties(kFstProperties); } + + // Set error if found; return FST impl properties. + uint64 Properties(uint64 mask) const { + if ((mask & kError) && fst_->Properties(kError, false)) + SetProperties(kError, kError); + return FstImpl::Properties(mask); + } + + void InitArcIterator(StateId s, ArcIteratorData *data) { + if (!HasArcs(s)) + Expand(s); + CacheImpl::InitArcIterator(s, data); + } + + // Returns the first character of the string obtained by + // concatenating s and l. + Label Car(const String *s, Label l = 0) const { + if (!s->empty()) + return (*s)[0]; + else + return l; + } + + // Computes the residual string obtained by removing the first + // character in the concatenation of s and l. + const String *Cdr(const String *s, Label l = 0) { + String *r = new String(); + for (int i = 1; i < s->size(); ++i) + r->push_back((*s)[i]); + if (l && !(s->empty())) r->push_back(l); + return FindString(r); + } + + // Computes the concatenation of s and l. + const String *Concat(const String *s, Label l = 0) { + String *r = new String(); + for (int i = 0; i < s->size(); ++i) + r->push_back((*s)[i]); + if (l) r->push_back(l); + return FindString(r); + } + + // Tests if the concatenation of s and l is empty + bool Empty(const String *s, Label l = 0) const { + if (s->empty()) + return l == 0; + else + return false; + } + + // Finds the string pointed by s in the hash set. Transfers the + // pointer ownership to the hash set. + const String *FindString(const String *s) { + typename StringSet::iterator it = string_set_.find(s); + if (it != string_set_.end()) { + delete s; + return (*it); + } else { + string_set_.insert(s); + return s; + } + } + + // Finds state corresponding to an element. Creates new state + // if element not found. + StateId FindState(const Element &e) { + typename ElementMap::iterator eit = element_map_.find(e); + if (eit != element_map_.end()) { + return (*eit).second; + } else { + StateId s = elements_.size(); + elements_.push_back(e); + element_map_.insert(pair(e, s)); + return s; + } + } + + + // Computes the outgoing transitions from a state, creating new destination + // states as needed. + void Expand(StateId s) { + Element e = elements_[s]; + + if (e.state != kNoStateId) + for (ArcIterator< Fst > ait(*fst_, e.state); + !ait.Done(); + ait.Next()) { + const A &arc = ait.Value(); + if (!Empty(e.istring, arc.ilabel) && !Empty(e.ostring, arc.olabel)) { + const String *istring = Cdr(e.istring, arc.ilabel); + const String *ostring = Cdr(e.ostring, arc.olabel); + StateId d = FindState(Element(arc.nextstate, istring, ostring)); + PushArc(s, Arc(Car(e.istring, arc.ilabel), + Car(e.ostring, arc.olabel), arc.weight, d)); + } else { + const String *istring = Concat(e.istring, arc.ilabel); + const String *ostring = Concat(e.ostring, arc.olabel); + StateId d = FindState(Element(arc.nextstate, istring, ostring)); + PushArc(s, Arc(0 , 0, arc.weight, d)); + } + } + + Weight w = e.state == kNoStateId ? Weight::One() : fst_->Final(e.state); + if ((w != Weight::Zero()) && + ((e.istring)->size() + (e.ostring)->size() > 0)) { + const String *istring = Cdr(e.istring); + const String *ostring = Cdr(e.ostring); + StateId d = FindState(Element(kNoStateId, istring, ostring)); + PushArc(s, Arc(Car(e.istring), Car(e.ostring), w, d)); + } + SetArcs(s); + } + + private: + // Equality function for Elements, assume strings have been hashed. + class ElementEqual { + public: + bool operator()(const Element &x, const Element &y) const { + return x.state == y.state && + x.istring == y.istring && + x.ostring == y.ostring; + } + }; + + // Hash function for Elements to Fst states. + class ElementKey { + public: + size_t operator()(const Element &x) const { + size_t key = x.state; + key = (key << 1) ^ (x.istring)->size(); + for (size_t i = 0; i < (x.istring)->size(); ++i) + key = (key << 1) ^ (*x.istring)[i]; + key = (key << 1) ^ (x.ostring)->size(); + for (size_t i = 0; i < (x.ostring)->size(); ++i) + key = (key << 1) ^ (*x.ostring)[i]; + return key; + } + }; + + // Equality function for strings + class StringEqual { + public: + bool operator()(const String * const &x, const String * const &y) const { + if (x->size() != y->size()) return false; + for (size_t i = 0; i < x->size(); ++i) + if ((*x)[i] != (*y)[i]) return false; + return true; + } + }; + + // Hash function for set of strings + class StringKey{ + public: + size_t operator()(const String * const & x) const { + size_t key = x->size(); + for (size_t i = 0; i < x->size(); ++i) + key = (key << 1) ^ (*x)[i]; + return key; + } + }; + + + typedef unordered_map ElementMap; + typedef unordered_set StringSet; + + const Fst *fst_; + vector elements_; // mapping Fst state to Elements + ElementMap element_map_; // mapping Elements to Fst state + StringSet string_set_; + + void operator=(const SynchronizeFstImpl &); // disallow +}; + + +// Synchronizes a transducer. This version is a delayed Fst. The +// result will be an equivalent FST that has the property that during +// the traversal of a path, the delay is either zero or strictly +// increasing, where the delay is the difference between the number of +// non-epsilon output labels and input labels along the path. +// +// For the algorithm to terminate, the input transducer must have +// bounded delay, i.e., the delay of every cycle must be zero. +// +// Complexity: +// - A has bounded delay: exponential +// - A does not have bounded delay: does not terminate +// +// References: +// - Mehryar Mohri. Edit-Distance of Weighted Automata: General +// Definitions and Algorithms, International Journal of Computer +// Science, 14(6): 957-982 (2003). +// +// This class attaches interface to implementation and handles +// reference counting, delegating most methods to ImplToFst. +template +class SynchronizeFst : public ImplToFst< SynchronizeFstImpl > { + public: + friend class ArcIterator< SynchronizeFst >; + friend class StateIterator< SynchronizeFst >; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + typedef CacheState State; + typedef SynchronizeFstImpl Impl; + + SynchronizeFst(const Fst &fst) + : ImplToFst(new Impl(fst, SynchronizeFstOptions())) {} + + SynchronizeFst(const Fst &fst, const SynchronizeFstOptions &opts) + : ImplToFst(new Impl(fst, opts)) {} + + // See Fst<>::Copy() for doc. + SynchronizeFst(const SynchronizeFst &fst, bool safe = false) + : ImplToFst(fst, safe) {} + + // Get a copy of this SynchronizeFst. See Fst<>::Copy() for further doc. + virtual SynchronizeFst *Copy(bool safe = false) const { + return new SynchronizeFst(*this, safe); + } + + virtual inline void InitStateIterator(StateIteratorData *data) const; + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + private: + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst::GetImpl(); } + + void operator=(const SynchronizeFst &fst); // Disallow +}; + + +// Specialization for SynchronizeFst. +template +class StateIterator< SynchronizeFst > + : public CacheStateIterator< SynchronizeFst > { + public: + explicit StateIterator(const SynchronizeFst &fst) + : CacheStateIterator< SynchronizeFst >(fst, fst.GetImpl()) {} +}; + + +// Specialization for SynchronizeFst. +template +class ArcIterator< SynchronizeFst > + : public CacheArcIterator< SynchronizeFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const SynchronizeFst &fst, StateId s) + : CacheArcIterator< SynchronizeFst >(fst.GetImpl(), s) { + if (!fst.GetImpl()->HasArcs(s)) + fst.GetImpl()->Expand(s); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + + +template inline +void SynchronizeFst::InitStateIterator(StateIteratorData *data) const +{ + data->base = new StateIterator< SynchronizeFst >(*this); +} + + + +// Synchronizes a transducer. This version writes the synchronized +// result to a MutableFst. The result will be an equivalent FST that +// has the property that during the traversal of a path, the delay is +// either zero or strictly increasing, where the delay is the +// difference between the number of non-epsilon output labels and +// input labels along the path. +// +// For the algorithm to terminate, the input transducer must have +// bounded delay, i.e., the delay of every cycle must be zero. +// +// Complexity: +// - A has bounded delay: exponential +// - A does not have bounded delay: does not terminate +// +// References: +// - Mehryar Mohri. Edit-Distance of Weighted Automata: General +// Definitions and Algorithms, International Journal of Computer +// Science, 14(6): 957-982 (2003). +template +void Synchronize(const Fst &ifst, MutableFst *ofst) { + SynchronizeFstOptions opts; + opts.gc_limit = 0; // Cache only the last state for fastest copy. + *ofst = SynchronizeFst(ifst, opts); +} + +} // namespace fst + +#endif // FST_LIB_SYNCHRONIZE_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/test-properties.h b/extlibs/openfstwin-1.3.1/include/fst/test-properties.h new file mode 100755 index 00000000000..38641b17ceb --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/test-properties.h @@ -0,0 +1,246 @@ +// test-properties.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions to manipulate and test property bits + +#ifndef FST_LIB_TEST_PROPERTIES_H__ +#define FST_LIB_TEST_PROPERTIES_H__ + +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; + +#include +#include + + +DECLARE_bool(fst_verify_properties); + +namespace fst { + +// For a binary property, the bit is always returned set. +// For a trinary (i.e. two-bit) property, both bits are +// returned set iff either corresponding input bit is set. +inline uint64 KnownProperties(uint64 props) { + return kBinaryProperties | (props & kTrinaryProperties) | + ((props & kPosTrinaryProperties) << 1) | + ((props & kNegTrinaryProperties) >> 1); +} + +// Tests compatibility between two sets of properties +inline bool CompatProperties(uint64 props1, uint64 props2) { + uint64 known_props1 = KnownProperties(props1); + uint64 known_props2 = KnownProperties(props2); + uint64 known_props = known_props1 & known_props2; + uint64 incompat_props = (props1 & known_props) ^ (props2 & known_props); + if (incompat_props) { + uint64 prop = 1; + for (int i = 0; i < 64; ++i, prop <<= 1) + if (prop & incompat_props) + LOG(ERROR) << "CompatProperties: mismatch: " << PropertyNames[i] + << ": props1 = " << (props1 & prop ? "true" : "false") + << ", props2 = " << (props2 & prop ? "true" : "false"); + return false; + } else { + return true; + } +} + +// Computes FST property values defined in properties.h. The value of +// each property indicated in the mask will be determined and returned +// (these will never be unknown here). In the course of determining +// the properties specifically requested in the mask, certain other +// properties may be determined (those with little additional expense) +// and their values will be returned as well. The complete set of +// known properties (whether true or false) determined by this +// operation will be assigned to the the value pointed to by KNOWN. +// If 'use_stored' is true, pre-computed FST properties may be used +// when possible. This routine is seldom called directly; instead it +// is used to implement fst.Properties(mask, true). +template +uint64 ComputeProperties(const Fst &fst, uint64 mask, uint64 *known, + bool use_stored) { + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + uint64 fst_props = fst.Properties(kFstProperties, false); // Fst-stored + + // Check stored FST properties first if allowed. + if (use_stored) { + uint64 known_props = KnownProperties(fst_props); + // If FST contains required info, return it. + if ((known_props & mask) == mask) { + *known = known_props; + return fst_props; + } + } + + // Compute (trinary) properties explicitly. + + // Initialize with binary properties (already known). + uint64 comp_props = fst_props & kBinaryProperties; + + // Compute these trinary properties with a DFS. We compute only those + // that need a DFS here, since we otherwise would like to avoid a DFS + // since its stack could grow large. + uint64 dfs_props = kCyclic | kAcyclic | kInitialCyclic | kInitialAcyclic | + kAccessible | kNotAccessible | + kCoAccessible | kNotCoAccessible; + if (mask & dfs_props) { + SccVisitor scc_visitor(&comp_props); + DfsVisit(fst, &scc_visitor); + } + + // Compute any remaining trinary properties via a state and arcs iterations + if (mask & ~(kBinaryProperties | dfs_props)) { + comp_props |= kAcceptor | kNoEpsilons | kNoIEpsilons | kNoOEpsilons | + kILabelSorted | kOLabelSorted | kUnweighted | kTopSorted | kString; + if (mask & (kIDeterministic | kNonIDeterministic)) + comp_props |= kIDeterministic; + if (mask & (kODeterministic | kNonODeterministic)) + comp_props |= kODeterministic; + + unordered_set &fst) { + finish_ = new vector; + *acyclic_ = true; + } + + bool InitState(StateId s, StateId r) { return true; } + + bool TreeArc(StateId s, const A &arc) { return true; } + + bool BackArc(StateId s, const A &arc) { return (*acyclic_ = false); } + + bool ForwardOrCrossArc(StateId s, const A &arc) { return true; } + + void FinishState(StateId s, StateId p, const A *) { finish_->push_back(s); } + + void FinishVisit() { + if (*acyclic_) { + order_->clear(); + for (StateId s = 0; s < finish_->size(); ++s) + order_->push_back(kNoStateId); + for (StateId s = 0; s < finish_->size(); ++s) + (*order_)[(*finish_)[finish_->size() - s - 1]] = s; + } + delete finish_; + } + + private: + vector *order_; + bool *acyclic_; + vector *finish_; // states in finishing-time order +}; + + +// Topologically sorts its input if acyclic, modifying it. Otherwise, +// the input is unchanged. When sorted, all transitions are from +// lower to higher state IDs. +// +// Complexity: +// - Time: O(V + E) +// - Space: O(V + E) +// where V = # of states and E = # of arcs. +template +bool TopSort(MutableFst *fst) { + typedef typename Arc::StateId StateId; + + vector order; + bool acyclic; + + TopOrderVisitor top_order_visitor(&order, &acyclic); + DfsVisit(*fst, &top_order_visitor); + + if (acyclic) { + StateSort(fst, order); + fst->SetProperties(kAcyclic | kInitialAcyclic | kTopSorted, + kAcyclic | kInitialAcyclic | kTopSorted); + } else { + fst->SetProperties(kCyclic | kNotTopSorted, kCyclic | kNotTopSorted); + } + return acyclic; +} + +} // namespace fst + +#endif // FST_LIB_TOPSORT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/tuple-weight.h b/extlibs/openfstwin-1.3.1/include/fst/tuple-weight.h new file mode 100755 index 00000000000..184026c0c6d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/tuple-weight.h @@ -0,0 +1,332 @@ +// tuple-weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: allauzen@google (Cyril Allauzen) +// +// \file +// Tuple weight set operation definitions. + +#ifndef FST_LIB_TUPLE_WEIGHT_H__ +#define FST_LIB_TUPLE_WEIGHT_H__ + +#include +#include +using std::vector; + +#include + + +DECLARE_string(fst_weight_parentheses); +DECLARE_string(fst_weight_separator); + +namespace fst { + +template class TupleWeight; +template +istream &operator>>(istream &strm, TupleWeight &w); + +// n-tuple weight, element of the n-th catersian power of W +template +class TupleWeight { + public: + typedef TupleWeight ReverseWeight; + + TupleWeight() {} + + TupleWeight(const TupleWeight &w) { + for (size_t i = 0; i < n; ++i) + values_[i] = w.values_[i]; + } + + template + TupleWeight(Iterator begin, Iterator end) { + for (Iterator iter = begin; iter != end; ++iter) + values_[iter - begin] = *iter; + } + + TupleWeight(const W &w) { + for (size_t i = 0; i < n; ++i) + values_[i] = w; + } + + static const TupleWeight &Zero() { + static const TupleWeight zero(W::Zero()); + return zero; + } + + static const TupleWeight &One() { + static const TupleWeight one(W::One()); + return one; + } + + static const TupleWeight &NoWeight() { + static const TupleWeight no_weight(W::NoWeight()); + return no_weight; + } + + static unsigned int Length() { + return n; + } + + istream &Read(istream &strm) { + for (size_t i = 0; i < n; ++i) + values_[i].Read(strm); + return strm; + } + + ostream &Write(ostream &strm) const { + for (size_t i = 0; i < n; ++i) + values_[i].Write(strm); + return strm; + } + + TupleWeight &operator=(const TupleWeight &w) { + for (size_t i = 0; i < n; ++i) + values_[i] = w.values_[i]; + return *this; + } + + bool Member() const { + bool member = true; + for (size_t i = 0; i < n; ++i) + member = member && values_[i].Member(); + return member; + } + + size_t Hash() const { + uint64 hash = 0; + for (size_t i = 0; i < n; ++i) + hash = 5 * hash + values_[i].Hash(); + return size_t(hash); + } + + TupleWeight Quantize(float delta = kDelta) const { + TupleWeight w; + for (size_t i = 0; i < n; ++i) + w.values_[i] = values_[i].Quantize(delta); + return w; + } + + ReverseWeight Reverse() const { + TupleWeight w; + for (size_t i = 0; i < n; ++i) + w.values_[i] = values_[i].Reverse(); + return w; + } + + const W& Value(size_t i) const { return values_[i]; } + + void SetValue(size_t i, const W &w) { values_[i] = w; } + + protected: + // Reads TupleWeight when there are no parentheses around tuple terms + inline static istream &ReadNoParen(istream &strm, + TupleWeight &w, + char separator) { + int c; + do { + c = strm.get(); + } while (isspace(c)); + + for (size_t i = 0; i < n - 1; ++i) { + string s; + if (i) + c = strm.get(); + while (c != separator) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + c = strm.get(); + } + // read (i+1)-th element + istringstream sstrm(s); + W r = W::Zero(); + sstrm >> r; + w.SetValue(i, r); + } + + // read n-th element + W r = W::Zero(); + strm >> r; + w.SetValue(n - 1, r); + + return strm; + } + + // Reads TupleWeight when there are parentheses around tuple terms + inline static istream &ReadWithParen(istream &strm, + TupleWeight &w, + char separator, + char open_paren, + char close_paren) { + int c; + do { + c = strm.get(); + } while (isspace(c)); + + if (c != open_paren) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::badbit); + return strm; + } + + for (size_t i = 0; i < n - 1; ++i) { + // read (i+1)-th element + stack parens; + string s; + c = strm.get(); + while (c != separator || !parens.empty()) { + if (c == EOF) { + strm.clear(std::ios::badbit); + return strm; + } + s += c; + // if parens encountered before separator, they must be matched + if (c == open_paren) { + parens.push(1); + } else if (c == close_paren) { + // Fail for mismatched parens + if (parens.empty()) { + strm.clear(std::ios::failbit); + return strm; + } + parens.pop(); + } + c = strm.get(); + } + istringstream sstrm(s); + W r = W::Zero(); + sstrm >> r; + w.SetValue(i, r); + } + + // read n-th element + string s; + c = strm.get(); + while (c != EOF) { + s += c; + c = strm.get(); + } + if (s.empty() || *s.rbegin() != close_paren) { + FSTERROR() << " is fst_weight_parentheses flag set correcty? "; + strm.clear(std::ios::failbit); + return strm; + } + s.erase(s.size() - 1, 1); + istringstream sstrm(s); + W r = W::Zero(); + sstrm >> r; + w.SetValue(n - 1, r); + + return strm; + } + + + private: + W values_[n]; + + friend istream &operator>>(istream&, TupleWeight&); +}; + +template +inline bool operator==(const TupleWeight &w1, + const TupleWeight &w2) { + bool equal = true; + for (size_t i = 0; i < n; ++i) + equal = equal && (w1.Value(i) == w2.Value(i)); + return equal; +} + +template +inline bool operator!=(const TupleWeight &w1, + const TupleWeight &w2) { + bool not_equal = false; + for (size_t i = 0; (i < n) && !not_equal; ++i) + not_equal = not_equal || (w1.Value(i) != w2.Value(i)); + return not_equal; +} + +template +inline bool ApproxEqual(const TupleWeight &w1, + const TupleWeight &w2, + float delta = kDelta) { + bool approx_equal = true; + for (size_t i = 0; i < n; ++i) + approx_equal = approx_equal && + ApproxEqual(w1.Value(i), w2.Value(i), delta); + return approx_equal; +} + +template +inline ostream &operator<<(ostream &strm, const TupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + bool write_parens = false; + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + write_parens = true; + } + + if (write_parens) + strm << FLAGS_fst_weight_parentheses[0]; + for (size_t i = 0; i < n; ++i) { + if(i) + strm << separator; + strm << w.Value(i); + } + if (write_parens) + strm << FLAGS_fst_weight_parentheses[1]; + + return strm; +} + +template +inline istream &operator>>(istream &strm, TupleWeight &w) { + if(FLAGS_fst_weight_separator.size() != 1) { + FSTERROR() << "FLAGS_fst_weight_separator.size() is not equal to 1"; + strm.clear(std::ios::badbit); + return strm; + } + char separator = FLAGS_fst_weight_separator[0]; + + if (!FLAGS_fst_weight_parentheses.empty()) { + if (FLAGS_fst_weight_parentheses.size() != 2) { + FSTERROR() << "FLAGS_fst_weight_parentheses.size() is not equal to 2"; + strm.clear(std::ios::badbit); + return strm; + } + return TupleWeight::ReadWithParen( + strm, w, separator, FLAGS_fst_weight_parentheses[0], + FLAGS_fst_weight_parentheses[1]); + } else { + return TupleWeight::ReadNoParen(strm, w, separator); + } +} + + + +} // namespace fst + +#endif // FST_LIB_TUPLE_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/types.h b/extlibs/openfstwin-1.3.1/include/fst/types.h new file mode 100755 index 00000000000..8c4367a92f7 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/types.h @@ -0,0 +1,38 @@ +// types.h +// +// 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. +// +// Author: riley@google.com (Michael Riley) +// +// \file +// Various type definitions (mostly for Google compatibility). + +#include // for ssize_t +#include // *int*_t + +#include // for DISALLOW_COPY_AND_ASSIGN + +#ifndef FST_LIB_TYPES_H__ +#define FST_LIB_TYPES_H__ + +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; + +#endif // FST_LIB_TYPES_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/union-find.h b/extlibs/openfstwin-1.3.1/include/fst/union-find.h new file mode 100755 index 00000000000..c8633e022ff --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/union-find.h @@ -0,0 +1,110 @@ + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: wojciech@google.com (Wojciech Skut) +// +// \file Union-Find algorithm for dense sets of non-negative +// integers. Implemented using disjoint tree forests with rank +// heuristics and path compression. + +#ifndef __fst_union_find_inl_h__ +#define __fst_union_find_inl_h__ + +#include +#include +using std::vector; +#include + +namespace fst { + +// Union-Find algorithm for dense sets of non-negative integers +// (exact type: T). +template +class UnionFind { + public: + // Ctor: creates a disjoint set forest for the range [0;max). + // 'fail' is a value indicating that an element hasn't been + // initialized using MakeSet(...). The upper bound of the range + // can be reset (increased) using MakeSet(...). + UnionFind(T max, T fail) + : parent_(max, fail), rank_(max), fail_(fail) { } + + // Finds the representative of the set 'item' belongs to. + // Performs path compression if needed. + T FindSet(T item) { + if (item >= parent_.size() + || item == fail_ + || parent_[item] == fail_) return fail_; + + T *p = &parent_[item]; + for (; *p != item; item = *p, p = &parent_[item]) { + exec_stack_.push(p); + } + for (; ! exec_stack_.empty(); exec_stack_.pop()) { + *exec_stack_.top() = *p; + } + return *p; + } + + // Creates the (destructive) union of the sets x and y belong to. + void Union(T x, T y) { + Link(FindSet(x), FindSet(y)); + } + + // Initialization of an element: creates a singleton set containing + // 'item'. The range [0;max) is reset if item >= max. + T MakeSet(T item) { + if (item >= parent_.size()) { + // New value in parent_ should be initialized to fail_ + size_t nitem = item > 0 ? 2 * item : 2; + parent_.resize(nitem, fail_); + rank_.resize(nitem); + } + parent_[item] = item; + return item; + } + + // Initialization of all elements starting from 0 to max - 1 to distinct sets + void MakeAllSet(T max) { + parent_.resize(max); + for (T item = 0; item < max; ++item) { + parent_[item] = item; + } + } + + private: + vector parent_; // Parent nodes. + vector rank_; // Rank of an element = min. depth in tree. + T fail_; // Value indicating lookup failure. + stack exec_stack_; // Used for path compression. + + // Links trees rooted in 'x' and 'y'. + void Link(T x, T y) { + if (x == y) return; + + if (rank_[x] > rank_[y]) { + parent_[y] = x; + } else { + parent_[x] = y; + if (rank_[x] == rank_[y]) { + ++rank_[y]; + } + } + } + DISALLOW_COPY_AND_ASSIGN(UnionFind); +}; + +} // namespace fst + +#endif // __fst_union_find_inl_h__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/union.h b/extlibs/openfstwin-1.3.1/include/fst/union.h new file mode 100755 index 00000000000..176d574f53b --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/union.h @@ -0,0 +1,184 @@ +// union.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Functions and classes to compute the union of two FSTs. + +#ifndef FST_LIB_UNION_H__ +#define FST_LIB_UNION_H__ + +#include +using std::vector; +#include + +#include +#include + + +namespace fst { + +// Computes the union (sum) of two FSTs. This version writes the +// union to an output MurableFst. If A transduces string x to y with +// weight a and B transduces string w to v with weight b, then their +// union transduces x to y with weight a and w to v with weight b. +// +// Complexity: +// - Time: (V2 + E2) +// - Space: O(V2 + E2) +// where Vi = # of states and Ei = # of arcs of the ith FST. +template +void Union(MutableFst *fst1, const Fst &fst2) { + typedef typename Arc::StateId StateId; + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + + // Check that the symbol tables are compatible + if (!CompatSymbols(fst1->InputSymbols(), fst2.InputSymbols()) || + !CompatSymbols(fst1->OutputSymbols(), fst2.OutputSymbols())) { + FSTERROR() << "Union: input/output symbol tables of 1st argument " + << "do not match input/output symbol tables of 2nd argument"; + fst1->SetProperties(kError, kError); + return; + } + + StateId numstates1 = fst1->NumStates(); + bool initial_acyclic1 = fst1->Properties(kInitialAcyclic, true); + uint64 props1 = fst1->Properties(kFstProperties, false); + uint64 props2 = fst2.Properties(kFstProperties, false); + + StateId start2 = fst2.Start(); + if (start2 == kNoStateId) { + if (props2 & kError) fst1->SetProperties(kError, kError); + return; + } + + if (fst2.Properties(kExpanded, false)) { + fst1->ReserveStates( + numstates1 + CountStates(fst2) + (initial_acyclic1 ? 0 : 1)); + } + + for (StateIterator< Fst > siter(fst2); + !siter.Done(); + siter.Next()) { + StateId s1 = fst1->AddState(); + StateId s2 = siter.Value(); + fst1->SetFinal(s1, fst2.Final(s2)); + fst1->ReserveArcs(s1, fst2.NumArcs(s2)); + for (ArcIterator< Fst > aiter(fst2, s2); + !aiter.Done(); + aiter.Next()) { + Arc arc = aiter.Value(); + arc.nextstate += numstates1; + fst1->AddArc(s1, arc); + } + } + StateId start1 = fst1->Start(); + if (start1 == kNoStateId) { + fst1->SetStart(start2); + fst1->SetProperties(props2, kCopyProperties); + return; + } + + if (initial_acyclic1) { + fst1->AddArc(start1, Arc(0, 0, Weight::One(), start2 + numstates1)); + } else { + StateId nstart1 = fst1->AddState(); + fst1->SetStart(nstart1); + fst1->AddArc(nstart1, Arc(0, 0, Weight::One(), start1)); + fst1->AddArc(nstart1, Arc(0, 0, Weight::One(), start2 + numstates1)); + } + fst1->SetProperties(UnionProperties(props1, props2), kFstProperties); +} + + +// Computes the union of two FSTs; this version modifies its +// RationalFst argument. +template +void Union(RationalFst *fst1, const Fst &fst2) { + fst1->GetImpl()->AddUnion(fst2); +} + + +typedef RationalFstOptions UnionFstOptions; + + +// Computes the union (sum) of two FSTs. This version is a delayed +// Fst. If A transduces string x to y with weight a and B transduces +// string w to v with weight b, then their union transduces x to y +// with weight a and w to v with weight b. +// +// Complexity: +// - Time: O(v1 + e1 + v2 + e2) +// - Sapce: O(v1 + v2) +// where vi = # of states visited and ei = # of arcs visited of the +// ith FST. Constant time and space to visit an input state or arc +// is assumed and exclusive of caching. +template +class UnionFst : public RationalFst { + public: + using ImplToFst< RationalFstImpl >::GetImpl; + + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + UnionFst(const Fst &fst1, const Fst &fst2) { + GetImpl()->InitUnion(fst1, fst2); + } + + UnionFst(const Fst &fst1, const Fst &fst2, const UnionFstOptions &opts) + : RationalFst(opts) { + GetImpl()->InitUnion(fst1, fst2); + } + + // See Fst<>::Copy() for doc. + UnionFst(const UnionFst &fst, bool safe = false) + : RationalFst(fst, safe) {} + + // Get a copy of this UnionFst. See Fst<>::Copy() for further doc. + virtual UnionFst *Copy(bool safe = false) const { + return new UnionFst(*this, safe); + } +}; + + +// Specialization for UnionFst. +template +class StateIterator< UnionFst > : public StateIterator< RationalFst > { + public: + explicit StateIterator(const UnionFst &fst) + : StateIterator< RationalFst >(fst) {} +}; + + +// Specialization for UnionFst. +template +class ArcIterator< UnionFst > : public ArcIterator< RationalFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const UnionFst &fst, StateId s) + : ArcIterator< RationalFst >(fst, s) {} +}; + + +// Useful alias when using StdArc. +typedef UnionFst StdUnionFst; + +} // namespace fst + +#endif // FST_LIB_UNION_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/unordered_map.h b/extlibs/openfstwin-1.3.1/include/fst/unordered_map.h new file mode 100755 index 00000000000..e79534d8ce9 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/unordered_map.h @@ -0,0 +1,7 @@ +#ifdef _MSC_VER //Added Paul Dixon + #include + using std::unordered_map; +#else + #include + using std::tr1::unordered_map; +#endif diff --git a/extlibs/openfstwin-1.3.1/include/fst/unordered_set.h b/extlibs/openfstwin-1.3.1/include/fst/unordered_set.h new file mode 100755 index 00000000000..284ae9855dd --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/unordered_set.h @@ -0,0 +1,7 @@ +#ifdef _MSC_VER //Added Paul Dixon + #include + using std::unordered_set; +#else + #include + using std::tr1::unordered_set; +#endif diff --git a/extlibs/openfstwin-1.3.1/include/fst/util.h b/extlibs/openfstwin-1.3.1/include/fst/util.h new file mode 100755 index 00000000000..a40a48ca936 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/util.h @@ -0,0 +1,410 @@ +// util.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// FST utility inline definitions. + +#ifndef FST_LIB_UTIL_H__ +#define FST_LIB_UTIL_H__ + +#include //ChangedPD +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include //ChangedPD +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +#include +#include +#include +#include +#include +using std::vector; + + +#include +#include + +#include +#include +#include + +// +// UTILITY FOR ERROR HANDLING +// + +DECLARE_bool(fst_error_fatal); + +#define FSTERROR() (FLAGS_fst_error_fatal ? LOG(FATAL) : LOG(ERROR)) + +namespace fst { + +// +// UTILITIES FOR TYPE I/O +// + +// Read some types from an input stream. + +// Generic case. +template +inline istream &ReadType(istream &strm, T *t) { + return t->Read(strm); +} + +// Fixed size, contiguous memory read. +#define READ_POD_TYPE(T) \ +inline istream &ReadType(istream &strm, T *t) { \ + return strm.read(reinterpret_cast(t), sizeof(T)); \ +} + +READ_POD_TYPE(bool); +READ_POD_TYPE(char); +READ_POD_TYPE(signed char); +READ_POD_TYPE(unsigned char); +READ_POD_TYPE(short); +READ_POD_TYPE(unsigned short); +READ_POD_TYPE(int); +READ_POD_TYPE(unsigned int); +READ_POD_TYPE(long); +READ_POD_TYPE(unsigned long); +READ_POD_TYPE(long long); +READ_POD_TYPE(unsigned long long); +READ_POD_TYPE(float); +READ_POD_TYPE(double); + +// String case. +inline istream &ReadType(istream &strm, string *s) { + s->clear(); + int32 ns = 0; + strm.read(reinterpret_cast(&ns), sizeof(ns)); + for (int i = 0; i < ns; ++i) { + char c; + strm.read(&c, 1); + *s += c; + } + return strm; +} + +// Pair case. +template +inline istream &ReadType(istream &strm, pair *p) { + ReadType(strm, &p->first); + ReadType(strm, &p->second); + return strm; +} + +template +inline istream &ReadType(istream &strm, pair *p) { + ReadType(strm, const_cast(&p->first)); + ReadType(strm, &p->second); + return strm; +} + +// General case - no-op. +template +void StlReserve(C *c, int64 n) {} + +// Specialization for vectors. +template +void StlReserve(vector *c, int64 n) { + c->reserve(n); +} + +// STL sequence container. +#define READ_STL_SEQ_TYPE(C) \ +template \ +inline istream &ReadType(istream &strm, C *c) { \ + c->clear(); \ + int64 n = 0; \ + strm.read(reinterpret_cast(&n), sizeof(n)); \ + StlReserve(c, n); \ + for (ssize_t i = 0; i < n; ++i) { \ + typename C::value_type value; \ + ReadType(strm, &value); \ + c->insert(c->end(), value); \ + } \ + return strm; \ +} + +READ_STL_SEQ_TYPE(vector); +READ_STL_SEQ_TYPE(list); + +// STL associative container. +#define READ_STL_ASSOC_TYPE(C) \ +template \ +inline istream &ReadType(istream &strm, C *c) { \ + c->clear(); \ + int64 n = 0; \ + strm.read(reinterpret_cast(&n), sizeof(n)); \ + for (ssize_t i = 0; i < n; ++i) { \ + typename C::value_type value; \ + ReadType(strm, &value); \ + c->insert(value); \ + } \ + return strm; \ +} + +READ_STL_ASSOC_TYPE(set); +READ_STL_ASSOC_TYPE(unordered_set); +READ_STL_ASSOC_TYPE(map); +READ_STL_ASSOC_TYPE(unordered_map); + +// Write some types to an output stream. + +// Generic case. +template +inline ostream &WriteType(ostream &strm, const T t) { + t.Write(strm); + return strm; +} + +// Fixed size, contiguous memory write. +#define WRITE_POD_TYPE(T) \ +inline ostream &WriteType(ostream &strm, const T t) { \ + return strm.write(reinterpret_cast(&t), sizeof(T)); \ +} + +WRITE_POD_TYPE(bool); +WRITE_POD_TYPE(char); +WRITE_POD_TYPE(signed char); +WRITE_POD_TYPE(unsigned char); +WRITE_POD_TYPE(short); +WRITE_POD_TYPE(unsigned short); +WRITE_POD_TYPE(int); +WRITE_POD_TYPE(unsigned int); +WRITE_POD_TYPE(long); +WRITE_POD_TYPE(unsigned long); +WRITE_POD_TYPE(long long); +WRITE_POD_TYPE(unsigned long long); +WRITE_POD_TYPE(float); +WRITE_POD_TYPE(double); + +// String case. +inline ostream &WriteType(ostream &strm, const string &s) { + int32 ns = s.size(); + strm.write(reinterpret_cast(&ns), sizeof(ns)); + return strm.write(s.data(), ns); +} + +// Pair case. +template +inline ostream &WriteType(ostream &strm, const pair &p) { + WriteType(strm, p.first); + WriteType(strm, p.second); + return strm; +} + +// STL sequence container. +#define WRITE_STL_SEQ_TYPE(C) \ +template \ +inline ostream &WriteType(ostream &strm, const C &c) { \ + int64 n = c.size(); \ + strm.write(reinterpret_cast(&n), sizeof(n)); \ + for (typename C::const_iterator it = c.begin(); \ + it != c.end(); ++it) \ + WriteType(strm, *it); \ + return strm; \ +} + +WRITE_STL_SEQ_TYPE(vector); +WRITE_STL_SEQ_TYPE(list); + +// STL associative container. +#define WRITE_STL_ASSOC_TYPE(C) \ +template \ +inline ostream &WriteType(ostream &strm, const C &c) { \ + int64 n = c.size(); \ + strm.write(reinterpret_cast(&n), sizeof(n)); \ + for (typename C::const_iterator it = c.begin(); \ + it != c.end(); ++it) \ + WriteType(strm, *it); \ + return strm; \ +} + +WRITE_STL_ASSOC_TYPE(set); +WRITE_STL_ASSOC_TYPE(unordered_set); +WRITE_STL_ASSOC_TYPE(map); +WRITE_STL_ASSOC_TYPE(unordered_map); + +// Utilities for converting between int64 or Weight and string. + +int64 OPENFSTDLL StrToInt64(const string &s, const string &src, size_t nline, //ChangedPD + bool allow_negative, bool *error = 0); + +template +Weight StrToWeight(const string &s, const string &src, size_t nline) { + Weight w; + istringstream strm(s); + strm >> w; + if (!strm) { + FSTERROR() << "StrToWeight: Bad weight = \"" << s + << "\", source = " << src << ", line = " << nline; + return Weight::NoWeight(); + } + return w; +} + +void OPENFSTDLL Int64ToStr(int64 n, string *s); //ChangedPD + +template +void WeightToStr(Weight w, string *s) { + ostringstream strm; + strm.precision(9); + strm << w; + *s += strm.str(); +} + +// Utilities for reading/writing label pairs + +// Returns true on success +template +bool ReadLabelPairs(const string& filename, + vector >* pairs, + bool allow_negative = false) { + ifstream strm(filename.c_str()); + + if (!strm) { + LOG(ERROR) << "ReadLabelPairs: Can't open file: " << filename; + return false; + } + + const int kLineLen = 8096; + char line[kLineLen]; + size_t nline = 0; + + pairs->clear(); + while (strm.getline(line, kLineLen)) { + ++nline; + vector col; + SplitToVector(line, "\n\t ", &col, true); + if (col.size() == 0 || col[0][0] == '\0') // empty line + continue; + if (col.size() != 2) { + LOG(ERROR) << "ReadLabelPairs: Bad number of columns, " + << "file = " << filename << ", line = " << nline; + return false; + } + + bool err; + Label frmlabel = StrToInt64(col[0], filename, nline, allow_negative, &err); + if (err) return false; + Label tolabel = StrToInt64(col[1], filename, nline, allow_negative, &err); + if (err) return false; + pairs->push_back(make_pair(frmlabel, tolabel)); + } + return true; +} + +// Returns true on success +template +bool WriteLabelPairs(const string& filename, + const vector >& pairs) { + ostream *strm = &std::cout; + if (!filename.empty()) { + strm = new ofstream(filename.c_str()); + if (!*strm) { + LOG(ERROR) << "WriteLabelPairs: Can't open file: " << filename; + return false; + } + } + + for (ssize_t n = 0; n < pairs.size(); ++n) + *strm << pairs[n].first << "\t" << pairs[n].second << "\n"; + + if (!*strm) { + LOG(ERROR) << "WriteLabelPairs: Write failed: " + << (filename.empty() ? "standard output" : filename); + return false; + } + if (strm != &std::cout) + delete strm; + return true; +} + +// Utilities for converting a type name to a legal C symbol. + +void OPENFSTDLL ConvertToLegalCSymbol(string *s); //ChangedPD + + +// +// UTILITIES FOR STREAM I/O +// + +bool OPENFSTDLL AlignInput(istream &strm, int align); +bool OPENFSTDLL AlignOutput(ostream &strm, int align); + +// +// UTILITIES FOR PROTOCOL BUFFER I/O +// + + +// An associative container for which testing membership is +// faster than an STL set if members are restricted to an interval +// that excludes most non-members. A 'Key' must have ==, !=, and < defined. +// Element 'NoKey' should be a key that marks an uninitialized key and +// is otherwise unused. 'Find()' returns an STL const_iterator to the match +// found, otherwise it equals 'End()'. +template +class CompactSet { +public: + typedef typename set::const_iterator const_iterator; + + CompactSet() + : min_key_(NoKey), + max_key_(NoKey) { } + + CompactSet(const CompactSet &compact_set) + : set_(compact_set.set_), + min_key_(compact_set.min_key_), + max_key_(compact_set.max_key_) { } + + void Insert(Key key) { + set_.insert(key); + if (min_key_ == NoKey || key < min_key_) + min_key_ = key; + if (max_key_ == NoKey || max_key_ < key) + max_key_ = key; + } + + void Clear() { + set_.clear(); + min_key_ = max_key_ = NoKey; + } + + const_iterator Find(Key key) const { + if (min_key_ == NoKey || + key < min_key_ || max_key_ < key) + return set_.end(); + else + return set_.find(key); + } + + const_iterator Begin() const { return set_.begin(); } + + const_iterator End() const { return set_.end(); } + +private: + set set_; + Key min_key_; + Key max_key_; + + void operator=(const CompactSet &); //disallow +}; + +} // namespace fst + +#endif // FST_LIB_UTIL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/util.h.bak b/extlibs/openfstwin-1.3.1/include/fst/util.h.bak new file mode 100755 index 00000000000..c6613ca2d4d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/util.h.bak @@ -0,0 +1,410 @@ +// util.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// FST utility inline definitions. + +#ifndef FST_LIB_UTIL_H__ +#define FST_LIB_UTIL_H__ + +#include +using std::tr1::unordered_map; +using std::tr1::unordered_multimap; +#include +using std::tr1::unordered_set; +using std::tr1::unordered_multiset; +#include +#include +#include +#include +#include +#include +using std::vector; + + +#include +#include + +#include +#include +#include + +// +// UTILITY FOR ERROR HANDLING +// + +DECLARE_bool(fst_error_fatal); + +#define FSTERROR() (FLAGS_fst_error_fatal ? LOG(FATAL) : LOG(ERROR)) + +namespace fst { + +// +// UTILITIES FOR TYPE I/O +// + +// Read some types from an input stream. + +// Generic case. +template +inline istream &ReadType(istream &strm, T *t) { + return t->Read(strm); +} + +// Fixed size, contiguous memory read. +#define READ_POD_TYPE(T) \ +inline istream &ReadType(istream &strm, T *t) { \ + return strm.read(reinterpret_cast(t), sizeof(T)); \ +} + +READ_POD_TYPE(bool); +READ_POD_TYPE(char); +READ_POD_TYPE(signed char); +READ_POD_TYPE(unsigned char); +READ_POD_TYPE(short); +READ_POD_TYPE(unsigned short); +READ_POD_TYPE(int); +READ_POD_TYPE(unsigned int); +READ_POD_TYPE(long); +READ_POD_TYPE(unsigned long); +READ_POD_TYPE(long long); +READ_POD_TYPE(unsigned long long); +READ_POD_TYPE(float); +READ_POD_TYPE(double); + +// String case. +inline istream &ReadType(istream &strm, string *s) { + s->clear(); + int32 ns = 0; + strm.read(reinterpret_cast(&ns), sizeof(ns)); + for (int i = 0; i < ns; ++i) { + char c; + strm.read(&c, 1); + *s += c; + } + return strm; +} + +// Pair case. +template +inline istream &ReadType(istream &strm, pair *p) { + ReadType(strm, &p->first); + ReadType(strm, &p->second); + return strm; +} + +template +inline istream &ReadType(istream &strm, pair *p) { + ReadType(strm, const_cast(&p->first)); + ReadType(strm, &p->second); + return strm; +} + +// General case - no-op. +template +void StlReserve(C *c, int64 n) {} + +// Specialization for vectors. +template +void StlReserve(vector *c, int64 n) { + c->reserve(n); +} + +// STL sequence container. +#define READ_STL_SEQ_TYPE(C) \ +template \ +inline istream &ReadType(istream &strm, C *c) { \ + c->clear(); \ + int64 n = 0; \ + strm.read(reinterpret_cast(&n), sizeof(n)); \ + StlReserve(c, n); \ + for (ssize_t i = 0; i < n; ++i) { \ + typename C::value_type value; \ + ReadType(strm, &value); \ + c->insert(c->end(), value); \ + } \ + return strm; \ +} + +READ_STL_SEQ_TYPE(vector); +READ_STL_SEQ_TYPE(list); + +// STL associative container. +#define READ_STL_ASSOC_TYPE(C) \ +template \ +inline istream &ReadType(istream &strm, C *c) { \ + c->clear(); \ + int64 n = 0; \ + strm.read(reinterpret_cast(&n), sizeof(n)); \ + for (ssize_t i = 0; i < n; ++i) { \ + typename C::value_type value; \ + ReadType(strm, &value); \ + c->insert(value); \ + } \ + return strm; \ +} + +READ_STL_ASSOC_TYPE(set); +READ_STL_ASSOC_TYPE(unordered_set); +READ_STL_ASSOC_TYPE(map); +READ_STL_ASSOC_TYPE(unordered_map); + +// Write some types to an output stream. + +// Generic case. +template +inline ostream &WriteType(ostream &strm, const T t) { + t.Write(strm); + return strm; +} + +// Fixed size, contiguous memory write. +#define WRITE_POD_TYPE(T) \ +inline ostream &WriteType(ostream &strm, const T t) { \ + return strm.write(reinterpret_cast(&t), sizeof(T)); \ +} + +WRITE_POD_TYPE(bool); +WRITE_POD_TYPE(char); +WRITE_POD_TYPE(signed char); +WRITE_POD_TYPE(unsigned char); +WRITE_POD_TYPE(short); +WRITE_POD_TYPE(unsigned short); +WRITE_POD_TYPE(int); +WRITE_POD_TYPE(unsigned int); +WRITE_POD_TYPE(long); +WRITE_POD_TYPE(unsigned long); +WRITE_POD_TYPE(long long); +WRITE_POD_TYPE(unsigned long long); +WRITE_POD_TYPE(float); +WRITE_POD_TYPE(double); + +// String case. +inline ostream &WriteType(ostream &strm, const string &s) { + int32 ns = s.size(); + strm.write(reinterpret_cast(&ns), sizeof(ns)); + return strm.write(s.data(), ns); +} + +// Pair case. +template +inline ostream &WriteType(ostream &strm, const pair &p) { + WriteType(strm, p.first); + WriteType(strm, p.second); + return strm; +} + +// STL sequence container. +#define WRITE_STL_SEQ_TYPE(C) \ +template \ +inline ostream &WriteType(ostream &strm, const C &c) { \ + int64 n = c.size(); \ + strm.write(reinterpret_cast(&n), sizeof(n)); \ + for (typename C::const_iterator it = c.begin(); \ + it != c.end(); ++it) \ + WriteType(strm, *it); \ + return strm; \ +} + +WRITE_STL_SEQ_TYPE(vector); +WRITE_STL_SEQ_TYPE(list); + +// STL associative container. +#define WRITE_STL_ASSOC_TYPE(C) \ +template \ +inline ostream &WriteType(ostream &strm, const C &c) { \ + int64 n = c.size(); \ + strm.write(reinterpret_cast(&n), sizeof(n)); \ + for (typename C::const_iterator it = c.begin(); \ + it != c.end(); ++it) \ + WriteType(strm, *it); \ + return strm; \ +} + +WRITE_STL_ASSOC_TYPE(set); +WRITE_STL_ASSOC_TYPE(unordered_set); +WRITE_STL_ASSOC_TYPE(map); +WRITE_STL_ASSOC_TYPE(unordered_map); + +// Utilities for converting between int64 or Weight and string. + +int64 StrToInt64(const string &s, const string &src, size_t nline, + bool allow_negative, bool *error = 0); + +template +Weight StrToWeight(const string &s, const string &src, size_t nline) { + Weight w; + istringstream strm(s); + strm >> w; + if (!strm) { + FSTERROR() << "StrToWeight: Bad weight = \"" << s + << "\", source = " << src << ", line = " << nline; + return Weight::NoWeight(); + } + return w; +} + +void Int64ToStr(int64 n, string *s); + +template +void WeightToStr(Weight w, string *s) { + ostringstream strm; + strm.precision(9); + strm << w; + *s += strm.str(); +} + +// Utilities for reading/writing label pairs + +// Returns true on success +template +bool ReadLabelPairs(const string& filename, + vector >* pairs, + bool allow_negative = false) { + ifstream strm(filename.c_str()); + + if (!strm) { + LOG(ERROR) << "ReadLabelPairs: Can't open file: " << filename; + return false; + } + + const int kLineLen = 8096; + char line[kLineLen]; + size_t nline = 0; + + pairs->clear(); + while (strm.getline(line, kLineLen)) { + ++nline; + vector col; + SplitToVector(line, "\n\t ", &col, true); + if (col.size() == 0 || col[0][0] == '\0') // empty line + continue; + if (col.size() != 2) { + LOG(ERROR) << "ReadLabelPairs: Bad number of columns, " + << "file = " << filename << ", line = " << nline; + return false; + } + + bool err; + Label frmlabel = StrToInt64(col[0], filename, nline, allow_negative, &err); + if (err) return false; + Label tolabel = StrToInt64(col[1], filename, nline, allow_negative, &err); + if (err) return false; + pairs->push_back(make_pair(frmlabel, tolabel)); + } + return true; +} + +// Returns true on success +template +bool WriteLabelPairs(const string& filename, + const vector >& pairs) { + ostream *strm = &std::cout; + if (!filename.empty()) { + strm = new ofstream(filename.c_str()); + if (!*strm) { + LOG(ERROR) << "WriteLabelPairs: Can't open file: " << filename; + return false; + } + } + + for (ssize_t n = 0; n < pairs.size(); ++n) + *strm << pairs[n].first << "\t" << pairs[n].second << "\n"; + + if (!*strm) { + LOG(ERROR) << "WriteLabelPairs: Write failed: " + << (filename.empty() ? "standard output" : filename); + return false; + } + if (strm != &std::cout) + delete strm; + return true; +} + +// Utilities for converting a type name to a legal C symbol. + +void ConvertToLegalCSymbol(string *s); + + +// +// UTILITIES FOR STREAM I/O +// + +bool AlignInput(istream &strm, int align); +bool AlignOutput(ostream &strm, int align); + +// +// UTILITIES FOR PROTOCOL BUFFER I/O +// + + +// An associative container for which testing membership is +// faster than an STL set if members are restricted to an interval +// that excludes most non-members. A 'Key' must have ==, !=, and < defined. +// Element 'NoKey' should be a key that marks an uninitialized key and +// is otherwise unused. 'Find()' returns an STL const_iterator to the match +// found, otherwise it equals 'End()'. +template +class CompactSet { +public: + typedef typename set::const_iterator const_iterator; + + CompactSet() + : min_key_(NoKey), + max_key_(NoKey) { } + + CompactSet(const CompactSet &compact_set) + : set_(compact_set.set_), + min_key_(compact_set.min_key_), + max_key_(compact_set.max_key_) { } + + void Insert(Key key) { + set_.insert(key); + if (min_key_ == NoKey || key < min_key_) + min_key_ = key; + if (max_key_ == NoKey || max_key_ < key) + max_key_ = key; + } + + void Clear() { + set_.clear(); + min_key_ = max_key_ = NoKey; + } + + const_iterator Find(Key key) const { + if (min_key_ == NoKey || + key < min_key_ || max_key_ < key) + return set_.end(); + else + return set_.find(key); + } + + const_iterator Begin() const { return set_.begin(); } + + const_iterator End() const { return set_.end(); } + +private: + set set_; + Key min_key_; + Key max_key_; + + void operator=(const CompactSet &); //disallow +}; + +} // namespace fst + +#endif // FST_LIB_UTIL_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/vector-fst.h b/extlibs/openfstwin-1.3.1/include/fst/vector-fst.h new file mode 100755 index 00000000000..f6d8a6d1298 --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/vector-fst.h @@ -0,0 +1,727 @@ +// vector-fst.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Simple concrete, mutable FST whose states and arcs are stored in STL +// vectors. + +#ifndef FST_LIB_VECTOR_FST_H__ +#define FST_LIB_VECTOR_FST_H__ + +#include +#include +using std::vector; + +#include +#include + + +namespace fst { + +template class VectorFst; +template void Cast(const F &, G *); + + +// States and arcs implemented by STL vectors, templated on the +// State definition. This does not manage the Fst properties. +template +class VectorFstBaseImpl : public FstImpl { + public: + typedef typename State::Arc Arc; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + VectorFstBaseImpl() : start_(kNoStateId) {} + + ~VectorFstBaseImpl() { + for (StateId s = 0; s < states_.size(); ++s) + delete states_[s]; + } + + StateId Start() const { return start_; } + + Weight Final(StateId s) const { return states_[s]->final; } + + StateId NumStates() const { return states_.size(); } + + size_t NumArcs(StateId s) const { return states_[s]->arcs.size(); } + + void SetStart(StateId s) { start_ = s; } + + void SetFinal(StateId s, Weight w) { states_[s]->final = w; } + + StateId AddState() { + states_.push_back(new State); + return states_.size() - 1; + } + + StateId AddState(State *state) { + states_.push_back(state); + return states_.size() - 1; + } + + void AddArc(StateId s, const Arc &arc) { + states_[s]->arcs.push_back(arc); + } + + void DeleteStates(const vector& dstates) { + vector newid(states_.size(), 0); + for (size_t i = 0; i < dstates.size(); ++i) + newid[dstates[i]] = kNoStateId; + StateId nstates = 0; + for (StateId s = 0; s < states_.size(); ++s) { + if (newid[s] != kNoStateId) { + newid[s] = nstates; + if (s != nstates) + states_[nstates] = states_[s]; + ++nstates; + } else { + delete states_[s]; + } + } + states_.resize(nstates); + for (StateId s = 0; s < states_.size(); ++s) { + vector &arcs = states_[s]->arcs; + size_t narcs = 0; + for (size_t i = 0; i < arcs.size(); ++i) { + StateId t = newid[arcs[i].nextstate]; + if (t != kNoStateId) { + arcs[i].nextstate = t; + if (i != narcs) + arcs[narcs] = arcs[i]; + ++narcs; + } else { + if (arcs[i].ilabel == 0) + --states_[s]->niepsilons; + if (arcs[i].olabel == 0) + --states_[s]->noepsilons; + } + } + arcs.resize(narcs); + } + if (Start() != kNoStateId) + SetStart(newid[Start()]); + } + + void DeleteStates() { + for (StateId s = 0; s < states_.size(); ++s) + delete states_[s]; + states_.clear(); + SetStart(kNoStateId); + } + + void DeleteArcs(StateId s, size_t n) { + states_[s]->arcs.resize(states_[s]->arcs.size() - n); + } + + void DeleteArcs(StateId s) { states_[s]->arcs.clear(); } + + State *GetState(StateId s) { return states_[s]; } + + const State *GetState(StateId s) const { return states_[s]; } + + void SetState(StateId s, State *state) { states_[s] = state; } + + void ReserveStates(StateId n) { states_.reserve(n); } + + void ReserveArcs(StateId s, size_t n) { states_[s]->arcs.reserve(n); } + + // Provide information needed for generic state iterator + void InitStateIterator(StateIteratorData *data) const { + data->base = 0; + data->nstates = states_.size(); + } + + // Provide information needed for generic arc iterator + void InitArcIterator(StateId s, ArcIteratorData *data) const { + data->base = 0; + data->narcs = states_[s]->arcs.size(); + data->arcs = data->narcs > 0 ? &states_[s]->arcs[0] : 0; + data->ref_count = 0; + } + + private: + vector states_; // States represenation. + StateId start_; // initial state + + DISALLOW_COPY_AND_ASSIGN(VectorFstBaseImpl); +}; + +// Arcs implemented by an STL vector per state. +template +struct VectorState { + typedef A Arc; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + VectorState() : final(Weight::Zero()), niepsilons(0), noepsilons(0) {} + + Weight final; // Final weight + vector arcs; // Arcs represenation + size_t niepsilons; // # of input epsilons + size_t noepsilons; // # of output epsilons +}; + +// This is a VectorFstBaseImpl container that holds VectorState's. It +// manages Fst properties and the # of input and output epsilons. +template +class VectorFstImpl : public VectorFstBaseImpl< VectorState > { + public: + using FstImpl::SetInputSymbols; + using FstImpl::SetOutputSymbols; + using FstImpl::SetType; + using FstImpl::SetProperties; + using FstImpl::Properties; + + using VectorFstBaseImpl >::Start; + using VectorFstBaseImpl >::NumStates; + using VectorFstBaseImpl >::GetState; + using VectorFstBaseImpl >::ReserveArcs; + + friend class MutableArcIterator< VectorFst >; + + typedef VectorFstBaseImpl< VectorState > BaseImpl; + typedef typename A::Weight Weight; + typedef typename A::StateId StateId; + + VectorFstImpl() { + SetType("vector"); + SetProperties(kNullProperties | kStaticProperties); + } + explicit VectorFstImpl(const Fst &fst); + + static VectorFstImpl *Read(istream &strm, const FstReadOptions &opts); + + size_t NumInputEpsilons(StateId s) const { return GetState(s)->niepsilons; } + + size_t NumOutputEpsilons(StateId s) const { return GetState(s)->noepsilons; } + + void SetStart(StateId s) { + BaseImpl::SetStart(s); + SetProperties(SetStartProperties(Properties())); + } + + void SetFinal(StateId s, Weight w) { + Weight ow = BaseImpl::Final(s); + BaseImpl::SetFinal(s, w); + SetProperties(SetFinalProperties(Properties(), ow, w)); + } + + StateId AddState() { + StateId s = BaseImpl::AddState(); + SetProperties(AddStateProperties(Properties())); + return s; + } + + void AddArc(StateId s, const A &arc) { + VectorState *state = GetState(s); + if (arc.ilabel == 0) { + ++state->niepsilons; + } + if (arc.olabel == 0) { + ++state->noepsilons; + } + + const A *parc = state->arcs.empty() ? 0 : &(state->arcs.back()); + SetProperties(AddArcProperties(Properties(), s, arc, parc)); + + BaseImpl::AddArc(s, arc); + } + + void DeleteStates(const vector &dstates) { + BaseImpl::DeleteStates(dstates); + SetProperties(DeleteStatesProperties(Properties())); + } + + void DeleteStates() { + BaseImpl::DeleteStates(); + SetProperties(DeleteAllStatesProperties(Properties(), + kStaticProperties)); + } + + void DeleteArcs(StateId s, size_t n) { + const vector &arcs = GetState(s)->arcs; + for (size_t i = 0; i < n; ++i) { + size_t j = arcs.size() - i - 1; + if (arcs[j].ilabel == 0) + --GetState(s)->niepsilons; + if (arcs[j].olabel == 0) + --GetState(s)->noepsilons; + } + BaseImpl::DeleteArcs(s, n); + SetProperties(DeleteArcsProperties(Properties())); + } + + void DeleteArcs(StateId s) { + GetState(s)->niepsilons = 0; + GetState(s)->noepsilons = 0; + BaseImpl::DeleteArcs(s); + SetProperties(DeleteArcsProperties(Properties())); + } + + private: + // Properties always true of this Fst class + static const uint64 kStaticProperties = kExpanded | kMutable; + // Current file format version + static const int kFileVersion = 2; + // Minimum file format version supported + static const int kMinFileVersion = 1; + + DISALLOW_COPY_AND_ASSIGN(VectorFstImpl); +}; + +template const uint64 VectorFstImpl::kStaticProperties; +template const int VectorFstImpl::kFileVersion; +template const int VectorFstImpl::kMinFileVersion; + + +template +VectorFstImpl::VectorFstImpl(const Fst &fst) { + SetType("vector"); + SetInputSymbols(fst.InputSymbols()); + SetOutputSymbols(fst.OutputSymbols()); + BaseImpl::SetStart(fst.Start()); + if (fst.Properties(kExpanded, false)) + BaseImpl::ReserveStates(CountStates(fst)); + + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) { + StateId s = siter.Value(); + BaseImpl::AddState(); + BaseImpl::SetFinal(s, fst.Final(s)); + ReserveArcs(s, fst.NumArcs(s)); + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const A &arc = aiter.Value(); + BaseImpl::AddArc(s, arc); + if (arc.ilabel == 0) + ++GetState(s)->niepsilons; + if (arc.olabel == 0) + ++GetState(s)->noepsilons; + } + } + SetProperties(fst.Properties(kCopyProperties, false) | kStaticProperties); +} + +template +VectorFstImpl *VectorFstImpl::Read(istream &strm, + const FstReadOptions &opts) { + VectorFstImpl *impl = new VectorFstImpl; + FstHeader hdr; + if (!impl->ReadHeader(strm, opts, kMinFileVersion, &hdr)) { + delete impl; + return 0; + } + impl->BaseImpl::SetStart(hdr.Start()); + if (hdr.NumStates() != kNoStateId) { + impl->ReserveStates(hdr.NumStates()); + } + + StateId s = 0; + for (;hdr.NumStates() == kNoStateId || s < hdr.NumStates(); ++s) { + typename A::Weight final; + if (!final.Read(strm)) break; + impl->BaseImpl::AddState(); + VectorState *state = impl->GetState(s); + state->final = final; + int64 narcs; + ReadType(strm, &narcs); + if (!strm) { + LOG(ERROR) << "VectorFst::Read: read failed: " << opts.source; + delete impl; + return 0; + } + impl->ReserveArcs(s, narcs); + for (size_t j = 0; j < narcs; ++j) { + A arc; + ReadType(strm, &arc.ilabel); + ReadType(strm, &arc.olabel); + arc.weight.Read(strm); + ReadType(strm, &arc.nextstate); + if (!strm) { + LOG(ERROR) << "VectorFst::Read: read failed: " << opts.source; + delete impl; + return 0; + } + impl->BaseImpl::AddArc(s, arc); + if (arc.ilabel == 0) + ++state->niepsilons; + if (arc.olabel == 0) + ++state->noepsilons; + } + } + if (hdr.NumStates() != kNoStateId && s != hdr.NumStates()) { + LOG(ERROR) << "VectorFst::Read: unexpected end of file: " << opts.source; + delete impl; + return 0; + } + return impl; +} + +// Converts a string into a weight. +template class WeightFromString { + public: + W operator()(const string &s); +}; + +// Generic case fails. +template inline +W WeightFromString::operator()(const string &s) { + FSTERROR() << "VectorFst::Read: Obsolete file format"; + return W::NoWeight(); +} + +// TropicalWeight version. +template <> inline +TropicalWeight WeightFromString::operator()(const string &s) { + float f; + memcpy(&f, s.data(), sizeof(f)); + return TropicalWeight(f); +} + +// LogWeight version. +template <> inline +LogWeight WeightFromString::operator()(const string &s) { + float f; + memcpy(&f, s.data(), sizeof(f)); + return LogWeight(f); +} + +// Simple concrete, mutable FST. This class attaches interface to +// implementation and handles reference counting, delegating most +// methods to ImplToMutableFst. Supports additional operations: +// ReserveStates and ReserveArcs (cf. STL vectors). +template +class VectorFst : public ImplToMutableFst< VectorFstImpl > { + public: + friend class StateIterator< VectorFst >; + friend class ArcIterator< VectorFst >; + friend class MutableArcIterator< VectorFst >; + template friend void Cast(const F &, G *); + + typedef A Arc; + typedef typename A::StateId StateId; + typedef VectorFstImpl Impl; + + VectorFst() : ImplToMutableFst(new Impl) {} + + explicit VectorFst(const Fst &fst) + : ImplToMutableFst(new Impl(fst)) {} + + VectorFst(const VectorFst &fst) : ImplToMutableFst(fst) {} + + // Get a copy of this VectorFst. See Fst<>::Copy() for further doc. + virtual VectorFst *Copy(bool safe = false) const { + return new VectorFst(*this); + } + + VectorFst &operator=(const VectorFst &fst) { + SetImpl(fst.GetImpl(), false); + return *this; + } + + virtual VectorFst &operator=(const Fst &fst) { + if (this != &fst) SetImpl(new Impl(fst)); + return *this; + } + + // Read a VectorFst from an input stream; return NULL on error + static VectorFst *Read(istream &strm, const FstReadOptions &opts) { + Impl* impl = Impl::Read(strm, opts); + return impl ? new VectorFst(impl) : 0; + } + + // Read a VectorFst from a file; return NULL on error + // Empty filename reads from standard input + static VectorFst *Read(const string &filename) { + Impl* impl = ImplToExpandedFst >::Read(filename); + return impl ? new VectorFst(impl) : 0; + } + + virtual bool Write(ostream &strm, const FstWriteOptions &opts) const { + return WriteFst(*this, strm, opts); + } + + virtual bool Write(const string &filename) const { + return Fst::WriteFile(filename); + } + + template + static bool WriteFst(const F &fst, ostream &strm, + const FstWriteOptions &opts); + + void ReserveStates(StateId n) { + MutateCheck(); + GetImpl()->ReserveStates(n); + } + + void ReserveArcs(StateId s, size_t n) { + MutateCheck(); + GetImpl()->ReserveArcs(s, n); + } + + virtual void InitStateIterator(StateIteratorData *data) const { + GetImpl()->InitStateIterator(data); + } + + virtual void InitArcIterator(StateId s, ArcIteratorData *data) const { + GetImpl()->InitArcIterator(s, data); + } + + virtual inline + void InitMutableArcIterator(StateId s, MutableArcIteratorData *); + + private: + explicit VectorFst(Impl *impl) : ImplToMutableFst(impl) {} + + // Makes visible to friends. + Impl *GetImpl() const { return ImplToFst< Impl, MutableFst >::GetImpl(); } + + void SetImpl(Impl *impl, bool own_impl = true) { + ImplToFst< Impl, MutableFst >::SetImpl(impl, own_impl); + } + + void MutateCheck() { return ImplToMutableFst::MutateCheck(); } +}; + +// Specialization for VectorFst; see generic version in fst.h +// for sample usage (but use the VectorFst type!). This version +// should inline. +template +class StateIterator< VectorFst > { + public: + typedef typename A::StateId StateId; + + explicit StateIterator(const VectorFst &fst) + : nstates_(fst.GetImpl()->NumStates()), s_(0) {} + + bool Done() const { return s_ >= nstates_; } + + StateId Value() const { return s_; } + + void Next() { ++s_; } + + void Reset() { s_ = 0; } + + private: + StateId nstates_; + StateId s_; + + DISALLOW_COPY_AND_ASSIGN(StateIterator); +}; + +// Writes Fst to file, will call CountStates so may involve two passes if +// called from an Fst that is not derived from Expanded. +template +template +bool VectorFst::WriteFst(const F &fst, ostream &strm, + const FstWriteOptions &opts) { + static const int kFileVersion = 2; + bool update_header = true; + FstHeader hdr; + hdr.SetStart(fst.Start()); + hdr.SetNumStates(kNoStateId); + size_t start_offset = 0; + if (fst.Properties(kExpanded, false) || (start_offset = strm.tellp()) != -1) { + hdr.SetNumStates(CountStates(fst)); + update_header = false; + } + FstImpl::WriteFstHeader(fst, strm, opts, kFileVersion, "vector", &hdr); + StateId num_states = 0; + for (StateIterator siter(fst); !siter.Done(); siter.Next()) { + typename A::StateId s = siter.Value(); + fst.Final(s).Write(strm); + int64 narcs = fst.NumArcs(s); + WriteType(strm, narcs); + for (ArcIterator aiter(fst, s); !aiter.Done(); aiter.Next()) { + const A &arc = aiter.Value(); + WriteType(strm, arc.ilabel); + WriteType(strm, arc.olabel); + arc.weight.Write(strm); + WriteType(strm, arc.nextstate); + } + num_states++; + } + strm.flush(); + if (!strm) { + LOG(ERROR) << "VectorFst::Write: write failed: " << opts.source; + return false; + } + if (update_header) { + hdr.SetNumStates(num_states); + return FstImpl::UpdateFstHeader(fst, strm, opts, kFileVersion, "vector", + &hdr, start_offset); + } else { + if (num_states != hdr.NumStates()) { + LOG(ERROR) << "Inconsistent number of states observed during write"; + return false; + } + } + return true; +} + +// Specialization for VectorFst; see generic version in fst.h +// for sample usage (but use the VectorFst type!). This version +// should inline. +template +class ArcIterator< VectorFst > { + public: + typedef typename A::StateId StateId; + + ArcIterator(const VectorFst &fst, StateId s) + : arcs_(fst.GetImpl()->GetState(s)->arcs), i_(0) {} + + bool Done() const { return i_ >= arcs_.size(); } + + const A& Value() const { return arcs_[i_]; } + + void Next() { ++i_; } + + void Reset() { i_ = 0; } + + void Seek(size_t a) { i_ = a; } + + size_t Position() const { return i_; } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 f, uint32 m) {} + + private: + const vector& arcs_; + size_t i_; + + DISALLOW_COPY_AND_ASSIGN(ArcIterator); +}; + +// Specialization for VectorFst; see generic version in fst.h +// for sample usage (but use the VectorFst type!). This version +// should inline. +template +class MutableArcIterator< VectorFst > + : public MutableArcIteratorBase { + public: + typedef typename A::StateId StateId; + typedef typename A::Weight Weight; + + MutableArcIterator(VectorFst *fst, StateId s) : i_(0) { + fst->MutateCheck(); + state_ = fst->GetImpl()->GetState(s); + properties_ = &fst->GetImpl()->properties_; + } + + bool Done() const { return i_ >= state_->arcs.size(); } + + const A& Value() const { return state_->arcs[i_]; } + + void Next() { ++i_; } + + size_t Position() const { return i_; } + + void Reset() { i_ = 0; } + + void Seek(size_t a) { i_ = a; } + + void SetValue(const A &arc) { + A& oarc = state_->arcs[i_]; + if (oarc.ilabel != oarc.olabel) + *properties_ &= ~kNotAcceptor; + if (oarc.ilabel == 0) { + --state_->niepsilons; + *properties_ &= ~kIEpsilons; + if (oarc.olabel == 0) + *properties_ &= ~kEpsilons; + } + if (oarc.olabel == 0) { + --state_->noepsilons; + *properties_ &= ~kOEpsilons; + } + if (oarc.weight != Weight::Zero() && oarc.weight != Weight::One()) + *properties_ &= ~kWeighted; + oarc = arc; + if (arc.ilabel != arc.olabel) { + *properties_ |= kNotAcceptor; + *properties_ &= ~kAcceptor; + } + if (arc.ilabel == 0) { + ++state_->niepsilons; + *properties_ |= kIEpsilons; + *properties_ &= ~kNoIEpsilons; + if (arc.olabel == 0) { + *properties_ |= kEpsilons; + *properties_ &= ~kNoEpsilons; + } + } + if (arc.olabel == 0) { + ++state_->noepsilons; + *properties_ |= kOEpsilons; + *properties_ &= ~kNoOEpsilons; + } + if (arc.weight != Weight::Zero() && arc.weight != Weight::One()) { + *properties_ |= kWeighted; + *properties_ &= ~kUnweighted; + } + *properties_ &= kSetArcProperties | kAcceptor | kNotAcceptor | + kEpsilons | kNoEpsilons | kIEpsilons | kNoIEpsilons | + kOEpsilons | kNoOEpsilons | kWeighted | kUnweighted; + } + + uint32 Flags() const { + return kArcValueFlags; + } + + void SetFlags(uint32 f, uint32 m) {} + + + private: + // This allows base-class virtual access to non-virtual derived- + // class members of the same name. It makes the derived class more + // efficient to use but unsafe to further derive. + virtual bool Done_() const { return Done(); } + virtual const A& Value_() const { return Value(); } + virtual void Next_() { Next(); } + virtual size_t Position_() const { return Position(); } + virtual void Reset_() { Reset(); } + virtual void Seek_(size_t a) { Seek(a); } + virtual void SetValue_(const A &a) { SetValue(a); } + uint32 Flags_() const { return Flags(); } + void SetFlags_(uint32 f, uint32 m) { SetFlags(f, m); } + + struct VectorState *state_; + uint64 *properties_; + size_t i_; + + DISALLOW_COPY_AND_ASSIGN(MutableArcIterator); +}; + +// Provide information needed for the generic mutable arc iterator +template inline +void VectorFst::InitMutableArcIterator( + StateId s, MutableArcIteratorData *data) { + data->base = new MutableArcIterator< VectorFst >(this, s); +} + +// A useful alias when using StdArc. +typedef VectorFst StdVectorFst; + +} // namespace fst + +#endif // FST_LIB_VECTOR_FST_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/verify.h b/extlibs/openfstwin-1.3.1/include/fst/verify.h new file mode 100755 index 00000000000..576cfcacaea --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/verify.h @@ -0,0 +1,126 @@ +// verify.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Function to verify an Fst's contents + +#ifndef FST_LIB_VERIFY_H__ +#define FST_LIB_VERIFY_H__ + +#include +#include + + +namespace fst { + +// Verifies that an Fst's contents are sane. +template +bool Verify(const Fst &fst, bool allow_negative_labels = false) { + typedef typename Arc::Label Label; + typedef typename Arc::Weight Weight; + typedef typename Arc::StateId StateId; + + StateId start = fst.Start(); + const SymbolTable *isyms = fst.InputSymbols(); + const SymbolTable *osyms = fst.OutputSymbols(); + + // Count states + StateId ns = 0; + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) + ++ns; + + if (start == kNoStateId && ns > 0) { + LOG(ERROR) << "Verify: Fst start state ID unset"; + return false; + } else if (start >= ns) { + LOG(ERROR) << "Verify: Fst start state ID exceeds number of states"; + return false; + } + + for (StateIterator< Fst > siter(fst); + !siter.Done(); + siter.Next()) { + StateId s = siter.Value(); + size_t na = 0; + for (ArcIterator< Fst > aiter(fst, s); + !aiter.Done(); + aiter.Next()) { + const Arc &arc =aiter.Value(); + if (!allow_negative_labels && arc.ilabel < 0) { + LOG(ERROR) << "Verify: Fst input label ID of arc at position " + << na << " of state " << s << " is negative"; + return false; + } else if (isyms && isyms->Find(arc.ilabel) == "") { + LOG(ERROR) << "Verify: Fst input label ID " << arc.ilabel + << " of arc at position " << na << " of state " << s + << " is missing from input symbol table \"" + << isyms->Name() << "\""; + return false; + } else if (!allow_negative_labels && arc.olabel < 0) { + LOG(ERROR) << "Verify: Fst output label ID of arc at position " + << na << " of state " << s << " is negative"; + return false; + } else if (osyms && osyms->Find(arc.olabel) == "") { + LOG(ERROR) << "Verify: Fst output label ID " << arc.olabel + << " of arc at position " << na << " of state " << s + << " is missing from output symbol table \"" + << osyms->Name() << "\""; + return false; + } else if (!arc.weight.Member() || arc.weight == Weight::Zero()) { + LOG(ERROR) << "Verify: Fst weight of arc at position " + << na << " of state " << s << " is invalid"; + return false; + } else if (arc.nextstate < 0) { + LOG(ERROR) << "Verify: Fst destination state ID of arc at position " + << na << " of state " << s << " is negative"; + return false; + } else if (arc.nextstate >= ns) { + LOG(ERROR) << "Verify: Fst destination state ID of arc at position " + << na << " of state " << s + << " exceeds number of states"; + return false; + } + ++na; + } + if (!fst.Final(s).Member()) { + LOG(ERROR) << "Verify: Fst final weight of state " << s << " is invalid"; + return false; + } + } + uint64 fst_props = fst.Properties(kFstProperties, false); + if (fst_props & kError) { + LOG(ERROR) << "Verify: Fst error property is set"; + return false; + } + + uint64 known_props; + uint64 test_props = ComputeProperties(fst, kFstProperties, &known_props, + false); + if (!CompatProperties(fst_props, test_props)) { + LOG(ERROR) << "Verify: stored Fst properties incorrect " + << "(props1 = stored props, props2 = tested)"; + return false; + } else { + return true; + } +} + +} // namespace fst + +#endif // FST_LIB_VERIFY_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/visit.h b/extlibs/openfstwin-1.3.1/include/fst/visit.h new file mode 100755 index 00000000000..31a00a8646d --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/visit.h @@ -0,0 +1,270 @@ +// visit.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// Queue-dependent visitation of finite-state transducers. See also +// dfs-visit.h. + +#ifndef FST_LIB_VISIT_H__ +#define FST_LIB_VISIT_H__ + + +#include +#include + + +namespace fst { + +// Visitor Interface - class determines actions taken during a visit. +// If any of the boolean member functions return false, the visit is +// aborted by first calling FinishState() on all unfinished (grey) +// states and then calling FinishVisit(). +// +// Note this is more general than the visitor interface in +// dfs-visit.h but lacks some DFS-specific behavior. +// +// template +// class Visitor { +// public: +// typedef typename Arc::StateId StateId; +// +// Visitor(T *return_data); +// // Invoked before visit +// void InitVisit(const Fst &fst); +// // Invoked when state discovered (2nd arg is visitation root) +// bool InitState(StateId s, StateId root); +// // Invoked when arc to white/undiscovered state examined +// bool WhiteArc(StateId s, const Arc &a); +// // Invoked when arc to grey/unfinished state examined +// bool GreyArc(StateId s, const Arc &a); +// // Invoked when arc to black/finished state examined +// bool BlackArc(StateId s, const Arc &a); +// // Invoked when state finished. +// void FinishState(StateId s); +// // Invoked after visit +// void FinishVisit(); +// }; + +// Performs queue-dependent visitation. Visitor class argument +// determines actions and contains any return data. ArcFilter +// determines arcs that are considered. +// +// Note this is more general than DfsVisit() in dfs-visit.h but lacks +// some DFS-specific Visitor behavior. +template +void Visit(const Fst &fst, V *visitor, Q *queue, ArcFilter filter) { + + typedef typename Arc::StateId StateId; + typedef ArcIterator< Fst > AIterator; + + visitor->InitVisit(fst); + + StateId start = fst.Start(); + if (start == kNoStateId) { + visitor->FinishVisit(); + return; + } + + // An Fst state's visit color + const unsigned kWhiteState = 0x01; // Undiscovered + const unsigned kGreyState = 0x02; // Discovered & unfinished + const unsigned kBlackState = 0x04; // Finished + + // We destroy an iterator as soon as possible and mark it so + const unsigned kArcIterDone = 0x08; // Arc iterator done and destroyed + + vector state_status; + vector arc_iterator; + + StateId nstates = start + 1; // # of known states in general case + bool expanded = false; + if (fst.Properties(kExpanded, false)) { // tests if expanded case, then + nstates = CountStates(fst); // uses ExpandedFst::NumStates(). + expanded = true; + } + + state_status.resize(nstates, kWhiteState); + arc_iterator.resize(nstates); + StateIterator< Fst > siter(fst); + + // Continues visit while true + bool visit = true; + + // Iterates over trees in visit forest. + for (StateId root = start; visit && root < nstates;) { + visit = visitor->InitState(root, root); + state_status[root] = kGreyState; + queue->Enqueue(root); + while (!queue->Empty()) { + StateId s = queue->Head(); + if (s >= state_status.size()) { + nstates = s + 1; + state_status.resize(nstates, kWhiteState); + arc_iterator.resize(nstates); + } + // Creates arc iterator if needed. + if (arc_iterator[s] == 0 && !(state_status[s] & kArcIterDone) && visit) + arc_iterator[s] = new AIterator(fst, s); + // Deletes arc iterator if done. + AIterator *aiter = arc_iterator[s]; + if ((aiter && aiter->Done()) || !visit) { + delete aiter; + arc_iterator[s] = 0; + state_status[s] |= kArcIterDone; + } + // Dequeues state and marks black if done + if (state_status[s] & kArcIterDone) { + queue->Dequeue(); + visitor->FinishState(s); + state_status[s] = kBlackState; + continue; + } + + const Arc &arc = aiter->Value(); + if (arc.nextstate >= state_status.size()) { + nstates = arc.nextstate + 1; + state_status.resize(nstates, kWhiteState); + arc_iterator.resize(nstates); + } + // Visits respective arc types + if (filter(arc)) { + // Enqueues destination state and marks grey if white + if (state_status[arc.nextstate] == kWhiteState) { + visit = visitor->WhiteArc(s, arc); + if (!visit) continue; + visit = visitor->InitState(arc.nextstate, root); + state_status[arc.nextstate] = kGreyState; + queue->Enqueue(arc.nextstate); + } else if (state_status[arc.nextstate] == kBlackState) { + visit = visitor->BlackArc(s, arc); + } else { + visit = visitor->GreyArc(s, arc); + } + } + aiter->Next(); + // Destroys an iterator ASAP for efficiency. + if (aiter->Done()) { + delete aiter; + arc_iterator[s] = 0; + state_status[s] |= kArcIterDone; + } + } + // Finds next tree root + for (root = root == start ? 0 : root + 1; + root < nstates && state_status[root] != kWhiteState; + ++root); + + // Check for a state beyond the largest known state + if (!expanded && root == nstates) { + for (; !siter.Done(); siter.Next()) { + if (siter.Value() == nstates) { + ++nstates; + state_status.push_back(kWhiteState); + arc_iterator.push_back(0); + break; + } + } + } + } + visitor->FinishVisit(); +} + + +template +inline void Visit(const Fst &fst, V *visitor, Q* queue) { + Visit(fst, visitor, queue, AnyArcFilter()); +} + +// Copies input FST to mutable FST following queue order. +template +class CopyVisitor { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + CopyVisitor(MutableFst *ofst) : ifst_(0), ofst_(ofst) {} + + void InitVisit(const Fst &ifst) { + ifst_ = &ifst; + ofst_->DeleteStates(); + ofst_->SetStart(ifst_->Start()); + } + + bool InitState(StateId s, StateId) { + while (ofst_->NumStates() <= s) + ofst_->AddState(); + return true; + } + + bool WhiteArc(StateId s, const Arc &arc) { + ofst_->AddArc(s, arc); + return true; + } + + bool GreyArc(StateId s, const Arc &arc) { + ofst_->AddArc(s, arc); + return true; + } + + bool BlackArc(StateId s, const Arc &arc) { + ofst_->AddArc(s, arc); + return true; + } + + void FinishState(StateId s) { + ofst_->SetFinal(s, ifst_->Final(s)); + } + + void FinishVisit() {} + + private: + const Fst *ifst_; + MutableFst *ofst_; +}; + + +// Visits input FST up to a state limit following queue order. +template +class PartialVisitor { + public: + typedef A Arc; + typedef typename A::StateId StateId; + + explicit PartialVisitor(StateId maxvisit) : maxvisit_(maxvisit) {} + + void InitVisit(const Fst &ifst) { nvisit_ = 0; } + + bool InitState(StateId s, StateId) { + ++nvisit_; + return nvisit_ <= maxvisit_; + } + + bool WhiteArc(StateId s, const Arc &arc) { return true; } + bool GreyArc(StateId s, const Arc &arc) { return true; } + bool BlackArc(StateId s, const Arc &arc) { return true; } + void FinishState(StateId s) {} + void FinishVisit() {} + + private: + StateId maxvisit_; + StateId nvisit_; +}; + + +} // namespace fst + +#endif // FST_LIB_VISIT_H__ diff --git a/extlibs/openfstwin-1.3.1/include/fst/weight.h b/extlibs/openfstwin-1.3.1/include/fst/weight.h new file mode 100755 index 00000000000..7eb4bb1ee2a --- /dev/null +++ b/extlibs/openfstwin-1.3.1/include/fst/weight.h @@ -0,0 +1,179 @@ +// weight.h + +// 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. +// +// Copyright 2005-2010 Google, Inc. +// Author: riley@google.com (Michael Riley) +// +// \file +// General weight set and associated semiring operation definitions. +// +// A semiring is specified by two binary operations Plus and Times and +// two designated elements Zero and One with the following properties: +// Plus: associative, commutative, and has Zero as its identity. +// Times: associative and has identity One, distributes w.r.t. Plus, and +// has Zero as an annihilator: +// Times(Zero(), a) == Times(a, Zero()) = Zero(). +// +// A left semiring distributes on the left; a right semiring is +// similarly defined. +// +// A Weight class must have binary functions =Plus= and =Times= and +// static member functions =Zero()= and =One()= and these must form +// (at least) a left or right semiring. +// +// In addition, the following should be defined for a Weight: +// Member: predicate on set membership. +// NoWeight: static member function that returns an element that is +// not a set member; used to signal an error. +// >>: reads textual representation of a weight. +// <<: prints textual representation of a weight. +// Read(istream &strm): reads binary representation of a weight. +// Write(ostream &strm): writes binary representation of a weight. +// Hash: maps weight to size_t. +// ApproxEqual: approximate equality (for inexact weights) +// Quantize: quantizes wrt delta (for inexact weights) +// Divide: for all a,b,c s.t. Times(a, b) == c +// --> b' = Divide(c, a, DIVIDE_LEFT) if a left semiring, b'.Member() +// and Times(a, b') == c +// --> a' = Divide(c, b, DIVIDE_RIGHT) if a right semiring, a'.Member() +// and Times(a', b) == c +// --> b' = Divide(c, a) = Divide(c, a, DIVIDE_ANY) = +// Divide(c, a, DIVIDE_LEFT) = Divide(c, a, DIVIDE_RIGHT) if a +// commutative semiring, b'.Member() and Times(a, b') = Times(b', a) = c +// ReverseWeight: the type of the corresponding reverse weight. +// Typically the same type as Weight for a (both left and right) semiring. +// For the left string semiring, it is the right string semiring. +// Reverse: a mapping from Weight to ReverseWeight s.t. +// --> Reverse(Reverse(a)) = a +// --> Reverse(Plus(a, b)) = Plus(Reverse(a), Reverse(b)) +// --> Reverse(Times(a, b)) = Times(Reverse(b), Reverse(a)) +// Typically the identity mapping in a (both left and right) semiring. +// In the left string semiring, it maps to the reverse string +// in the right string semiring. +// Properties: specifies additional properties that hold: +// LeftSemiring: indicates weights form a left semiring. +// RightSemiring: indicates weights form a right semiring. +// Commutative: for all a,b: Times(a,b) == Times(b,a) +// Idempotent: for all a: Plus(a, a) == a. +// Path: for all a, b: Plus(a, b) == a or Plus(a, b) == b. + + +#ifndef FST_LIB_WEIGHT_H__ +#define FST_LIB_WEIGHT_H__ + +#include +#include +#include +#include + +#include + +#include + + +namespace fst { + +// +// CONSTANT DEFINITIONS +// + +// A representable float near .001 +const float kDelta = 1.0F/1024.0F; + +// For all a,b,c: Times(c, Plus(a,b)) = Plus(Times(c,a), Times(c, b)) +const uint64 kLeftSemiring = 0x0000000000000001ULL; + +// For all a,b,c: Times(Plus(a,b), c) = Plus(Times(a,c), Times(b, c)) +const uint64 kRightSemiring = 0x0000000000000002ULL; + +const uint64 kSemiring = kLeftSemiring | kRightSemiring; + +// For all a,b: Times(a,b) = Times(b,a) +const uint64 kCommutative = 0x0000000000000004ULL; + +// For all a: Plus(a, a) = a +const uint64 kIdempotent = 0x0000000000000008ULL; + +// For all a,b: Plus(a,b) = a or Plus(a,b) = b +const uint64 kPath = 0x0000000000000010ULL; + + +// Determines direction of division. +enum DivideType { DIVIDE_LEFT, // left division + DIVIDE_RIGHT, // right division + DIVIDE_ANY }; // division in a commutative semiring + +// NATURAL ORDER +// +// By definition: +// a <= b iff a + b = a +// The natural order is a negative partial order iff the semiring is +// idempotent. It is trivially monotonic for plus. It is left +// (resp. right) monotonic for times iff the semiring is left +// (resp. right) distributive. It is a total order iff the semiring +// has the path property. See Mohri, "Semiring Framework and +// Algorithms for Shortest-Distance Problems", Journal of Automata, +// Languages and Combinatorics 7(3):321-350, 2002. We define the +// strict version of this order below. + +template +class NaturalLess { + public: + typedef W Weight; + + NaturalLess() { + if (!(W::Properties() & kIdempotent)) { + FSTERROR() << "NaturalLess: Weight type is not idempotent: " + << W::Type(); + } + } + + bool operator()(const W &w1, const W &w2) const { + return (Plus(w1, w2) == w1) && w1 != w2; + } +}; + + +// Power is the iterated product for arbitrary semirings such that +// Power(w, 0) is One() for the semiring, and +// Power(w, n) = Times(Power(w, n-1), w) + +template +W Power(W w, size_t n) { + W result = W::One(); + for (size_t i = 0; i < n; ++i) { + result = Times(result, w); + } + return result; +} + +// General weight converter - raises error. +template +struct WeightConvert { + W2 operator()(W1 w1) const { + FSTERROR() << "WeightConvert: can't convert weight from \"" + << W1::Type() << "\" to \"" << W2::Type(); + return W2::NoWeight(); + } +}; + +// Specialized weight converter to self. +template +struct WeightConvert { + W operator()(W w) const { return w; } +}; + +} // namespace fst + +#endif // FST_LIB_WEIGHT_H__ diff --git a/extlibs/openfstwin-1.3.1/lib/Win32/openfst.lib b/extlibs/openfstwin-1.3.1/lib/Win32/openfst.lib new file mode 100755 index 0000000000000000000000000000000000000000..b4344245123c4e3c1e606fdaf00635cac0e45110 GIT binary patch literal 399266 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

g4D=G#OC+eDd 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 literal 0 HcmV?d00001 diff --git a/msbuild/kaldi.targets b/msbuild/kaldi.targets index 4923de22c2b..3b6d6bf3789 100755 --- a/msbuild/kaldi.targets +++ b/msbuild/kaldi.targets @@ -1,131 +1,134 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_RunTest Condition=" $(KaldiBuildDepth) >= 3 ">true - - - <_LibraryTarget Include="$(MSBuildProjectFile)" Condition=" '@(LibSource)' != '' "> - BuildStage=Library - - <_BinaryTarget Include="$(MSBuildProjectFile)" Condition=" '@(BinSource)' != '' "> - BuildStage=Binary;KaldiBinaryTarget=%(filename) - - <_TestTarget Include="$(MSBuildProjectFile)" Condition=" '@(TestSource)' != '' "> - BuildStage=Binary;KaldiBinaryTarget=%(filename);RunTest=$(_RunTest) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(OutDir)$(MSBuildProjectName).lib;%(Link.AdditionalDependencies) - - - - - - @(DependsOnLibs->'$(OutDir)%(identity).lib');%(Link.AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_RunTest Condition=" $(KaldiBuildDepth) >= 3 ">true + + + <_LibraryTarget Include="$(MSBuildProjectFile)" Condition=" '@(LibSource)' != '' "> + BuildStage=Library + + <_BinaryTarget Include="$(MSBuildProjectFile)" Condition=" '@(BinSource)' != '' "> + BuildStage=Binary;KaldiBinaryTarget=%(filename) + + <_TestTarget Include="$(MSBuildProjectFile)" Condition=" '@(TestSource)' != '' "> + BuildStage=Binary;KaldiBinaryTarget=%(filename);RunTest=$(_RunTest) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(OutDir)$(MSBuildProjectName).lib;%(Link.AdditionalDependencies) + + + + + + @(DependsOnLibs->'$(OutDir)%(identity).lib');%(Link.AdditionalDependencies) + + + + + + + + + + + + + + + + <_TestSucceeded>$(MSBuildLastTaskResult) + + + + + + + + + + + + + + diff --git a/src/base/kaldi-error-test.cc b/src/base/kaldi-error-test.cc index 20301e2702f..0b876b75200 100644 --- a/src/base/kaldi-error-test.cc +++ b/src/base/kaldi-error-test.cc @@ -49,5 +49,6 @@ int main() { } catch (std::runtime_error &r) { std::cout << "UnitTestError: the error we generated was: " << r.what(); } + return 0; } diff --git a/src/bin/phones-to-prons.cc b/src/bin/phones-to-prons.cc index c420188fc00..996133b4dab 100644 --- a/src/bin/phones-to-prons.cc +++ b/src/bin/phones-to-prons.cc @@ -218,6 +218,7 @@ int main(int argc, char *argv[]) { std::cerr << e.what(); return -1; } + return 0; } } //namespace kaldi diff --git a/src/latbin/lattice-oracle.cc b/src/latbin/lattice-oracle.cc index ba83496a947..db759986eef 100644 --- a/src/latbin/lattice-oracle.cc +++ b/src/latbin/lattice-oracle.cc @@ -427,6 +427,7 @@ int main(int argc, char *argv[]) { std::cerr << e.what(); return -1; } + return 0; } } //namespace kaldi

fSMtnjw0`xZYi0oSHh^eMKN&SMHq`>N0L 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¨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

TDdvNRoghTuRLZd7<`D<+cYMWz+@8d8V2YMm! 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Ξ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

lhXUh+3ESxOezBR}dn5Ed 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