00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 # include <fstream>
00045 # include <tpl_sort_utils.H>
00046 # include <tpl_graph.H>
00047
00048 using namespace std;
00049 using namespace Aleph;
00050
00051
00052 template <typename GT> inline static
00053 bool is_there_a_double_arc(GT * g,
00054 typename GT::Node * src,
00055 typename GT::Node * tgt)
00056 {
00057 if (not g->is_digraph())
00058 return false;
00059
00060 return g->search_arc(src, tgt) != NULL and g->search_arc(tgt, src) != NULL;
00061 }
00062
00063
00064 template <typename GT>
00065 static int search_node(DynArray<typename GT::Node *> & nodes,
00066 typename GT::Node * p)
00067 {
00068 return sequential_search(nodes, p, 0, nodes.size() - 1);
00069 }
00070
00071
00072 template <typename GT,
00073 class Write_Node, class Write_Arc,
00074 class Shade_Node, class Shade_Arc> static
00075 void generate_graphpic(GT & g,
00076 const double & xdist,
00077 const double & ,
00078 std::ofstream & output)
00079 {
00080 DynArray<typename GT::Node *> nodes;
00081
00082 typename GT::Node_Iterator it(g);
00083 for (int i = 0; it.has_current(); it.next(), ++i)
00084 {
00085 typename GT::Node * p = it.get_current_node();
00086
00087 nodes[i] = p;
00088
00089 if (Shade_Node() (p).size() != 0)
00090 output << Shade_Node() (p) << " " << i << endl;
00091
00092 const string text_node = Write_Node () (p);
00093
00094 if (text_node.size() == 0)
00095 continue;
00096
00097 output << "NODE-TEXT " << i << " \"" << text_node << "\" 0 0" << endl;
00098 }
00099
00100 for (typename GT::Arc_Iterator it(g); it.has_current(); it.next())
00101 {
00102 typename GT::Arc * a = it.get_current_arc();
00103
00104 typename GT::Node * src = g.get_src_node(a);
00105 typename GT::Node * tgt = g.get_tgt_node(a);
00106
00107 const int src_idx = search_node <GT> (nodes, src);
00108 const int tgt_idx = search_node <GT> (nodes, tgt);
00109
00110 if (is_there_a_double_arc <GT> (&g, src, tgt))
00111 output << "CURVE-ARC " << src_idx << " " << tgt_idx << " "
00112 << xdist/5 << " L" << endl;
00113 else
00114 output << "ARC " << src_idx << " " << tgt_idx << endl;
00115
00116 if ( Shade_Arc()(a).size() != 0)
00117 output << Shade_Arc()(a) << " "
00118 << src_idx << " " << tgt_idx << " " << endl;
00119
00120 const string text_arc = Write_Arc() (a);
00121
00122 if (text_arc.size() == 0)
00123 continue;
00124
00125 output << "ARC-TEXT " << src_idx << " " << tgt_idx << " \""
00126 << text_arc << "\" 0 0 " << endl;
00127 }
00128 }
00129
00167 template <typename GT,
00168 class Write_Node, class Write_Arc,
00169 class Shade_Node, class Shade_Arc>
00170 void generate_cross_graph(GT & g,
00171 const size_t & nodes_by_level,
00172 const double & xdist,
00173 const double & ydist,
00174 std::ofstream & output)
00175 {
00176 if (g.is_digraph())
00177 output << "cross-net-digraph ";
00178 else
00179 output << "cross-net-graph ";
00180
00181 output << g.get_num_nodes() << " " << nodes_by_level << " "
00182 << xdist << " " << ydist << endl
00183 << endl;
00184
00185 generate_graphpic<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc>
00186 (g, xdist, ydist, output);
00187 }
00188
00226 template <typename GT,
00227 class Write_Node, class Write_Arc,
00228 class Shade_Node, class Shade_Arc>
00229 void generate_net_graph(GT & g,
00230 const size_t & nodes_by_level,
00231 const double & xdist,
00232 const double & ydist,
00233 std::ofstream & output)
00234 {
00235 if (g.is_digraph())
00236 output << "net-digraph ";
00237 else
00238 output << "net-graph ";
00239
00240 output << g.get_num_nodes() << " " << nodes_by_level << " "
00241 << xdist << " " << ydist << endl
00242 << endl;
00243
00244 generate_graphpic<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc>
00245 (g, xdist, ydist, output);
00246 }
00247
00248 template <typename GT> struct __Shade_Node
00249 {
00250 string operator () (typename GT::Node *) const
00251 {
00252 return "";
00253 }
00254 };
00255
00256
00257 template <typename GT> struct __Shade_Arc
00258 {
00259 string operator () (typename GT::Arc *) const
00260 {
00261 return "";
00262 }
00263 };
00264
00265
00266 template <typename GT, class Write_Node, class Write_Arc>
00267 void generate_cross_graph(GT & g,
00268 const size_t & nodes_by_level,
00269 const double & xdist,
00270 const double & ydist,
00271 std::ofstream & output)
00272 {
00273 generate_cross_graph
00274 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT> >
00275 (g, nodes_by_level, xdist, ydist, output);
00276 }
00277
00278 template <typename GT, class Write_Node, class Write_Arc>
00279 void generate_net_graph(GT & g,
00280 const size_t & nodes_by_level,
00281 const double & xdist,
00282 const double & ydist,
00283 std::ofstream & output)
00284 {
00285 generate_net_graph
00286 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT> >
00287 (g, nodes_by_level, xdist, ydist, output);
00288 }