generate_graph.H

00001 
00002 /*
00003   This file is part of Aleph system
00004 
00005   Copyright (c) 2002, 2003, 2004, 2005, 2006
00006   UNIVERSITY LOS ANDES (ULA) Merida - REPÚBLICA BOLIVARIANA DE VENEZUELA  
00007 
00008   - Center of Studies in Microelectronics & Distributed Systems (CEMISID) 
00009   - ULA Computer Science Department
00010   - FUNDACITE Mérida - Ministerio de Ciencia y Tecnología
00011 
00012   PERMISSION TO USE, COPY, MODIFY AND DISTRIBUTE THIS SOFTWARE AND ITS
00013   DOCUMENTATION IS HEREBY GRANTED, PROVIDED THAT BOTH THE COPYRIGHT
00014   NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES OF THE
00015   SOFTWARE, DERIVATIVE WORKS OR MODIFIED VERSIONS, AND ANY PORTIONS
00016   THEREOF, AND THAT BOTH NOTICES APPEAR IN SUPPORTING DOCUMENTATION.
00017 
00018   Aleph is distributed in the hope that it will be useful, but WITHOUT
00019   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00020   or FITNESS FOR A PARTICULAR PURPOSE.
00021 
00022   UNIVERSIDAD DE LOS ANDES requests users of this software to return to 
00023 
00024   Leandro Leon
00025   CEMISID 
00026   Ed La Hechicera 
00027   3er piso, ala sur
00028   Facultad de Ingenieria 
00029   Universidad de Los Andes 
00030   Merida - REPÚBLICA BOLIVARIANA DE VENEZUELA    or
00031 
00032   lrleon@ula.ve
00033 
00034   any improvements or extensions that they make and grant Universidad 
00035   de Los Andes (ULA) the rights to redistribute these changes. 
00036 
00037   Aleph is (or was) granted by: 
00038   - Consejo de Desarrollo Cientifico, Humanistico, Tecnico de la ULA 
00039     (CDCHT)
00040   - Fundacite Mérida
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 &  /* ydist no usado por ahora */,
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 }

Leandro R. León