COIN-OR::LEMON - Graph Library

Changeset 1030:4936be66d2f5 in lemon-main for lemon/lgf_writer.h


Ignore:
Timestamp:
02/12/13 07:15:52 (7 years ago)
Author:
Balazs Dezso <deba@…>
Branch:
default
Phase:
public
Message:

Changes in BpGraph? lgf reader and writer (#69)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/lgf_writer.h

    r1026 r1030  
    186186      ValueStorage(const Value& value, const Converter& converter = Converter())
    187187        : _value(value), _converter(converter) {}
    188 
     188     
    189189      virtual std::string get() {
    190190        return _converter(_value);
     
    192192    };
    193193
    194     template <typename Value>
     194    template <typename Value,
     195              typename Map = std::map<Value, std::string> >
    195196    struct MapLookUpConverter {
    196       const std::map<Value, std::string>& _map;
    197 
    198       MapLookUpConverter(const std::map<Value, std::string>& map)
     197      const Map& _map;
     198
     199      MapLookUpConverter(const Map& map)
    199200        : _map(map) {}
    200201
    201       std::string operator()(const Value& str) {
    202         typename std::map<Value, std::string>::const_iterator it =
    203           _map.find(str);
     202      std::string operator()(const Value& value) {
     203        typename Map::const_iterator it = _map.find(value);
    204204        if (it == _map.end()) {
    205205          throw FormatError("Item not found");
    206206        }
    207207        return it->second;
     208      }
     209    };
     210
     211    template <typename Value,
     212              typename Map1 = std::map<Value, std::string>,
     213              typename Map2 = std::map<Value, std::string> >
     214    struct DoubleMapLookUpConverter {
     215      const Map1& _map1;
     216      const Map2& _map2;
     217
     218      DoubleMapLookUpConverter(const Map1& map1, const Map2& map2)
     219        : _map1(map1), _map2(map2) {}
     220
     221      std::string operator()(const Value& value) {
     222        typename Map1::const_iterator it1 = _map1.find(value);
     223        typename Map1::const_iterator it2 = _map2.find(value);
     224        if (it1 == _map1.end()) {
     225          if (it2 == _map2.end()) {
     226            throw FormatError("Item not found");
     227          } else {
     228            return it2->second;
     229          }
     230        } else {
     231          if (it2 == _map2.end()) {
     232            return it1->second;
     233          } else {
     234            throw FormatError("Item is ambigous");
     235          }
     236        }
    208237      }
    209238    };
     
    16521681    std::string _attributes_caption;
    16531682
    1654     typedef std::map<Node, std::string> NodeIndex;
    1655     NodeIndex _node_index;
     1683    typedef std::map<Node, std::string> RedNodeIndex;
     1684    RedNodeIndex _red_node_index;
     1685    typedef std::map<Node, std::string> BlueNodeIndex;
     1686    BlueNodeIndex _blue_node_index;
    16561687    typedef std::map<Edge, std::string> EdgeIndex;
    16571688    EdgeIndex _edge_index;
    16581689
    16591690    typedef std::vector<std::pair<std::string,
    1660       _writer_bits::MapStorageBase<Node>* > > NodeMaps;
    1661     NodeMaps _red_maps;
    1662     NodeMaps _blue_maps;
     1691      _writer_bits::MapStorageBase<RedNode>* > > RedNodeMaps;
     1692    RedNodeMaps _red_node_maps;
     1693    typedef std::vector<std::pair<std::string,
     1694      _writer_bits::MapStorageBase<BlueNode>* > > BlueNodeMaps;
     1695    BlueNodeMaps _blue_node_maps;
    16631696
    16641697    typedef std::vector<std::pair<std::string,
     
    17111744    /// \brief Destructor
    17121745    ~BpGraphWriter() {
    1713       for (typename NodeMaps::iterator it = _red_maps.begin();
    1714            it != _red_maps.end(); ++it) {
     1746      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
     1747           it != _red_node_maps.end(); ++it) {
    17151748        delete it->second;
    17161749      }
    17171750
    1718       for (typename NodeMaps::iterator it = _blue_maps.begin();
    1719            it != _blue_maps.end(); ++it) {
     1751      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
     1752           it != _blue_node_maps.end(); ++it) {
    17201753        delete it->second;
    17211754      }
     
    17541787      other.local_os = false;
    17551788
    1756       _node_index.swap(other._node_index);
     1789      _red_node_index.swap(other._red_node_index);
     1790      _blue_node_index.swap(other._blue_node_index);
    17571791      _edge_index.swap(other._edge_index);
    17581792
    1759       _red_maps.swap(other._red_maps);
    1760       _blue_maps.swap(other._blue_maps);
     1793      _red_node_maps.swap(other._red_node_maps);
     1794      _blue_node_maps.swap(other._blue_node_maps);
    17611795      _edge_maps.swap(other._edge_maps);
    17621796      _attributes.swap(other._attributes);
     
    17801814    BpGraphWriter& nodeMap(const std::string& caption, const Map& map) {
    17811815      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1782       _writer_bits::MapStorageBase<Node>* red_storage =
    1783         new _writer_bits::MapStorage<Node, Map>(map);
    1784       _red_maps.push_back(std::make_pair(caption, red_storage));
    1785       _writer_bits::MapStorageBase<Node>* blue_storage =
    1786         new _writer_bits::MapStorage<Node, Map>(map);
    1787       _blue_maps.push_back(std::make_pair(caption, blue_storage));
     1816      _writer_bits::MapStorageBase<RedNode>* red_storage =
     1817        new _writer_bits::MapStorage<RedNode, Map>(map);
     1818      _red_node_maps.push_back(std::make_pair(caption, red_storage));
     1819      _writer_bits::MapStorageBase<BlueNode>* blue_storage =
     1820        new _writer_bits::MapStorage<BlueNode, Map>(map);
     1821      _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
    17881822      return *this;
    17891823    }
     
    17971831                           const Converter& converter = Converter()) {
    17981832      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1799       _writer_bits::MapStorageBase<Node>* red_storage =
    1800         new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
    1801       _red_maps.push_back(std::make_pair(caption, red_storage));
    1802       _writer_bits::MapStorageBase<Node>* blue_storage =
    1803         new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
    1804       _blue_maps.push_back(std::make_pair(caption, blue_storage));
     1833      _writer_bits::MapStorageBase<RedNode>* red_storage =
     1834        new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
     1835      _red_node_maps.push_back(std::make_pair(caption, red_storage));
     1836      _writer_bits::MapStorageBase<BlueNode>* blue_storage =
     1837        new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
     1838      _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
    18051839      return *this;
    18061840    }
     
    18111845    template <typename Map>
    18121846    BpGraphWriter& redNodeMap(const std::string& caption, const Map& map) {
    1813       checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1814       _writer_bits::MapStorageBase<Node>* storage =
    1815         new _writer_bits::MapStorage<Node, Map>(map);
    1816       _red_maps.push_back(std::make_pair(caption, storage));
     1847      checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
     1848      _writer_bits::MapStorageBase<RedNode>* storage =
     1849        new _writer_bits::MapStorage<RedNode, Map>(map);
     1850      _red_node_maps.push_back(std::make_pair(caption, storage));
    18171851      return *this;
    18181852    }
     
    18251859    BpGraphWriter& redNodeMap(const std::string& caption, const Map& map,
    18261860                              const Converter& converter = Converter()) {
    1827       checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1828       _writer_bits::MapStorageBase<Node>* storage =
    1829         new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
    1830       _red_maps.push_back(std::make_pair(caption, storage));
     1861      checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
     1862      _writer_bits::MapStorageBase<RedNode>* storage =
     1863        new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
     1864      _red_node_maps.push_back(std::make_pair(caption, storage));
    18311865      return *this;
    18321866    }
     
    18371871    template <typename Map>
    18381872    BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map) {
    1839       checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1840       _writer_bits::MapStorageBase<Node>* storage =
    1841         new _writer_bits::MapStorage<Node, Map>(map);
    1842       _blue_maps.push_back(std::make_pair(caption, storage));
     1873      checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
     1874      _writer_bits::MapStorageBase<BlueNode>* storage =
     1875        new _writer_bits::MapStorage<BlueNode, Map>(map);
     1876      _blue_node_maps.push_back(std::make_pair(caption, storage));
    18431877      return *this;
    18441878    }
     
    18511885    BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map,
    18521886                               const Converter& converter = Converter()) {
    1853       checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
    1854       _writer_bits::MapStorageBase<Node>* storage =
    1855         new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
    1856       _blue_maps.push_back(std::make_pair(caption, storage));
     1887      checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
     1888      _writer_bits::MapStorageBase<BlueNode>* storage =
     1889        new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
     1890      _blue_node_maps.push_back(std::make_pair(caption, storage));
    18571891      return *this;
    18581892    }
     
    19461980    /// Add a node writing rule to the writer.
    19471981    BpGraphWriter& node(const std::string& caption, const Node& node) {
     1982      typedef _writer_bits::DoubleMapLookUpConverter<
     1983        Node, RedNodeIndex, BlueNodeIndex> Converter;
     1984      Converter converter(_red_node_index, _blue_node_index);
     1985      _writer_bits::ValueStorageBase* storage =
     1986        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
     1987      _attributes.push_back(std::make_pair(caption, storage));
     1988      return *this;
     1989    }
     1990
     1991    /// \brief Red node writing rule
     1992    ///
     1993    /// Add a red node writing rule to the writer.
     1994    BpGraphWriter& redNode(const std::string& caption, const RedNode& node) {
    19481995      typedef _writer_bits::MapLookUpConverter<Node> Converter;
    1949       Converter converter(_node_index);
     1996      Converter converter(_red_node_index);
     1997      _writer_bits::ValueStorageBase* storage =
     1998        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
     1999      _attributes.push_back(std::make_pair(caption, storage));
     2000      return *this;
     2001    }
     2002
     2003    /// \brief Blue node writing rule
     2004    ///
     2005    /// Add a blue node writing rule to the writer.
     2006    BpGraphWriter& blueNode(const std::string& caption, const BlueNode& node) {
     2007      typedef _writer_bits::MapLookUpConverter<Node> Converter;
     2008      Converter converter(_blue_node_index);
    19502009      _writer_bits::ValueStorageBase* storage =
    19512010        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
     
    20342093
    20352094    void writeRedNodes() {
    2036       _writer_bits::MapStorageBase<Node>* label = 0;
    2037       for (typename NodeMaps::iterator it = _red_maps.begin();
    2038            it != _red_maps.end(); ++it) {
     2095      _writer_bits::MapStorageBase<RedNode>* label = 0;
     2096      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
     2097           it != _red_node_maps.end(); ++it) {
    20392098        if (it->first == "label") {
    20402099          label = it->second;
     
    20522111        *_os << "label" << '\t';
    20532112      }
    2054       for (typename NodeMaps::iterator it = _red_maps.begin();
    2055            it != _red_maps.end(); ++it) {
     2113      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
     2114           it != _red_node_maps.end(); ++it) {
    20562115        _writer_bits::writeToken(*_os, it->first) << '\t';
    20572116      }
    20582117      *_os << std::endl;
    20592118
    2060       std::vector<Node> nodes;
     2119      std::vector<RedNode> nodes;
    20612120      for (RedNodeIt n(_graph); n != INVALID; ++n) {
    20622121        nodes.push_back(n);
     
    20722131
    20732132      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
    2074         Node n = nodes[i];
     2133        RedNode n = nodes[i];
    20752134        if (label == 0) {
    20762135          std::ostringstream os;
    2077           os << _graph.id(n);
     2136          os << _graph.id(static_cast<Node>(n));
    20782137          _writer_bits::writeToken(*_os, os.str());
    20792138          *_os << '\t';
    2080           _node_index.insert(std::make_pair(n, os.str()));
    2081         }
    2082         for (typename NodeMaps::iterator it = _red_maps.begin();
    2083              it != _red_maps.end(); ++it) {
     2139          _red_node_index.insert(std::make_pair(n, os.str()));
     2140        }
     2141        for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
     2142             it != _red_node_maps.end(); ++it) {
    20842143          std::string value = it->second->get(n);
    20852144          _writer_bits::writeToken(*_os, value);
    20862145          if (it->first == "label") {
    2087             _node_index.insert(std::make_pair(n, value));
     2146            _red_node_index.insert(std::make_pair(n, value));
    20882147          }
    20892148          *_os << '\t';
     
    20942153
    20952154    void writeBlueNodes() {
    2096       _writer_bits::MapStorageBase<Node>* label = 0;
    2097       for (typename NodeMaps::iterator it = _blue_maps.begin();
    2098            it != _blue_maps.end(); ++it) {
     2155      _writer_bits::MapStorageBase<BlueNode>* label = 0;
     2156      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
     2157           it != _blue_node_maps.end(); ++it) {
    20992158        if (it->first == "label") {
    21002159          label = it->second;
     
    21122171        *_os << "label" << '\t';
    21132172      }
    2114       for (typename NodeMaps::iterator it = _blue_maps.begin();
    2115            it != _blue_maps.end(); ++it) {
     2173      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
     2174           it != _blue_node_maps.end(); ++it) {
    21162175        _writer_bits::writeToken(*_os, it->first) << '\t';
    21172176      }
    21182177      *_os << std::endl;
    21192178
    2120       std::vector<Node> nodes;
     2179      std::vector<BlueNode> nodes;
    21212180      for (BlueNodeIt n(_graph); n != INVALID; ++n) {
    21222181        nodes.push_back(n);
     
    21322191
    21332192      for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
    2134         Node n = nodes[i];
     2193        BlueNode n = nodes[i];
    21352194        if (label == 0) {
    21362195          std::ostringstream os;
    2137           os << _graph.id(n);
     2196          os << _graph.id(static_cast<Node>(n));
    21382197          _writer_bits::writeToken(*_os, os.str());
    21392198          *_os << '\t';
    2140           _node_index.insert(std::make_pair(n, os.str()));
    2141         }
    2142         for (typename NodeMaps::iterator it = _blue_maps.begin();
    2143              it != _blue_maps.end(); ++it) {
     2199          _blue_node_index.insert(std::make_pair(n, os.str()));
     2200        }
     2201        for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
     2202             it != _blue_node_maps.end(); ++it) {
    21442203          std::string value = it->second->get(n);
    21452204          _writer_bits::writeToken(*_os, value);
    21462205          if (it->first == "label") {
    2147             _node_index.insert(std::make_pair(n, value));
     2206            _blue_node_index.insert(std::make_pair(n, value));
    21482207          }
    21492208          *_os << '\t';
     
    21542213
    21552214    void createRedNodeIndex() {
    2156       _writer_bits::MapStorageBase<Node>* label = 0;
    2157       for (typename NodeMaps::iterator it = _red_maps.begin();
    2158            it != _red_maps.end(); ++it) {
     2215      _writer_bits::MapStorageBase<RedNode>* label = 0;
     2216      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
     2217           it != _red_node_maps.end(); ++it) {
    21592218        if (it->first == "label") {
    21602219          label = it->second;
     
    21642223
    21652224      if (label == 0) {
    2166         for (NodeIt n(_graph); n != INVALID; ++n) {
     2225        for (RedNodeIt n(_graph); n != INVALID; ++n) {
    21672226          std::ostringstream os;
    21682227          os << _graph.id(n);
    2169           _node_index.insert(std::make_pair(n, os.str()));
     2228          _red_node_index.insert(std::make_pair(n, os.str()));
    21702229        }
    21712230      } else {
    2172         for (NodeIt n(_graph); n != INVALID; ++n) {
     2231        for (RedNodeIt n(_graph); n != INVALID; ++n) {
    21732232          std::string value = label->get(n);
    2174           _node_index.insert(std::make_pair(n, value));
     2233          _red_node_index.insert(std::make_pair(n, value));
    21752234        }
    21762235      }
     
    21782237
    21792238    void createBlueNodeIndex() {
    2180       _writer_bits::MapStorageBase<Node>* label = 0;
    2181       for (typename NodeMaps::iterator it = _blue_maps.begin();
    2182            it != _blue_maps.end(); ++it) {
     2239      _writer_bits::MapStorageBase<BlueNode>* label = 0;
     2240      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
     2241           it != _blue_node_maps.end(); ++it) {
    21832242        if (it->first == "label") {
    21842243          label = it->second;
     
    21882247
    21892248      if (label == 0) {
    2190         for (NodeIt n(_graph); n != INVALID; ++n) {
     2249        for (BlueNodeIt n(_graph); n != INVALID; ++n) {
    21912250          std::ostringstream os;
    21922251          os << _graph.id(n);
    2193           _node_index.insert(std::make_pair(n, os.str()));
     2252          _blue_node_index.insert(std::make_pair(n, os.str()));
    21942253        }
    21952254      } else {
    2196         for (NodeIt n(_graph); n != INVALID; ++n) {
     2255        for (BlueNodeIt n(_graph); n != INVALID; ++n) {
    21972256          std::string value = label->get(n);
    2198           _node_index.insert(std::make_pair(n, value));
     2257          _blue_node_index.insert(std::make_pair(n, value));
    21992258        }
    22002259      }
     
    22422301      for (int i = 0; i < static_cast<int>(edges.size()); ++i) {
    22432302        Edge e = edges[i];
    2244         _writer_bits::writeToken(*_os, _node_index.
     2303        _writer_bits::writeToken(*_os, _red_node_index.
    22452304                                 find(_graph.redNode(e))->second);
    22462305        *_os << '\t';
    2247         _writer_bits::writeToken(*_os, _node_index.
     2306        _writer_bits::writeToken(*_os, _blue_node_index.
    22482307                                 find(_graph.blueNode(e))->second);
    22492308        *_os << '\t';
Note: See TracChangeset for help on using the changeset viewer.