gui_writer.cc
author Alpar Juttner <alpar@cs.elte.hu>
Fri, 10 Oct 2008 13:36:20 +0100
changeset 7 f227a74db59d
permissions -rw-r--r--
Update to compile with the latest LEMON (version 1.0 or [5e12d7734036])
     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 #include "gui_writer.h"
    20 #include "io_helper.h"
    21 #include "mapstorage.h"
    22 #include "xml.h"
    23 #include <lemon/dim2.h>
    24 #include <vector>
    25 
    26 #include <gui_writer.h>
    27 #include <mapstorage.h>
    28 
    29 // std::string GuiWriter::header()
    30 // {
    31 //   return "@gui";
    32 // }
    33 
    34 void GuiWriter::write(std::ostream& os)
    35 {
    36   using std::vector;
    37   using std::string;
    38   using std::map;
    39   using std::string;
    40 
    41   os << "@gui" << std::endl;
    42 
    43   XmlIo x(os);
    44 
    45   vector<string> all_node_map_names = mapstorage->getNodeMapList();
    46   // name of the maps saved to the nodeset section
    47   vector<string> main_node_map_names;
    48   // name of the maps saved to the gui section
    49   vector<string> gui_node_map_names;
    50 
    51   for (vector<string>::const_iterator it = all_node_map_names.begin();
    52       it != all_node_map_names.end(); ++it)
    53   {
    54     if (mapstorage->getNodeMapSaveDest(*it) == MapStorage::NESET_SECT)
    55       main_node_map_names.push_back(*it);
    56     else if (mapstorage->getNodeMapSaveDest(*it) == MapStorage::GUI_SECT)
    57       gui_node_map_names.push_back(*it);
    58   }
    59 
    60   { x("main_node_map_names", main_node_map_names); }
    61   { x("gui_node_map_names", gui_node_map_names); }
    62 
    63   map<string, MapValue::Type> node_map_types;
    64   for (vector<string>::const_iterator it = main_node_map_names.begin();
    65       it != main_node_map_names.end(); ++it)
    66   {
    67     node_map_types[*it] = mapstorage->getNodeMapElementType(*it);
    68   }
    69   for (vector<string>::const_iterator it = gui_node_map_names.begin();
    70       it != gui_node_map_names.end(); ++it)
    71   {
    72     node_map_types[*it] = mapstorage->getNodeMapElementType(*it);
    73   }
    74 
    75   { x("node_map_types", node_map_types); }
    76 
    77 
    78   vector<string> all_arc_map_names = mapstorage->getArcMapList();
    79   // name of the maps saved to the arcset section
    80   vector<string> main_arc_map_names;
    81   // name of the maps saved to the gui section
    82   vector<string> gui_arc_map_names;
    83 
    84   for (vector<string>::const_iterator it = all_arc_map_names.begin();
    85       it != all_arc_map_names.end(); ++it)
    86   {
    87     if (mapstorage->getArcMapSaveDest(*it) == MapStorage::NESET_SECT)
    88       main_arc_map_names.push_back(*it);
    89     if (mapstorage->getArcMapSaveDest(*it) == MapStorage::GUI_SECT)
    90       gui_arc_map_names.push_back(*it);
    91   }
    92 
    93   { x("main_arc_map_names", main_arc_map_names); }
    94   { x("gui_arc_map_names", gui_arc_map_names); }
    95 
    96   map<string, MapValue::Type> arc_map_types;
    97   for (vector<string>::const_iterator it = main_arc_map_names.begin();
    98       it != main_arc_map_names.end(); ++it)
    99   {
   100     arc_map_types[*it] = mapstorage->getArcMapElementType(*it);
   101   }
   102   for (vector<string>::const_iterator it = gui_arc_map_names.begin();
   103       it != gui_arc_map_names.end(); ++it)
   104   {
   105     arc_map_types[*it] = mapstorage->getArcMapElementType(*it);
   106   }
   107 
   108   { x("arc_map_types", arc_map_types); }
   109 
   110   // write the gui node maps
   111   for (vector<string>::const_iterator it = gui_node_map_names.begin();
   112       it != gui_node_map_names.end(); ++it)
   113   {
   114     MapValue::Type type = mapstorage->getNodeMapElementType(*it);
   115     const MapStorage::NodeLabelMap& labels = mapstorage->getNodeLabelMap();
   116     switch (type)
   117     {
   118       case MapValue::NUMERIC:
   119         {
   120           std::map<int, double> map_data;
   121           MapStorage::NumericNodeMap& map =
   122             mapstorage->getNumericNodeMap(*it);
   123           for (NodeIt n(mapstorage->getDigraph()); n != INVALID; ++n)
   124           {
   125             map_data[labels[n]] = map[n];
   126           }
   127           { x(*it, map_data); }
   128         }
   129         break;
   130       case MapValue::STRING:
   131         {
   132           std::map<int, std::string> map_data;
   133           MapStorage::StringNodeMap& map =
   134             mapstorage->getStringNodeMap(*it);
   135           for (NodeIt n(mapstorage->getDigraph()); n != INVALID; ++n)
   136           {
   137             map_data[labels[n]] = map[n];
   138           }
   139           { x(*it, map_data); }
   140         }
   141         break;
   142     }
   143   }
   144 
   145   // write the gui arc maps
   146   for (vector<string>::const_iterator it = gui_arc_map_names.begin();
   147       it != gui_arc_map_names.end(); ++it)
   148   {
   149     MapValue::Type type = mapstorage->getArcMapElementType(*it);
   150     const MapStorage::ArcLabelMap& labels = mapstorage->getArcLabelMap();
   151     switch (type)
   152     {
   153       case MapValue::NUMERIC:
   154         {
   155           std::map<int, double> map_data;
   156           MapStorage::NumericArcMap& map =
   157             mapstorage->getNumericArcMap(*it);
   158           for (ArcIt e(mapstorage->getDigraph()); e != INVALID; ++e)
   159           {
   160             map_data[labels[e]] = map[e];
   161           }
   162           { x(*it, map_data); }
   163         }
   164         break;
   165       case MapValue::STRING:
   166         {
   167           std::map<int, std::string> map_data;
   168           MapStorage::StringArcMap& map =
   169             mapstorage->getStringArcMap(*it);
   170           for (ArcIt e(mapstorage->getDigraph()); e != INVALID; ++e)
   171           {
   172             map_data[labels[e]] = map[e];
   173           }
   174           { x(*it, map_data); }
   175         }
   176         break;
   177     }
   178   }
   179 
   180   {
   181     switch (mapstorage->getNodeCoordsSaveDest())
   182     {
   183       case MapStorage::SpecMapSaveOpts::GUI_SECT:
   184         { x("node_coords_save_dest", string("gui_sect")); }
   185         // write the node coorinates
   186         {
   187           const MapStorage::NodeLabelMap& labels =
   188             mapstorage->getNodeLabelMap();
   189           std::map<int, XY> node_coord_map;
   190           MapStorage::NodeCoordMap& map = mapstorage->getNodeCoordMap();
   191           for (NodeIt n(mapstorage->getDigraph()); n != INVALID; ++n)
   192           {
   193             node_coord_map[labels[n]] = map[n];
   194           }
   195           { x("node_coord_map", node_coord_map); }
   196         }
   197         break;
   198       case MapStorage::SpecMapSaveOpts::NESET_SECT:
   199         switch (mapstorage->getNodeCoordsSaveMapNum())
   200         {
   201           case MapStorage::SpecMapSaveOpts::ONE_MAP:
   202             { x("node_coords_save_dest", string("nodeset_sect_1_map")); }
   203             { x("map_name", mapstorage->getNodeCoordsOneMapName()); }
   204             break;
   205           case MapStorage::SpecMapSaveOpts::TWO_MAPS:
   206             { x("node_coords_save_dest", string("nodeset_sect_2_maps")); }
   207             { x("map1_name", mapstorage->getNodeCoordsTwoMaps1Name()); }
   208             { x("map2_name", mapstorage->getNodeCoordsTwoMaps2Name()); }
   209             break;
   210         }
   211         break;
   212     }
   213   }
   214 
   215   {
   216     switch (mapstorage->getArrowCoordsSaveDest())
   217     {
   218       case MapStorage::SpecMapSaveOpts::GUI_SECT:
   219         { x("arrow_coords_save_dest", string("gui_sect")); }
   220         // write the arrow coorinates
   221         {
   222           const MapStorage::ArcLabelMap& labels =
   223             mapstorage->getArcLabelMap();
   224           std::map<int, XY> arrow_coord_map;
   225           MapStorage::ArrowCoordMap& map = mapstorage->getArrowCoordMap();
   226           for (ArcIt e(mapstorage->getDigraph()); e != INVALID; ++e)
   227           {
   228             arrow_coord_map[labels[e]] = map[e];
   229           }
   230           { x("arrow_coord_map", arrow_coord_map); }
   231         }
   232         break;
   233       case MapStorage::SpecMapSaveOpts::NESET_SECT:
   234         switch (mapstorage->getArrowCoordsSaveMapNum())
   235         {
   236           case MapStorage::SpecMapSaveOpts::ONE_MAP:
   237             { x("arrow_coords_save_dest", string("arcset_sect_1_map")); }
   238             { x("map_name", mapstorage->getArrowCoordsOneMapName()); }
   239             break;
   240           case MapStorage::SpecMapSaveOpts::TWO_MAPS:
   241             { x("arrow_coords_save_dest", string("arcset_sect_2_maps")); }
   242             { x("map1_name", mapstorage->getArrowCoordsTwoMaps1Name()); }
   243             { x("map2_name", mapstorage->getArrowCoordsTwoMaps2Name()); }
   244             break;
   245         }
   246         break;
   247     }
   248   }
   249 
   250 
   251   std::map<int, std::string> nm;
   252   for(int i=0;i<NODE_PROPERTY_NUM;i++)
   253     {
   254       nm[i]=mapstorage->active_nodemaps[i];
   255     }
   256   { x("active_nodemaps", nm); }
   257 
   258   std::map<int, std::string> em;
   259   for(int i=0;i<EDGE_PROPERTY_NUM;i++)
   260     {
   261       em[i]=mapstorage->active_arcmaps[i];
   262     }
   263   { x("active_arcmaps", em); }
   264 
   265   double attraction;
   266   double propulsation;
   267   int iteration;
   268 
   269   mapstorage->get_design_data(attraction, propulsation, iteration);
   270 
   271   { x("redesign-attraction", attraction); }
   272   { x("redesign-propulsation", propulsation); }
   273   { x("redesign-iteration", iteration); }
   274 }
   275 
   276 //GuiWriter::GuiWriter(LemonWriter& writer, MapStorage* ms) :
   277 GuiWriter::GuiWriter(MapStorage* ms) :
   278   //Parent(writer),
   279   mapstorage(ms)
   280 {
   281 }