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