1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// draw.h 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License"); 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License. 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// http://www.apache.org/licenses/LICENSE-2.0 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS, 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License. 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc. 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: allauzen@google.com (Cyril Allauzen) 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// \file 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Class to draw a binary FST by producing a text file in dot format, 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// helper class to fstdraw.cc 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_SCRIPT_DRAW_IMPL_H_ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_SCRIPT_DRAW_IMPL_H_ 24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <sstream> 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string> 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/script/fst-class.h> 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/fst.h> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/util.h> 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Print a binary Fst in the dot textual format, helper class for fstdraw.cc 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WARNING: Stand-alone use not recommend. 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> class FstDrawer { 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A Arc; 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Label Label; 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FstDrawer(const Fst<A> &fst, 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *isyms, 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *osyms, 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *ssyms, 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool accep, 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string title, 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float width, 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float height, 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool portrait, 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool vertical, 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float ranksep, 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float nodesep, 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int fontsize, 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int precision, 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool show_weight_one) 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : fst_(fst), isyms_(isyms), osyms_(osyms), ssyms_(ssyms), 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson accep_(accep && fst.Properties(kAcceptor, true)), ostrm_(0), 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson title_(title), width_(width), height_(height), portrait_(portrait), 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vertical_(vertical), ranksep_(ranksep), nodesep_(nodesep), 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fontsize_(fontsize), precision_(precision), 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson show_weight_one_(show_weight_one) {} 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Draw Fst to an output buffer (or stdout if buf = 0) 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Draw(ostream *strm, const string &dest) { 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ostrm_ = strm; 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson dest_ = dest; 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId start = fst_.Start(); 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (start == kNoStateId) 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("digraph FST {\n"); 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (vertical_) 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("rankdir = BT;\n"); 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("rankdir = LR;\n"); 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("size = \""); 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(width_); 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(","); 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(height_); 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\";\n"); 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!dest_.empty()) 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("label = \"" + title_ + "\";\n"); 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("center = 1;\n"); 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (portrait_) 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("orientation = Portrait;\n"); 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("orientation = Landscape;\n"); 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("ranksep = \""); 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(ranksep_); 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\";\n"); 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("nodesep = \""); 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(nodesep_); 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\";\n"); 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // initial state first 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DrawState(start); 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (StateIterator< Fst<A> > siter(fst_); 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !siter.Done(); 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson siter.Next()) { 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s = siter.Value(); 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (s != start) 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DrawState(s); 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("}\n"); 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Maximum line length in text file. 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson static const int kLineLen = 8096; 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void PrintString(const string &s) const { 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *ostrm_ << s; 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Escapes backslash and double quote if these occur in the string. Dot will 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // not deal gracefully with these if they are not escaped. 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson inline void EscapeChars(const string &s, string* ns) const { 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const char* c = s.c_str(); 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson while (*c) { 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (*c == '\\' || *c == '"') ns->push_back('\\'); 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ns->push_back(*c); 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ++c; 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void PrintId(int64 id, const SymbolTable *syms, 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const char *name) const { 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (syms) { 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string symbol = syms->Find(id); 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (symbol == "") { 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FSTERROR() << "FstDrawer: Integer " << id 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << " is not mapped to any textual symbol" 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << ", symbol table = " << syms->Name() 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << ", destination = " << dest_; 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson symbol = "?"; 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string nsymbol; 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson EscapeChars(symbol, &nsymbol); 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(nsymbol); 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 142dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin string idstr; 143dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin Int64ToStr(id, &idstr); 144dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin PrintString(idstr); 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void PrintStateId(StateId s) const { 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintId(s, ssyms_, "state ID"); 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void PrintILabel(Label l) const { 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintId(l, isyms_, "arc input label"); 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void PrintOLabel(Label l) const { 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintId(l, osyms_, "arc output label"); 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson template <class T> 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void Print(T t) const { 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson *ostrm_ << t; 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson void DrawState(StateId s) const { 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(s); 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" [label = \""); 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintStateId(s); 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight final = fst_.Final(s); 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (final != Weight::Zero()) { 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (show_weight_one_ || (final != Weight::One())) { 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("/"); 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(final); 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\", shape = doublecircle,"); 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\", shape = circle,"); 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (s == fst_.Start()) 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" style = bold,"); 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson else 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" style = solid,"); 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" fontsize = "); 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(fontsize_); 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("]\n"); 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson for (ArcIterator< Fst<A> > aiter(fst_, s); 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson !aiter.Done(); 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson aiter.Next()) { 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Arc arc = aiter.Value(); 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\t"); 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(s); 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" -> "); 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(arc.nextstate); 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(" [label = \""); 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintILabel(arc.ilabel); 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!accep_) { 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString(":"); 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintOLabel(arc.olabel); 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (show_weight_one_ || (arc.weight != Weight::One())) { 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("/"); 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(arc.weight); 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("\", fontsize = "); 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Print(fontsize_); 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson PrintString("];\n"); 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const Fst<A> &fst_; 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *isyms_; // ilabel symbol table 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *osyms_; // olabel symbol table 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *ssyms_; // slabel symbol table 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool accep_; // print as acceptor when possible 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ostream *ostrm_; // drawn FST destination 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string dest_; // drawn FST destination name 217f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 218f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string title_; 219f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float width_; 220f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float height_; 221f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool portrait_; 222f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool vertical_; 223f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float ranksep_; 224f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson float nodesep_; 225f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int fontsize_; 226f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int precision_; 227f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool show_weight_one_; 228f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 229f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(FstDrawer); 230f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 231f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 232f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 233f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 234f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_SCRIPT_DRAW_IMPL_H_ 235