gui_writer.cc
author ladanyi
Wed, 02 Jan 2008 21:03:09 +0000
changeset 201 879e47e5b731
parent 194 6b2b718420eb
permissions -rw-r--r--
Merge branches/akos to trunk.
alpar@174
     1
/* -*- C++ -*-
alpar@174
     2
 *
alpar@174
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@174
     4
 *
alpar@174
     5
 * Copyright (C) 2003-2006
alpar@174
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@174
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@174
     8
 *
alpar@174
     9
 * Permission to use, modify and distribute this software is granted
alpar@174
    10
 * provided that this copyright notice appears in all copies. For
alpar@174
    11
 * precise terms see the accompanying LICENSE file.
alpar@174
    12
 *
alpar@174
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@174
    14
 * express or implied, and with no claim as to its suitability for any
alpar@174
    15
 * purpose.
alpar@174
    16
 *
alpar@174
    17
 */
alpar@174
    18
ladanyi@201
    19
#include "gui_writer.h"
ladanyi@201
    20
#include "io_helper.h"
ladanyi@201
    21
#include "mapstorage.h"
ladanyi@201
    22
#include "xml.h"
hegyi@150
    23
#include <lemon/dim2.h>
ladanyi@98
    24
#include <vector>
ladanyi@98
    25
hegyi@194
    26
#include <gui_writer.h>
hegyi@194
    27
#include <mapstorage.h>
hegyi@194
    28
ladanyi@98
    29
std::string GuiWriter::header()
ladanyi@98
    30
{
ladanyi@98
    31
  return "@gui";
ladanyi@98
    32
}
ladanyi@98
    33
ladanyi@98
    34
void GuiWriter::write(std::ostream& os)
ladanyi@98
    35
{
ladanyi@201
    36
  using std::vector;
ladanyi@201
    37
  using std::string;
ladanyi@201
    38
  using std::map;
ladanyi@201
    39
  using std::string;
ladanyi@201
    40
ladanyi@98
    41
  XmlIo x(os);
ladanyi@201
    42
ladanyi@201
    43
  vector<string> all_node_map_names = mapstorage->getNodeMapList();
ladanyi@201
    44
  // name of the maps saved to the nodeset section
ladanyi@201
    45
  vector<string> main_node_map_names;
ladanyi@201
    46
  // name of the maps saved to the gui section
ladanyi@201
    47
  vector<string> gui_node_map_names;
ladanyi@201
    48
ladanyi@201
    49
  for (vector<string>::const_iterator it = all_node_map_names.begin();
ladanyi@201
    50
      it != all_node_map_names.end(); ++it)
ladanyi@98
    51
  {
ladanyi@201
    52
    if (mapstorage->getNodeMapSaveDest(*it) == MapStorage::NESET_SECT)
ladanyi@201
    53
      main_node_map_names.push_back(*it);
ladanyi@201
    54
    else if (mapstorage->getNodeMapSaveDest(*it) == MapStorage::GUI_SECT)
ladanyi@201
    55
      gui_node_map_names.push_back(*it);
ladanyi@98
    56
  }
ladanyi@201
    57
ladanyi@201
    58
  { x("main_node_map_names", main_node_map_names); }
ladanyi@201
    59
  { x("gui_node_map_names", gui_node_map_names); }
ladanyi@201
    60
ladanyi@201
    61
  map<string, MapValue::Type> node_map_types;
ladanyi@201
    62
  for (vector<string>::const_iterator it = main_node_map_names.begin();
ladanyi@201
    63
      it != main_node_map_names.end(); ++it)
ladanyi@201
    64
  {
ladanyi@201
    65
    node_map_types[*it] = mapstorage->getNodeMapElementType(*it);
ladanyi@201
    66
  }
ladanyi@201
    67
  for (vector<string>::const_iterator it = gui_node_map_names.begin();
ladanyi@201
    68
      it != gui_node_map_names.end(); ++it)
ladanyi@201
    69
  {
ladanyi@201
    70
    node_map_types[*it] = mapstorage->getNodeMapElementType(*it);
ladanyi@201
    71
  }
ladanyi@201
    72
ladanyi@201
    73
  { x("node_map_types", node_map_types); }
ladanyi@201
    74
ladanyi@201
    75
ladanyi@201
    76
  vector<string> all_edge_map_names = mapstorage->getEdgeMapList();
ladanyi@201
    77
  // name of the maps saved to the edgeset section
ladanyi@201
    78
  vector<string> main_edge_map_names;
ladanyi@201
    79
  // name of the maps saved to the gui section
ladanyi@201
    80
  vector<string> gui_edge_map_names;
ladanyi@201
    81
ladanyi@201
    82
  for (vector<string>::const_iterator it = all_edge_map_names.begin();
ladanyi@201
    83
      it != all_edge_map_names.end(); ++it)
ladanyi@201
    84
  {
ladanyi@201
    85
    if (mapstorage->getEdgeMapSaveDest(*it) == MapStorage::NESET_SECT)
ladanyi@201
    86
      main_edge_map_names.push_back(*it);
ladanyi@201
    87
    if (mapstorage->getEdgeMapSaveDest(*it) == MapStorage::GUI_SECT)
ladanyi@201
    88
      gui_edge_map_names.push_back(*it);
ladanyi@201
    89
  }
ladanyi@201
    90
ladanyi@201
    91
  { x("main_edge_map_names", main_edge_map_names); }
ladanyi@201
    92
  { x("gui_edge_map_names", gui_edge_map_names); }
ladanyi@201
    93
ladanyi@201
    94
  map<string, MapValue::Type> edge_map_types;
ladanyi@201
    95
  for (vector<string>::const_iterator it = main_edge_map_names.begin();
ladanyi@201
    96
      it != main_edge_map_names.end(); ++it)
ladanyi@201
    97
  {
ladanyi@201
    98
    edge_map_types[*it] = mapstorage->getEdgeMapElementType(*it);
ladanyi@201
    99
  }
ladanyi@201
   100
  for (vector<string>::const_iterator it = gui_edge_map_names.begin();
ladanyi@201
   101
      it != gui_edge_map_names.end(); ++it)
ladanyi@201
   102
  {
ladanyi@201
   103
    edge_map_types[*it] = mapstorage->getEdgeMapElementType(*it);
ladanyi@201
   104
  }
ladanyi@201
   105
ladanyi@201
   106
  { x("edge_map_types", edge_map_types); }
ladanyi@201
   107
ladanyi@201
   108
  // write the gui node maps
ladanyi@201
   109
  for (vector<string>::const_iterator it = gui_node_map_names.begin();
ladanyi@201
   110
      it != gui_node_map_names.end(); ++it)
ladanyi@201
   111
  {
ladanyi@201
   112
    MapValue::Type type = mapstorage->getNodeMapElementType(*it);
ladanyi@201
   113
    const MapStorage::NodeLabelMap& labels = mapstorage->getNodeLabelMap();
ladanyi@201
   114
    switch (type)
ladanyi@201
   115
    {
ladanyi@201
   116
      case MapValue::NUMERIC:
ladanyi@201
   117
        {
ladanyi@201
   118
          std::map<int, double> map_data;
ladanyi@201
   119
          MapStorage::NumericNodeMap& map =
ladanyi@201
   120
            mapstorage->getNumericNodeMap(*it);
ladanyi@201
   121
          for (NodeIt n(mapstorage->getGraph()); n != INVALID; ++n)
ladanyi@201
   122
          {
ladanyi@201
   123
            map_data[labels[n]] = map[n];
ladanyi@201
   124
          }
ladanyi@201
   125
          { x(*it, map_data); }
ladanyi@201
   126
        }
ladanyi@201
   127
        break;
ladanyi@201
   128
      case MapValue::STRING:
ladanyi@201
   129
        {
ladanyi@201
   130
          std::map<int, std::string> map_data;
ladanyi@201
   131
          MapStorage::StringNodeMap& map =
ladanyi@201
   132
            mapstorage->getStringNodeMap(*it);
ladanyi@201
   133
          for (NodeIt n(mapstorage->getGraph()); n != INVALID; ++n)
ladanyi@201
   134
          {
ladanyi@201
   135
            map_data[labels[n]] = map[n];
ladanyi@201
   136
          }
ladanyi@201
   137
          { x(*it, map_data); }
ladanyi@201
   138
        }
ladanyi@201
   139
        break;
ladanyi@201
   140
    }
ladanyi@201
   141
  }
ladanyi@201
   142
ladanyi@201
   143
  // write the gui edge maps
ladanyi@201
   144
  for (vector<string>::const_iterator it = gui_edge_map_names.begin();
ladanyi@201
   145
      it != gui_edge_map_names.end(); ++it)
ladanyi@201
   146
  {
ladanyi@201
   147
    MapValue::Type type = mapstorage->getEdgeMapElementType(*it);
ladanyi@201
   148
    const MapStorage::EdgeLabelMap& labels = mapstorage->getEdgeLabelMap();
ladanyi@201
   149
    switch (type)
ladanyi@201
   150
    {
ladanyi@201
   151
      case MapValue::NUMERIC:
ladanyi@201
   152
        {
ladanyi@201
   153
          std::map<int, double> map_data;
ladanyi@201
   154
          MapStorage::NumericEdgeMap& map =
ladanyi@201
   155
            mapstorage->getNumericEdgeMap(*it);
ladanyi@201
   156
          for (EdgeIt e(mapstorage->getGraph()); e != INVALID; ++e)
ladanyi@201
   157
          {
ladanyi@201
   158
            map_data[labels[e]] = map[e];
ladanyi@201
   159
          }
ladanyi@201
   160
          { x(*it, map_data); }
ladanyi@201
   161
        }
ladanyi@201
   162
        break;
ladanyi@201
   163
      case MapValue::STRING:
ladanyi@201
   164
        {
ladanyi@201
   165
          std::map<int, std::string> map_data;
ladanyi@201
   166
          MapStorage::StringEdgeMap& map =
ladanyi@201
   167
            mapstorage->getStringEdgeMap(*it);
ladanyi@201
   168
          for (EdgeIt e(mapstorage->getGraph()); e != INVALID; ++e)
ladanyi@201
   169
          {
ladanyi@201
   170
            map_data[labels[e]] = map[e];
ladanyi@201
   171
          }
ladanyi@201
   172
          { x(*it, map_data); }
ladanyi@201
   173
        }
ladanyi@201
   174
        break;
ladanyi@201
   175
    }
ladanyi@201
   176
  }
ladanyi@201
   177
ladanyi@201
   178
  {
ladanyi@201
   179
    switch (mapstorage->getNodeCoordsSaveDest())
ladanyi@201
   180
    {
ladanyi@201
   181
      case MapStorage::SpecMapSaveOpts::GUI_SECT:
ladanyi@201
   182
        { x("node_coords_save_dest", string("gui_sect")); }
ladanyi@201
   183
        // write the node coorinates
ladanyi@201
   184
        {
ladanyi@201
   185
          const MapStorage::NodeLabelMap& labels =
ladanyi@201
   186
            mapstorage->getNodeLabelMap();
ladanyi@201
   187
          std::map<int, XY> node_coord_map;
ladanyi@201
   188
          MapStorage::NodeCoordMap& map = mapstorage->getNodeCoordMap();
ladanyi@201
   189
          for (NodeIt n(mapstorage->getGraph()); n != INVALID; ++n)
ladanyi@201
   190
          {
ladanyi@201
   191
            node_coord_map[labels[n]] = map[n];
ladanyi@201
   192
          }
ladanyi@201
   193
          { x("node_coord_map", node_coord_map); }
ladanyi@201
   194
        }
ladanyi@201
   195
        break;
ladanyi@201
   196
      case MapStorage::SpecMapSaveOpts::NESET_SECT:
ladanyi@201
   197
        switch (mapstorage->getNodeCoordsSaveMapNum())
ladanyi@201
   198
        {
ladanyi@201
   199
          case MapStorage::SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   200
            { x("node_coords_save_dest", string("nodeset_sect_1_map")); }
ladanyi@201
   201
            { x("map_name", mapstorage->getNodeCoordsOneMapName()); }
ladanyi@201
   202
            break;
ladanyi@201
   203
          case MapStorage::SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   204
            { x("node_coords_save_dest", string("nodeset_sect_2_maps")); }
ladanyi@201
   205
            { x("map1_name", mapstorage->getNodeCoordsTwoMaps1Name()); }
ladanyi@201
   206
            { x("map2_name", mapstorage->getNodeCoordsTwoMaps2Name()); }
ladanyi@201
   207
            break;
ladanyi@201
   208
        }
ladanyi@201
   209
        break;
ladanyi@201
   210
    }
ladanyi@201
   211
  }
ladanyi@201
   212
ladanyi@201
   213
  {
ladanyi@201
   214
    switch (mapstorage->getArrowCoordsSaveDest())
ladanyi@201
   215
    {
ladanyi@201
   216
      case MapStorage::SpecMapSaveOpts::GUI_SECT:
ladanyi@201
   217
        { x("arrow_coords_save_dest", string("gui_sect")); }
ladanyi@201
   218
        // write the arrow coorinates
ladanyi@201
   219
        {
ladanyi@201
   220
          const MapStorage::EdgeLabelMap& labels =
ladanyi@201
   221
            mapstorage->getEdgeLabelMap();
ladanyi@201
   222
          std::map<int, XY> arrow_coord_map;
ladanyi@201
   223
          MapStorage::ArrowCoordMap& map = mapstorage->getArrowCoordMap();
ladanyi@201
   224
          for (EdgeIt e(mapstorage->getGraph()); e != INVALID; ++e)
ladanyi@201
   225
          {
ladanyi@201
   226
            arrow_coord_map[labels[e]] = map[e];
ladanyi@201
   227
          }
ladanyi@201
   228
          { x("arrow_coord_map", arrow_coord_map); }
ladanyi@201
   229
        }
ladanyi@201
   230
        break;
ladanyi@201
   231
      case MapStorage::SpecMapSaveOpts::NESET_SECT:
ladanyi@201
   232
        switch (mapstorage->getArrowCoordsSaveMapNum())
ladanyi@201
   233
        {
ladanyi@201
   234
          case MapStorage::SpecMapSaveOpts::ONE_MAP:
ladanyi@201
   235
            { x("arrow_coords_save_dest", string("edgeset_sect_1_map")); }
ladanyi@201
   236
            { x("map_name", mapstorage->getArrowCoordsOneMapName()); }
ladanyi@201
   237
            break;
ladanyi@201
   238
          case MapStorage::SpecMapSaveOpts::TWO_MAPS:
ladanyi@201
   239
            { x("arrow_coords_save_dest", string("edgeset_sect_2_maps")); }
ladanyi@201
   240
            { x("map1_name", mapstorage->getArrowCoordsTwoMaps1Name()); }
ladanyi@201
   241
            { x("map2_name", mapstorage->getArrowCoordsTwoMaps2Name()); }
ladanyi@201
   242
            break;
ladanyi@201
   243
        }
ladanyi@201
   244
        break;
ladanyi@201
   245
    }
ladanyi@201
   246
  }
ladanyi@201
   247
hegyi@172
   248
hegyi@172
   249
  std::map<int, std::string> nm;
hegyi@172
   250
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   251
    {
hegyi@172
   252
      nm[i]=mapstorage->active_nodemaps[i];
hegyi@172
   253
    }
ladanyi@201
   254
  { x("active_nodemaps", nm); }
hegyi@172
   255
hegyi@172
   256
  std::map<int, std::string> em;
hegyi@172
   257
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   258
    {
hegyi@172
   259
      em[i]=mapstorage->active_edgemaps[i];
hegyi@172
   260
    }
ladanyi@201
   261
  { x("active_edgemaps", em); }
hegyi@177
   262
hegyi@177
   263
  double attraction;
hegyi@177
   264
  double propulsation;
hegyi@177
   265
  int iteration;
hegyi@177
   266
hegyi@177
   267
  mapstorage->get_design_data(attraction, propulsation, iteration);
hegyi@177
   268
ladanyi@201
   269
  { x("redesign-attraction", attraction); }
ladanyi@201
   270
  { x("redesign-propulsation", propulsation); }
ladanyi@201
   271
  { x("redesign-iteration", iteration); }
ladanyi@98
   272
}
ladanyi@98
   273
ladanyi@201
   274
GuiWriter::GuiWriter(LemonWriter& writer, MapStorage* ms) :
ladanyi@201
   275
  Parent(writer),
ladanyi@201
   276
  mapstorage(ms)
ladanyi@98
   277
{
ladanyi@98
   278
}