27 # ifndef GENERATE_GRAPH_H 28 # define GENERATE_GRAPH_H 31 # include <tpl_dynArray.H> 32 # include <tpl_sort_utils.H> 33 # include <tpl_graph.H> 34 # include <topological_sort.H> 37 using namespace Aleph;
42 template <
class GT,
class SA>
inline static 43 bool is_there_a_double_arc(
const GT * g,
44 typename GT::Node * src,
45 typename GT::Node * tgt) noexcept
47 if (not g->is_digraph())
50 return search_arc<GT,SA>(*g, src, tgt) !=
nullptr and
51 search_arc<GT,SA>(*g, tgt, src) !=
nullptr;
57 typename GT::Node * p) noexcept
59 return sequential_search(nodes, p, 0, nodes.size() - 1);
100 class Write_Node,
class Write_Arc,
101 class Shade_Node,
class Shade_Arc,
class SA>
103 const double & xdist,
105 std::ostream & output)
108 typename GT::Node_Iterator it(g);
109 for (
int i = 0; it.has_curr(); it.next_ne(), ++i)
111 auto p = it.get_current_node_ne();
115 if (Shade_Node() (p).size() != 0)
116 output << Shade_Node() (p) <<
" " << i << endl;
118 const string text_node = Write_Node () (p);
120 if (text_node.size() == 0)
123 output <<
"NODE-TEXT " << i <<
" \"" << text_node <<
"\" 0 0" << endl;
128 auto a = it.get_current_arc_ne();
129 auto src = g.get_src_node(a);
130 auto tgt = g.get_tgt_node(a);
132 const auto src_idx = search_node <GT> (nodes, src);
133 const auto tgt_idx = search_node <GT> (nodes, tgt);
135 if (is_there_a_double_arc <GT, SA> (&g, src, tgt))
136 output <<
"CURVE-ARC " << src_idx <<
" " << tgt_idx <<
" " 137 << xdist/5 <<
" L" << endl;
139 output <<
"ARC " << src_idx <<
" " << tgt_idx << endl;
141 if ( Shade_Arc()(a).size() != 0)
142 output << Shade_Arc()(a) <<
" " 143 << src_idx <<
" " << tgt_idx <<
" " << endl;
145 const string text_arc = Write_Arc() (a);
147 if (text_arc.size() == 0)
150 output <<
"ARC-TEXT " << src_idx <<
" " << tgt_idx <<
" \"" 151 << text_arc <<
"\" 0 0 " << endl;
202 const string & rankdir =
"TB",
206 output <<
"// Generated by generate_graphviz() from Aleph-w library. See at:" << endl
207 <<
"// http://webdelprofesor.ula.ve/ingenieria/lrleon/aleph/html/index.html" << endl
208 <<
"// for documentation" << endl
209 <<
"// Copyleft Leandro Rabindranath Leon lrleon@ula.ve" << endl
210 <<
"// for using of graphviz system. See at http://graphviz.org/" 216 output <<
"digraph {" << endl;
221 output <<
"graph {" << endl;
224 <<
"rankdir = " << rankdir << endl
225 <<
"style = none" << endl
226 <<
"truecolor=false" << endl
227 <<
"ranksep = " << ranksep << endl
228 <<
"nodesep = " << nodesep << endl << endl;
233 for (
int i = 0; it.has_curr(); it.next_ne(), ++i)
235 output << i <<
" [ ";
237 auto p = it.get_current_node_ne();
240 if (Shade_Node () (p))
241 output <<
"style = bold ";
243 const string text_node = Write_Node () (p);
245 if (text_node.size() != 0)
246 output <<
"label = \"" << text_node <<
"\"";
247 output <<
"]" << endl;
254 auto a = it.get_current_arc_ne();
255 auto src = g.get_src_node(a);
256 auto tgt = g.get_tgt_node(a);
258 auto src_idx = search_node <GT> (nodes, src);
259 auto tgt_idx = search_node <GT> (nodes, tgt);
261 output << src_idx << arc_str << tgt_idx <<
" [";
263 if (Shade_Arc () (a))
264 output <<
"style = bold ";
266 const string text_arc = Write_Arc() (a);
268 if (text_arc.size() != 0)
269 output <<
"label = \"" << text_arc <<
"\"";
270 output <<
"]" << endl;
273 output <<
"}" << endl;
312 Node_Attr node_attr = Node_Attr(),
313 Arc_Attr arc_attr = Arc_Attr(),
314 const string & rankdir =
"TB")
316 out <<
"// Generated by generate_graphviz() from Aleph-w library" << endl
318 <<
"// http://webdelprofesor.ula.ve/ingenieria/lrleon/aleph/html/index.html" << endl
319 <<
"// for documentation of Aleph-w library" << endl
320 <<
"// Copyleft Leandro Rabindranath Leon lrleon@ula.ve" << endl
321 <<
"// for using of graphviz system. See at http://graphviz.org/" 323 << (g.is_digraph() ?
"digraph {" :
"graph {") << endl
325 <<
"rankdir = " << rankdir << endl
327 <<
"// Node list" << endl
333 for (
int i = 0; it.has_curr(); it.next_ne(), ++i)
335 auto p = it.get_current_node_ne();
337 nodes_table.insert(p, i);
341 node_attr (g, p, out);
348 <<
"// Arc list" << endl
351 const string arrow = g.is_digraph() ?
"->" :
"--";
355 auto a = it.get_current_arc_ne();
356 auto src = g.get_src_node(a);
357 auto tgt = g.get_tgt_node(a);
359 const auto src_idx = nodes_table.find(src);
360 const auto tgt_idx = nodes_table.find(tgt);
362 out << src_idx << arrow << tgt_idx <<
" [";
363 arc_attr (g, a, out) ;
405 Node_Attr node_attr = Node_Attr(),
406 Arc_Attr arc_attr = Arc_Attr(),
407 const string & rankdir =
"LR")
409 out <<
"// Generated by generate_graphviz() from Aleph-w library" << endl
411 <<
"// http://webdelprofesor.ula.ve/ingenieria/lrleon/aleph/html/index.html" << endl
412 <<
"// for documentation of Aleph-w library" << endl
413 <<
"// Copyleft Leandro Rabindranath Leon lrleon@ula.ve" << endl
414 <<
"// for using of graphviz system. See at http://graphviz.org/" 416 <<
"digraph {" << endl
418 <<
"rankdir = " << rankdir << endl
420 <<
"// Node list" << endl
426 for (
int i = 0; it.has_curr(); it.next_ne(), ++i)
428 auto p = it.get_current_node_ne();
433 node_attr (g, p, out);
440 <<
"// Arc list" << endl
443 const string arrow =
"->";
447 auto a = it.get_current_arc_ne();
448 auto src = g.get_src_node(a);
449 auto tgt = g.get_tgt_node(a);
451 const auto src_idx = nodes_table.
find(src);
452 const auto tgt_idx = nodes_table.
find(tgt);
454 out << src_idx << arrow << tgt_idx <<
" [";
455 arc_attr (g, a, out) ;
497 Node_Attr node_attr = Node_Attr(),
498 Arc_Attr arc_attr = Arc_Attr(),
499 const string & rankdir =
"LR")
501 out <<
"// Generated by generate_graphviz() from Aleph-w library" << endl
503 <<
"// http://webdelprofesor.ula.ve/ingenieria/lrleon/aleph/html/index.html" << endl
504 <<
"// for documentation of Aleph-w library" << endl
505 <<
"// Copyleft Leandro Rabindranath Leon lrleon@ula.ve" << endl
506 <<
"// for using of graphviz system. See at http://graphviz.org/" 508 <<
"digraph {" << endl
510 <<
"rankdir = " << rankdir << endl
511 <<
"rank = same" << endl
513 <<
"// Node list" << endl
518 size_t rank = 0, i = 0;
519 for (
auto rank_it = ranks.
get_it(); rank_it.has_curr();
520 rank_it.next_ne(), ++rank)
522 out <<
"subgraph rank_" << rank << endl
524 <<
"label = \"rank " << rank <<
"\"" << endl;
525 for (
auto it = rank_it.get_curr_ne().get_it(); it.has_curr();
528 auto p = it.get_curr_ne();
531 node_attr(g, p, out);
539 <<
"// Arc list" << endl
542 const string arrow =
"->";
545 auto a = it.get_current_arc_ne();
546 auto src = g.get_src_node(a);
547 auto tgt = g.get_tgt_node(a);
549 const auto src_idx = nodes_table.
find(src);
550 const auto tgt_idx = nodes_table.
find(tgt);
552 out << src_idx << arrow << tgt_idx <<
" [";
553 arc_attr (g, a, out) ;
562 void operator () (
const GT&,
typename GT::Node * p, std::ostream & out)
564 out <<
"label = \"" << p->get_info() <<
"\"";
571 void operator () (
const GT&,
typename GT::Arc * a, std::ostream & out)
573 out <<
"label = \"" << a->get_info() <<
"\"";
626 class Node_Attr = Dft_Node_Attr<GT>,
627 class Arc_Attr = Dft_Arc_Attr<GT>,
641 void operator () (
const GT & g, std::ostream & out,
642 const Node_Attr & node_attr = Node_Attr(),
643 const Arc_Attr & arc_attr = Arc_Attr(),
644 const string & rankdir =
"LR")
646 generate_graphviz <GT, Node_Attr, Arc_Attr, SN, SA>
647 (g, out, node_attr, arc_attr, rankdir);
650 void digraph(
const GT & g, std::ostream & out,
651 const Node_Attr & node_attr = Node_Attr(),
652 const Arc_Attr & arc_attr = Arc_Attr(),
653 const string & rankdir =
"LR")
655 digraph_graphviz <GT, Node_Attr, Arc_Attr, SN, SA>
656 (g, out, node_attr, arc_attr, rankdir);
659 void ranks(
const GT & g, std::ostream & out,
660 const Node_Attr & node_attr = Node_Attr(),
661 const Arc_Attr & arc_attr = Arc_Attr(),
662 const string & rankdir =
"LR")
664 rank_graphviz <GT, Node_Attr, Arc_Attr, SN, SA>
665 (g, out, node_attr, arc_attr, rankdir);
674 bool operator () (
typename GT::Node *)
const {
return false; }
676 bool operator () (
typename GT::Arc *)
const {
return false; }
713 class Shade_Node = Dummy_Attr<GT>,
714 class Shade_Arc = Dummy_Attr<GT>,
715 class Dashed_Node = Dummy_Attr<GT>,
716 class Dashed_Arc = Dummy_Attr<GT>,
730 void operator () (GT & g, std::ostream & out,
731 const string & rankdir =
"TB",
732 float ranksep = 0.4,
float nodesep = 0.4)
735 Shade_Arc, Dashed_Node, Dashed_Arc, SA, SN>
736 (g, out, rankdir, ranksep, nodesep);
779 class Write_Node,
class Write_Arc,
780 class Shade_Node,
class Shade_Arc,
class SA>
782 const size_t & nodes_by_level,
783 const double & xdist,
784 const double & ydist,
788 out <<
"cross-net-digraph ";
790 out <<
"cross-net-graph ";
792 out << g.get_num_nodes() <<
" " << nodes_by_level <<
" " 793 << xdist <<
" " << ydist << endl
796 generate_graphpic<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc, SA>
797 (g, xdist, ydist, out);
801 class Write_Node,
class Write_Arc,
802 class Shade_Node,
class Shade_Arc>
804 const size_t & nodes_by_level,
805 const double & xdist,
806 const double & ydist,
810 generate_cross_graph<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc, DSA>
811 (g, nodes_by_level, xdist, ydist, out);
853 class Write_Node,
class Write_Arc,
854 class Shade_Node,
class Shade_Arc,
class SA>
856 const size_t & nodes_by_level,
857 const double & xdist,
858 const double & ydist,
862 out <<
"net-digraph ";
866 out << g.get_num_nodes() <<
" " << nodes_by_level <<
" " 867 << xdist <<
" " << ydist << endl
870 generate_graphpic<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc, SA>
871 (g, xdist, ydist, out);
875 class Write_Node,
class Write_Arc,
876 class Shade_Node,
class Shade_Arc>
878 const size_t & nodes_by_level,
879 const double & xdist,
880 const double & ydist,
884 generate_net_graph<GT, Write_Node, Write_Arc, Shade_Node, Shade_Arc, DSA>
885 (g, nodes_by_level, xdist, ydist, out);
889 template <
class GT>
struct __Shade_Node
891 string operator () (
typename GT::Node *)
const 898 template <
class GT>
struct __Shade_Arc
900 string operator () (
typename GT::Arc *)
const 907 template <
class GT,
class Write_Node,
class Write_Arc,
class SA>
909 const size_t & nodes_by_level,
910 const double & xdist,
911 const double & ydist,
915 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT>, SA>
916 (g, nodes_by_level, xdist, ydist, out);
919 template <
class GT,
class Write_Node,
class Write_Arc,
class SA>
921 const size_t & nodes_by_level,
922 const double & xdist,
923 const double & ydist,
927 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT>, SA>
928 (g, nodes_by_level, xdist, ydist, out);
932 template <
class GT,
class Write_Node,
class Write_Arc>
934 const size_t & nodes_by_level,
935 const double & xdist,
936 const double & ydist,
941 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT>, DSA>
942 (g, nodes_by_level, xdist, ydist, out);
945 template <
class GT,
class Write_Node,
class Write_Arc>
947 const size_t & nodes_by_level,
948 const double & xdist,
949 const double & ydist,
954 <GT, Write_Node, Write_Arc, __Shade_Node<GT>, __Shade_Arc<GT>, DSA>
955 (g, nodes_by_level, xdist, ydist, out);
962 # endif // GENERATE_GRAPH_H Definition: tpl_graph.H:1225
Pair * insert(const Key &key, const Type &data)
Definition: tpl_dynMapTree.H:112
Definition: topological_sort.H:136
auto get_it() const
Definition: htlist.H:151
Definition: generate_graph.H:719
void generate_graphviz(const GT &g, std::ostream &out, Node_Attr node_attr=Node_Attr(), Arc_Attr arc_attr=Arc_Attr(), const string &rankdir="TB")
Definition: generate_graph.H:311
Definition: tpl_graph.H:1257
Definition: generate_graph.H:630
void generate_graphpic(const GT &g, const double &xdist, const double &, std::ostream &output)
Definition: generate_graph.H:102
Definition: tpl_graph.H:1063
size_t rank_graphviz(const GT &g, std::ostream &out, Node_Attr node_attr=Node_Attr(), Arc_Attr arc_attr=Arc_Attr(), const string &rankdir="LR")
Definition: generate_graph.H:496
Definition: tpl_dynMapTree.H:357
void generate_net_graph(GT &g, const size_t &nodes_by_level, const double &xdist, const double &ydist, std::ostream &out)
Definition: generate_graph.H:855
Definition: tpl_graph.H:1270
Definition: tpl_dynArray.H:159
void generate_cross_graph(GT &g, const size_t &nodes_by_level, const double &xdist, const double &ydist, std::ostream &out)
Definition: generate_graph.H:781
void digraph_graphviz(const GT &g, std::ostream &out, Node_Attr node_attr=Node_Attr(), Arc_Attr arc_attr=Arc_Attr(), const string &rankdir="LR")
Definition: generate_graph.H:404
Type & find(const Key &key)
Definition: tpl_dynMapTree.H:242