00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_TOOLS_DOT_FORMAT_HXX
00018 # define VCSN_TOOLS_DOT_FORMAT_HXX
00019
00020 # include <sstream>
00021 # include <map>
00022
00023 # include <vaucanson/misc/escaper.hh>
00024 # include <vaucanson/tools/dot_format.hh>
00025 # include <vaucanson/automata/concept/handlers.hh>
00026 # include <vaucanson/misc/usual_macros.hh>
00027
00028 namespace vcsn
00029 {
00030 namespace tools
00031 {
00032 inline dot::dot(const std::string& name)
00033 {
00034 std::ostringstream os;
00035 std::set<char> to_escape;
00036 to_escape.insert('"');
00037 (misc::setesc(to_escape))(os) << misc::escaper<std::string>(name);
00038 name_ = std::string("\"") + os.str();
00039 }
00040
00041 template<typename Saver, typename Conv>
00042 void dot::operator()(std::ostream& out, const Saver& s,
00043 const Conv& conv) const
00044 {
00045 typedef typename Saver::automaton_t auto_t;
00046 typedef typename auto_t::hstate_t hstate_t;
00047
00048 const auto_t& a = s.automaton();
00049 unsigned count = 0;
00050 std::map<hstate_t, unsigned> state_map;
00051
00052 out << "digraph vcsn {" << std::endl
00053 << "label=\"" << name_.c_str() + 1 << ' ' << a << "\";" << std::endl
00054 << "node [shape=circle];" << std::endl;
00055
00056 for (typename auto_t::state_iterator i = a.states().begin();
00057 i != a.states().end();
00058 ++i)
00059 {
00060 unsigned c = state_map[*i] = count++;
00061 if (a.is_initial(*i))
00062 {
00063 out << name_ << count
00064 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00065 << std::endl
00066 << name_ << count << "\" -> " << name_ << c
00067 << "\" [label=\"" << conv(a.structure(), a.get_initial(*i))
00068 << "\"];" << std::endl;
00069 ++count;
00070 }
00071 if (a.is_final(*i))
00072 {
00073 out << name_ << count
00074 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00075 << std::endl
00076 << name_ << c << "\" -> " << name_ << count
00077 << "\" [label=\""<< conv(a.structure(), a.get_final(*i))
00078 <<"\"];" << std::endl;
00079 ++count;
00080 }
00081 out << name_ << c << "\" [label=\"" << *i << "\"];" << std::endl;
00082 }
00083 for (typename auto_t::transition_iterator i = a.transitions().begin();
00084 i != a.transitions().end();
00085 ++i)
00086 {
00087 out << name_ << state_map[a.src_of(*i)]
00088 << "\" -> "
00089 << name_ << state_map[a.dst_of(*i)];
00090 out << "\" [label=\"" << conv(a.structure(), a.series_of(*i))
00091 << "\"];" << std::endl;
00092 }
00093 out << "}" << std::endl;
00094 }
00095
00096 inline transducer_dot::transducer_dot(const std::string& name)
00097 {
00098 std::ostringstream os;
00099 std::set<char> to_escape;
00100 to_escape.insert('"');
00101 (misc::setesc(to_escape))(os) << misc::escaper<std::string>(name);
00102 name_ = std::string("\"") + os.str();
00103 }
00104
00105 template<typename Saver, typename Conv>
00106 void transducer_dot::operator()(std::ostream& out, const Saver& s,
00107 const Conv& conv) const
00108 {
00109 typedef typename Saver::automaton_t auto_t;
00110 AUTOMATON_TYPES(auto_t);
00111 const auto_t& a = s.automaton();
00112 unsigned count = 0;
00113 std::map<hstate_t, unsigned> state_map;
00114
00115 out << "digraph vcsn {" << std::endl
00116 << "label=\"" << name_.c_str() + 1 << ' ' << a << "\";" << std::endl
00117 << "node [shape=circle];" << std::endl;
00118
00119 for (typename auto_t::state_iterator i = a.states().begin();
00120 i != a.states().end();
00121 ++i)
00122 {
00123 unsigned c = state_map[*i] = count++;
00124 if (a.is_initial(*i))
00125 {
00126 out << name_ << count
00127 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00128 << std::endl
00129 << name_ << count << "\" -> " << name_ << c << '"';
00130 std::ostringstream o;
00131 series_set_elt_t ss = a.get_initial(*i);
00132 if (ss.supp().begin() == ss.supp().end())
00133 o << "0";
00134 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00135 o << conv(a.structure(), *s) << "|"
00136 << ss.get(monoid_elt_t (a.structure().series().monoid(), *s))
00137 << " ";
00138 out << "[label=\"" << o.str() << "\"];"
00139 << std::endl;
00140 ++count;
00141 }
00142 if (a.is_final(*i))
00143 {
00144 out << name_ << count
00145 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00146 << std::endl
00147 << name_ << c << "\" -> " << name_ << count << '"';
00148 std::ostringstream o;
00149 series_set_elt_t ss = a.get_final(*i);
00150 if (ss.supp().begin() == ss.supp().end())
00151 o << "0";
00152 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00153 o << conv(a.structure(), *s) << "|"
00154 << ss.get(monoid_elt_t (a.structure().series().monoid(), *s))
00155 << " ";
00156 out << "[label=\"" << o.str() << "\"];"
00157 << std::endl;
00158 ++count;
00159 }
00160 out << name_ << c << "\" [label=\"" << *i << "\"];" << std::endl;
00161 }
00162 for (typename auto_t::transition_iterator i = a.transitions().begin();
00163 i != a.transitions().end();
00164 ++i)
00165 {
00166 out << name_ << state_map[a.src_of(*i)]
00167 << "\" -> "
00168 << name_ << state_map[a.dst_of(*i)] << '"';
00169 std::ostringstream o;
00170 series_set_elt_t ss = a.series_of(*i);
00171 if (ss.supp().begin() == ss.supp().end())
00172 o << "0";
00173 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00174 o << conv(a.structure(), *s) << "|"
00175 << ss.get(monoid_elt_t (a.structure().series().monoid(), *s))
00176 << " ";
00177 out << "[label=\"" << o.str() << "\"];"
00178 << std::endl;
00179 }
00180 out << "}" << std::endl;
00181 }
00182
00183 }
00184 }
00185
00186 #endif // ! VCSN_TOOLS_DOT_FORMAT_HXX