COIN-OR::LEMON - Graph Library

source: glemon-0.x/mapstorage.h @ 201:879e47e5b731

Last change on this file since 201:879e47e5b731 was 201:879e47e5b731, checked in by Akos Ladanyi, 16 years ago

Merge branches/akos to trunk.

File size: 17.0 KB
Line 
1/* -*- C++ -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 *
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
12 *
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
15 * purpose.
16 *
17 */
18
19#ifndef MAPSTORAGE_H
20#define MAPSTORAGE_H
21
22class Mapstorage;
23
24#include <vector>
25#include <map>
26#include <string>
27#include "all_include.h"
28#include "xymap.h"
29#include <libgnomecanvasmm.h>
30#include "map_value.h"
31#include "map_value_map.h"
32
33///class MapStorage handles NodeMaps and EdgeMaps.
34
35///Class MapStorage is responsible for storing
36///NodeMaps and EdgeMaps that can be shown later
37///on GUI. Therefore maps can be added to it,
38///and datas over the added maps can be queried.
39///The maps will be stored in an std::map,
40///referenced with their names. Unfortunately at
41///the moment it works only with double type maps
42///
43///\todo too many things are public!!
44class MapStorage
45{
46private:
47  std::string background_file_name;
48  bool background_set;
49  double background_scaling;
50public:
51  class Error : public std::exception
52  {
53    private:
54      std::string message;
55    public:
56      Error(const std::string& msg) : message(msg) {}
57      virtual const char* what() const throw()
58      {
59        return message.c_str();
60      }
61      ~Error() throw() {}
62  };
63
64  void setBackground(const std::string& file_name);
65  const std::string& getBackgroundFilename();
66  bool isBackgroundSet();
67  double getBackgroundScaling();
68  void setBackgroundScaling(double scaling);
69
70  enum MapSaveDest { GUI_SECT, NESET_SECT, DONT_SAVE };
71  enum GuiSectSaveDest { LGF_FILE, CONF_FILE };
72  struct SpecMapSaveOpts
73  {
74    enum Dest { GUI_SECT, NESET_SECT };
75    enum MapNum { ONE_MAP, TWO_MAPS };
76  };
77
78  typedef Graph::NodeMap<double> NumericNodeMap;
79  typedef Graph::NodeMap<std::string> StringNodeMap;
80  typedef Graph::EdgeMap<double> NumericEdgeMap;
81  typedef Graph::EdgeMap<std::string> StringEdgeMap;
82  typedef Graph::NodeMap<int> NodeLabelMap;
83  typedef Graph::EdgeMap<int> EdgeLabelMap;
84  typedef XYMap<Graph::NodeMap<double> > NodeCoordMap;
85  typedef XYMap<Graph::EdgeMap<double> > ArrowCoordMap;
86
87  struct EdgeMapData
88  {
89    /// where to save the map
90    MapSaveDest save_dest;
91    /// read-only or read-write
92    bool writeable;
93    /// default value
94    MapValue default_value;
95    virtual MapValue::Type type() = 0;
96    virtual MapValue get(Edge e) = 0;
97    virtual void set(Edge e, MapValue v) = 0;
98    EdgeMapData(MapValue def_val) :
99      save_dest(GUI_SECT),
100      writeable(true),
101      default_value(def_val)
102    {}
103  };
104
105  struct NumericEdgeMapData : public EdgeMapData
106  {
107    NumericEdgeMap map;
108    MapValue::Type type() { return MapValue::NUMERIC; }
109    MapValue get(Edge e) { return MapValue(map[e]); }
110    void set(Edge e, MapValue v) { map.set(e, static_cast<double>(v)); }
111    NumericEdgeMapData(Graph& g, double def_val) :
112      EdgeMapData(MapValue(def_val)),
113      map(g, def_val)
114    {}
115  };
116
117  struct StringEdgeMapData : public EdgeMapData
118  {
119    StringEdgeMap map;
120    MapValue::Type type() { return MapValue::STRING; }
121    MapValue get(Edge e) { return MapValue(map[e]); }
122    void set(Edge e, MapValue v) { map.set(e, static_cast<std::string>(v)); }
123    StringEdgeMapData(Graph& g, std::string def_val) :
124      EdgeMapData(MapValue(def_val)),
125      map(g, def_val)
126    {}
127  };
128
129  struct NodeMapData
130  {
131    /// where to save the map
132    MapSaveDest save_dest;
133    /// read-only or read-write
134    bool writeable;
135    /// default value
136    MapValue default_value;
137    virtual MapValue::Type type() = 0;
138    virtual MapValue get(Node e) = 0;
139    virtual void set(Node e, MapValue v) = 0;
140    NodeMapData(MapValue def_val) :
141      save_dest(GUI_SECT),
142      writeable(true),
143      default_value(def_val)
144    {}
145  };
146
147  struct NumericNodeMapData : public NodeMapData
148  {
149    NumericNodeMap map;
150    MapValue::Type type() { return MapValue::NUMERIC; }
151    MapValue get(Node e) { return MapValue(map[e]); }
152    void set(Node e, MapValue v) { map.set(e, static_cast<double>(v)); }
153    NumericNodeMapData(Graph& g, double def_val) :
154      NodeMapData(MapValue(def_val)),
155      map(g, def_val)
156    {}
157  };
158
159  struct StringNodeMapData : public NodeMapData
160  {
161    StringNodeMap map;
162    MapValue::Type type() { return MapValue::STRING; }
163    MapValue get(Node e) { return MapValue(map[e]); }
164    void set(Node e, MapValue v) { map.set(e, static_cast<std::string>(v)); }
165    StringNodeMapData(Graph& g, std::string def_val) :
166      NodeMapData(MapValue(def_val)),
167      map(g, def_val)
168    {}
169  };
170
171  typedef std::map<std::string, NodeMapData*> NodeMapStore;
172  typedef std::map<std::string, EdgeMapData*> EdgeMapStore;
173
174  struct GUISectData
175  {
176    std::vector<std::string> main_node_map_names;
177    std::vector<std::string> main_edge_map_names;
178
179    std::vector<std::string> gui_node_map_names;
180    std::vector<std::string> gui_edge_map_names;
181
182    std::map<std::string, MapValue::Type> node_map_types;
183    std::map<std::string, MapValue::Type> edge_map_types;
184
185    std::map<std::string, std::map<int, double>* > numeric_node_maps;
186    std::map<std::string, std::map<int, std::string>* > string_node_maps;
187
188    std::map<std::string, std::map<int, double>* > numeric_edge_maps;
189    std::map<std::string, std::map<int, std::string>* > string_edge_maps;
190
191    std::map<int, XY> node_coord_map;
192    std::map<int, XY> arrow_coord_map;
193
194    SpecMapSaveOpts::Dest node_coords_save_dest;
195    SpecMapSaveOpts::MapNum node_coords_save_map_num;
196    std::string node_coords_one_map_name;
197    std::string node_coords_two_maps_1_name;
198    std::string node_coords_two_maps_2_name;
199
200    SpecMapSaveOpts::Dest arrow_coords_save_dest;
201    SpecMapSaveOpts::MapNum arrow_coords_save_map_num;
202    std::string arrow_coords_one_map_name;
203    std::string arrow_coords_two_maps_1_name;
204    std::string arrow_coords_two_maps_2_name;
205
206    ~GUISectData()
207    {
208      using std::map;
209      using std::vector;
210      using std::pair;
211      using std::string;
212
213      for (map<string, map<int, double>* >::iterator it =
214          numeric_node_maps.begin(); it != numeric_node_maps.end(); ++it)
215      {
216        delete it->second;
217      }
218      for (map<string, map<int, string>* >::iterator it =
219          string_node_maps.begin(); it != string_node_maps.end(); ++it)
220      {
221        delete it->second;
222      }
223      for (map<string, map<int, double>* >::iterator it =
224          numeric_edge_maps.begin(); it != numeric_edge_maps.end(); ++it)
225      {
226        delete it->second;
227      }
228      for (map<string, map<int, string>* >::iterator it =
229          string_edge_maps.begin(); it != string_edge_maps.end(); ++it)
230      {
231        delete it->second;
232      }
233    }
234  };
235public:
236  ///The graph for which the datas are stored.
237  Graph graph;
238  const Graph& getGraph();
239
240private:
241  GuiSectSaveDest gui_sect_save_dest;
242
243  SpecMapSaveOpts::Dest node_coords_save_dest;
244  SpecMapSaveOpts::MapNum node_coords_save_map_num;
245  SpecMapSaveOpts::Dest arrow_coords_save_dest;
246  SpecMapSaveOpts::MapNum arrow_coords_save_map_num;
247
248  NodeMapStore nodemaps;
249  EdgeMapStore edgemaps;
250
251  NodeLabelMap node_label;
252  EdgeLabelMap edge_label;
253
254  /// the coordinates of the nodes
255  NodeCoordMap node_coords;
256  Graph::NodeMap<double> node_coords_x;
257  Graph::NodeMap<double> node_coords_y;
258
259  /// the coordinates of the arrows on the edges
260  ArrowCoordMap arrow_coords;
261  Graph::EdgeMap<double> arrow_coords_x;
262  Graph::EdgeMap<double> arrow_coords_y;
263
264  ///The content of the object has changed, update is needed.
265  bool modified;
266
267  ///Name of file loaded in object.
268  std::string file_name;
269
270  // the largest node label
271  int max_node_label;
272
273  // the largest edge label
274  int max_edge_label;
275
276  std::string node_coords_one_map_name;
277  std::string node_coords_two_maps_1_name;
278  std::string node_coords_two_maps_2_name;
279
280  std::string arrow_coords_one_map_name;
281  std::string arrow_coords_two_maps_1_name;
282  std::string arrow_coords_two_maps_2_name;
283
284public:
285  ///Stores the default values for the different visualization node attributes
286  std::vector<Graph::NodeMap<double> > default_nodemaps;
287
288  ///Stores the default values for the different visualization edge attributes
289  std::vector<Graph::EdgeMap<double> > default_edgemaps;
290
291  ///Stores the active maps for the different visualization node attributes
292  std::vector< std::string > active_nodemaps;
293
294  /// Stores the active maps for the different visualization edge attributes
295  std::vector< std::string > active_edgemaps;
296
297protected:
298
299  /// Signal emitted on any change made on map values
300
301  /// Signal emitted if the visualization of the maps might have to be updated.
302  /// bool shows us whether the changed map is edge or nodemap.
303  /// int tells us the refreshed property
304  sigc::signal<void, bool, int> signal_prop;
305
306  /// Signal emitted in the case of nodemap addition
307
308  /// std::string is the
309  ///name of the new map
310  sigc::signal<void, std::string, MapValue::Type> signal_node_map;
311
312  /// Signal emitted in the case of edgemap addition
313
314  /// std::string is the
315  ///name of the new map
316  sigc::signal<void, std::string, MapValue::Type> signal_edge_map;
317
318  /// Signal emitted, when entry in \ref MapWin should be changed.
319  sigc::signal<void, bool, int, std::string> signal_map_win;
320
321  /// Signal emitted, when entry in \ref DesignWin should be changed.
322  sigc::signal<void, double, double, int> signal_design_win;
323
324  ///Signal emitted when background should be set by \ref NoteBookTab
325  sigc::signal<void> signal_background;
326
327  ///Iteration number during graph design
328  int iterations;
329
330  ///Attraction factor during graph design
331  double attraction;
332
333  ///Propulsation factor during graph design
334  double propulsation;
335
336public:
337  ///Constructor of MapStorage.
338
339  ///Its all activity is initializing default values
340  ///for different visualization attributes.
341  MapStorage();
342
343  ///Destructor of MapStorage
344
345  ///Maps stored here are created with new. Destructor
346  ///deletes them to free up the reserved memory.
347  ~MapStorage();
348
349  /// Registrates if the shown map by any attribute has changed to another.
350
351  ///It handles the \ref active_edgemaps and
352  ///\ref active_nodemaps vectors. It also emits \ref signal_prop signal to let
353  ///know the interested objects that the visible map of a certain
354  ///attribute has changed.
355  ///\param itisedge edgemap or nodemap has changed
356  ///\param prop the property of which the map is changed
357  ///\param mapname the visible map
358  void changeActiveMap(bool itisedge , int prop , std::string mapname);
359
360  ///Emits signals that let change the active maps in \ref MapWin.
361  void broadcastActiveMaps();
362
363  /// Returns the active edgemap shown by a visualization property.
364
365  /// \param prop is the property
366  ///that shows the requested map.
367  std::string getActiveEdgeMap(int prop);
368
369  /// Returns the active nodemap shown by a visualization property.
370
371  /// \param prop is the property
372  ///that shows the requested map.
373  std::string getActiveNodeMap(int prop);
374
375  /// Returns the names of the edgemaps stored here.
376  std::vector<std::string> getEdgeMapList(MapType type = ALL);
377
378  /// Returns the names of the nodemaps stored here.
379  std::vector<std::string> getNodeMapList(MapType type = ALL);
380
381  ///returns \ref signal_prop to be able to connect functions to it
382  sigc::signal<void, bool, int> signal_prop_ch();
383
384  ///returns \ref signal_node_map to be able to connect functions to it
385  sigc::signal<void, std::string, MapValue::Type> signal_node_map_ch(){return signal_node_map;};
386
387  ///returns \ref signal_edge_map to be able to connect functions to it
388  sigc::signal<void, std::string, MapValue::Type> signal_edge_map_ch(){return signal_edge_map;};
389
390  ///returns \ref signal_map_win to be able to connect functions to it
391  sigc::signal<void, bool, int, std::string> signal_map_win_ch(){return signal_map_win;};
392
393  ///returns \ref signal_design_win to be able to connect functions to it
394  sigc::signal<void, double, double, int> signal_design_win_ch(){return signal_design_win;};
395
396  void createNodeMap(const std::string& name, MapValue::Type type,
397    MapValue def_val);
398  void createEdgeMap(const std::string& name, MapValue::Type type,
399    MapValue def_val);
400
401  ///returns \ref signal_background to be able to connect functions to it
402  sigc::signal<void> signal_background_ch(){return signal_background;};
403
404
405  ///Adds given map to storage.
406
407  ///Emits \ref signal_prop if mapvalues have changed, and MapStorage gets to know it.
408
409  ///If values in a map have changed, this function checks, whether it is displayed.
410  ///This check means searching the given mapname between active maps
411  ///(\ref active_nodemaps, \ref active_edgemaps). If it is there at a certain property,
412  ///it emits a signal with the property, where the gotten mapname was found. One signal
413  ///is emitted for each property displaying the given map.
414  ///\param itisedge whether the map an edgemap or nodemap
415  ///\param mapname name of map to visualize
416  void mapChanged(bool itisedge, std::string mapname);
417
418  ///Read datas from the given filename.
419  int readFromFile(const std::string &);
420
421  ///Save datas to the given filename.
422  void writeToFile(const std::string &);
423
424  ///Deletes all datastructures stored here.
425  void clear();
426
427  void get_design_data(double &, double &, int &);
428  void set_attraction(double);
429  void set_propulsation(double);
430  void set_iteration(int);
431
432  void redesign_data_changed();
433
434  XY getNodeCoords(Node n) const;
435  void setNodeCoords(Node n, XY c);
436  XY getArrowCoords(Edge e) const;
437  void setArrowCoords(Edge e, XY c);
438
439  MapValue get(const std::string& name, Node node) const;
440  void set(const std::string& name, Node node, MapValue val);
441  MapValue get(const std::string& name, Edge edge) const;
442  void set(const std::string& name, Edge edge, MapValue val);
443
444  const std::string& getFileName() const;
445  void setFileName(const std::string& fn);
446
447  bool getModified() const;
448  void setModified(bool m = true);
449
450  Node addNode(XY);
451  Edge addEdge(Node, Node);
452
453  NumericNodeMap& getNumericNodeMap(const std::string& name);
454  StringNodeMap& getStringNodeMap(const std::string& name);
455  NumericEdgeMap& getNumericEdgeMap(const std::string& name);
456  StringEdgeMap& getStringEdgeMap(const std::string& name);
457
458  MapValueEdgeMap getEdgeMap(const std::string& name);
459  MapValueNodeMap getNodeMap(const std::string& name);
460
461  int getLabel(Node) const;
462  int getLabel(Edge) const;
463
464  GuiSectSaveDest getGUIDataSaveLocation();
465  void setGUIDataSaveLocation(GuiSectSaveDest dest);
466
467  MapSaveDest getNodeMapSaveDest(std::string name) const;
468  MapSaveDest getEdgeMapSaveDest(std::string name) const;
469  void setNodeMapSaveDest(std::string name, MapSaveDest dest);
470  void setEdgeMapSaveDest(std::string name, MapSaveDest dest);
471
472  SpecMapSaveOpts::Dest getNodeCoordsSaveDest();
473  SpecMapSaveOpts::Dest getArrowCoordsSaveDest();
474  void setNodeCoordsSaveDest(SpecMapSaveOpts::Dest dest);
475  void setArrowCoordsSaveDest(SpecMapSaveOpts::Dest dest);
476
477  SpecMapSaveOpts::MapNum getNodeCoordsSaveMapNum();
478  SpecMapSaveOpts::MapNum getArrowCoordsSaveMapNum();
479  void setNodeCoordsSaveMapNum(SpecMapSaveOpts::MapNum num);
480  void setArrowCoordsSaveMapNum(SpecMapSaveOpts::MapNum num);
481
482  MapValue::Type getNodeMapElementType(std::string name) const;
483  MapValue::Type getEdgeMapElementType(std::string name) const;
484
485  const NodeLabelMap& getNodeLabelMap();
486  const EdgeLabelMap& getEdgeLabelMap();
487
488  bool nodeMapExists(std::string name);
489  bool edgeMapExists(std::string name);
490
491  std::vector<std::string> getEdgeMaps(MapType type = ALL);
492  std::vector<std::string> getNodeMaps(MapType type = ALL);
493
494  NodeCoordMap& getNodeCoordMap();
495  ArrowCoordMap& getArrowCoordMap();
496
497  const std::string& getNodeCoordsOneMapName();
498  const std::string& getNodeCoordsTwoMaps1Name();
499  const std::string& getNodeCoordsTwoMaps2Name();
500  void setNodeCoordsOneMapName(const std::string& name);
501  void setNodeCoordsTwoMaps1Name(const std::string& name);
502  void setNodeCoordsTwoMaps2Name(const std::string& name);
503
504  const std::string& getArrowCoordsOneMapName();
505  const std::string& getArrowCoordsTwoMaps1Name();
506  const std::string& getArrowCoordsTwoMaps2Name();
507  void setArrowCoordsOneMapName(const std::string& name);
508  void setArrowCoordsTwoMaps1Name(const std::string& name);
509  void setArrowCoordsTwoMaps2Name(const std::string& name);
510
511private:
512  EdgeMapData* getEdgeMapData(std::string name) const;
513  NodeMapData* getNodeMapData(std::string name) const;
514  void readLGF(
515      const std::string& filename,
516      bool read_edge_label,
517      const std::vector<std::string>& node_map_names,
518      const std::vector<std::string>& edge_map_names,
519      const std::map<std::string, MapValue::Type>& node_map_types,
520      const std::map<std::string, MapValue::Type>& edge_map_types,
521      const std::string& node_coord_xmap_name,
522      const std::string& node_coord_ymap_name,
523      const std::string& arrow_coord_xmap_name,
524      const std::string& arrow_coord_ymap_name);
525
526public:
527  void exportGraphToEPS(std::vector<bool>, std::string, std::string);
528};
529
530#endif //MAPSTORAGE_H
Note: See TracBrowser for help on using the repository browser.