[Lemon-commits] [lemon_svn] hegyi: r2990 - glemon/trunk

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 21:51:40 CET 2006


Author: hegyi
Date: Fri Oct 13 17:31:58 2006
New Revision: 2990

Modified:
   glemon/trunk/algowin.cc
   glemon/trunk/dijkstrabox.cc
   glemon/trunk/dijkstrabox.h
   glemon/trunk/main_win.cc

Log:
Suurballe algorithm is implemented in glemon.

Modified: glemon/trunk/algowin.cc
==============================================================================
--- glemon/trunk/algowin.cc	(original)
+++ glemon/trunk/algowin.cc	Fri Oct 13 17:31:58 2006
@@ -44,6 +44,10 @@
       ab=new DijkstraBox(tabnames);
       set_title("Dijkstra Algorithm");
       break;
+    case 3:
+      ab=new SuurballeBox(tabnames);
+      set_title("Suurballe Algorithm");
+      break;
     default:
       break;
     }

Modified: glemon/trunk/dijkstrabox.cc
==============================================================================
--- glemon/trunk/dijkstrabox.cc	(original)
+++ glemon/trunk/dijkstrabox.cc	Fri Oct 13 17:31:58 2006
@@ -1,4 +1,7 @@
 #include <dijkstrabox.h>
+#include <lemon/dijkstra.h>
+#include <lemon/suurballe.h>
+#include <lemon/path.h>
 
 enum {INPUT, OUTPUT, MAP_NUM};
 
@@ -7,6 +10,23 @@
   init(t);
 }
     
+SuurballeBox::SuurballeBox(std::vector<std::string> t):DijkstraBox(t)
+{
+  Gtk::Adjustment * adjustment=new Gtk::Adjustment(2, 1, 20, 1, 5);
+  num_set = new Gtk::SpinButton(*adjustment, 5,0);
+
+  Gtk::Label * label=new Gtk::Label("No. of paths to find: ");
+//   hbox.pack_start(*label);
+//   hbox.pack_start(*num_set);
+//   hbox.show_all_children();
+
+  table.attach(*label, 0,1,2,3);
+  table.attach(*num_set, 1,2,2,3);
+
+
+//   pack_start(hbox);
+}
+    
 void DijkstraBox::run()
 {
   if(
@@ -18,42 +38,28 @@
      )
     {
       const Graph &g=mapstorage->graph;
+      Node from, to;
 
-      Graph::EdgeMap<double> * inputmap=
-	(mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
-      Graph::EdgeMap<double> * outputmap=
-	(mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
+      get_from_to(from, to, (Graph&)g);
 
-      Node from, to;
-      int assigned=0;
       std::ostringstream o;
 
-      //zero out output map
-      for (EdgeIt i(g); i!=INVALID; ++i)
+      if(!(from==to))
 	{
-	  (*outputmap)[i]=0;
-	}
+	  Graph::EdgeMap<double> * inputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
+	  Graph::EdgeMap<double> * outputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
 
-      for (NodeIt i(g); (i!=INVALID) && (assigned<2); ++i)
-	{
-	  std::ostringstream text;
-	  text << (*((mapstorage->nodemap_storage)["label"]))[i];
-	  if(!(text.str().compare(source.get_active_text())))
-	    {
-	      from=i;
-	      assigned++;
-	    }
-	  if(!(text.str().compare(target.get_active_text())))
+	  //zero out output map
+	  for (EdgeIt i(g); i!=INVALID; ++i)
 	    {
-	      to=i;
-	      assigned++;
+	      (*outputmap)[i]=0;
 	    }
-	}
-      if(!(from==to))
-	{
+	  
 	  Dijkstra<Graph, Graph::EdgeMap<double> > dijkstra(g, *inputmap);
 	  dijkstra.run(from, to);
-
+	  
 	  if(dijkstra.reached(to))
 	    {
 	      Node n=to;
@@ -73,13 +79,78 @@
 	      o << source.get_active_text() << " and " << target.get_active_text();
 	    }
 	  resultlabel.set_text(o.str());
+	  
+	  mapstorage->mapChanged(true, (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_COLOR,
+	  // 			      (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_TEXT,
+	  // 			      (edgemapcbts[INPUT])->get_active_text());
+	}
+    }
+}
 
+void SuurballeBox::run()
+{
+  if(
+     tabcbt.get_active_text()!="" &&
+     (edgemapcbts[INPUT])->get_active_text()!="" &&
+     (edgemapcbts[OUTPUT])->get_active_text()!="" &&
+     source.get_active_text()!="" &&
+     target.get_active_text()!=""
+     )
+    {
+      const Graph &g=mapstorage->graph;
+      Node from, to;
+
+      get_from_to(from, to, (Graph&)g);
+
+      std::ostringstream o;
+
+      if(!(from==to))
+	{
+	  Graph::EdgeMap<double> * inputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[INPUT])->get_active_text()];
+	  Graph::EdgeMap<double> * outputmap=
+	    (mapstorage->edgemap_storage)[(edgemapcbts[OUTPUT])->get_active_text()];
+
+	  //zero out output map
+	  for (EdgeIt i(g); i!=INVALID; ++i)
+	    {
+	      (*outputmap)[i]=0;
+	    }
+	  
+	  Suurballe<Graph, Graph::EdgeMap<double> > sb((Graph&)g, *inputmap, from, to);
+	  
+	  int found=sb.run(num_set->get_value_as_int());
+	  if(found)
+	    {
+	      for(int j=0;j<found;j++)
+		{
+		  DirPath<Graph> path(g);
+		  sb.getPath(path, j);
+		  for(int k=0;k<path.length();k++)
+		    {
+		      DirPath<Graph>::EdgeIt ei;
+		      path.nth(ei,k);
+		      (*outputmap)[ei]=j+1;
+		    }
+		}
+	      o << "Result: found " << found << " paths between ";
+	      o << source.get_active_text() << " and " << target.get_active_text();
+	    }
+	  else
+	    {
+	      o << "Result: failed to find shortest path between ";
+	      o << source.get_active_text() << " and " << target.get_active_text();
+	    }
+	  resultlabel.set_text(o.str());
+	  
 	  mapstorage->mapChanged(true, (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_COLOR,
+	  // 			      (edgemapcbts[OUTPUT])->get_active_text());
+	  //   mapstorage->changeActiveMap(true, E_TEXT,
+	  // 			      (edgemapcbts[INPUT])->get_active_text());
 	}
-      //   mapstorage->changeActiveMap(true, E_COLOR,
-      // 			      (edgemapcbts[OUTPUT])->get_active_text());
-      //   mapstorage->changeActiveMap(true, E_TEXT,
-      // 			      (edgemapcbts[INPUT])->get_active_text());
     }
 }
     
@@ -107,6 +178,10 @@
   pack_start(resultlabel);
 }
 
+void SuurballeBox::build_box()
+{
+}
+
 void DijkstraBox::maplists_updated()
 {
   if(tabcbt.get_active_text()!="")
@@ -123,3 +198,23 @@
 	}
     }
 }
+
+void DijkstraBox::get_from_to(Node & from, Node & to, Graph & g)
+{
+  int assigned=0;
+  for (NodeIt i(g); (i!=INVALID) && (assigned<2); ++i)
+    {
+      std::ostringstream text;
+      text << (*((mapstorage->nodemap_storage)["label"]))[i];
+      if(!(text.str().compare(source.get_active_text())))
+	{
+	  from=i;
+	  assigned++;
+	}
+      if(!(text.str().compare(target.get_active_text())))
+	{
+	  to=i;
+	  assigned++;
+	}
+    }
+}

Modified: glemon/trunk/dijkstrabox.h
==============================================================================
--- glemon/trunk/dijkstrabox.h	(original)
+++ glemon/trunk/dijkstrabox.h	Fri Oct 13 17:31:58 2006
@@ -7,7 +7,6 @@
 
 #include <all_include.h>
 #include <algobox.h>
-#include <lemon/dijkstra.h>
 #include <libgnomecanvasmm.h>
 #include <libgnomecanvasmm/polygon.h>
 
@@ -23,6 +22,7 @@
 ///-implement \ref run function
 class DijkstraBox : public AlgoBox
 {
+protected:
   ///Shows result of Dijkstra algorithm
   Gtk::Label resultlabel;
 
@@ -36,6 +36,9 @@
   ///Combobox for select target node
   Gtk::ComboBoxText target;
 
+  ///Gets to and from node from combobox
+  void get_from_to(Node &, Node &, Graph &);
+
 public:
   ///Calls \ref AlgoBox::init function to initialize class properly, automatically.
   DijkstraBox(std::vector<std::string> t);
@@ -46,11 +49,28 @@
   ///at the moment. While Dijkstra nedds a bool map as output.
   ///As postprocess this bool map should be transformed to
   ///double map.
-  void run();
+  virtual void run();
 
   ///Builds the graphical design of the interface.
-  void build_box();
+  virtual void build_box();
 
   void maplists_updated();
 };
+
+class SuurballeBox : public DijkstraBox
+{
+  ///number of paths to find
+  int num;
+  
+  ///Widget to set numbewr of paths to find
+  Gtk::SpinButton * num_set;
+
+  ///Holder widget
+  Gtk::HBox hbox;
+
+public:
+  SuurballeBox(std::vector<std::string> t);
+  void run();
+  void build_box();
+};
 #endif //DIJKSTRABOX_H

Modified: glemon/trunk/main_win.cc
==============================================================================
--- glemon/trunk/main_win.cc	(original)
+++ glemon/trunk/main_win.cc	Fri Oct 13 17:31:58 2006
@@ -109,6 +109,8 @@
 	   sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 1) );
   ag->add( Gtk::Action::create("AlgoDijkstra", _("_Dijkstra")),
 	   sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 2) );
+  ag->add( Gtk::Action::create("AlgoSuurballe", _("_Suurballe")),
+	   sigc::bind( sigc::mem_fun ( *this, &MainWin::createAlgoWin ), 3) );
 
   Gtk::RadioAction::Group tool_group;
   ag->add( Gtk::RadioAction::create(tool_group, "MoveItem", Gtk::StockID("gd-move"), _("Move")),
@@ -162,6 +164,7 @@
       "      <menuitem action='AlgoGeneral'/>"
       "      <menuitem action='AlgoKruskal'/>"
       "      <menuitem action='AlgoDijkstra'/>"
+      "      <menuitem action='AlgoSuurballe'/>"
       "    </menu>"
       "  </menubar>"
       "  <toolbar name='ToolBar'>"



More information about the Lemon-commits mailing list