COIN-OR::LEMON - Graph Library

Ticket #35: 9159de5e9657.patch

File 9159de5e9657.patch, 7.2 KB (added by Balazs Dezso, 16 years ago)
  • lemon/lgf_reader.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1214987834 -7200
    # Node ID 9159de5e96575000084e63974303ad6fa5329d02
    # Parent  33e45a9b868cab9cfeed4563edae07c42f908abd
    Improvments in map name handling
    
     - The label map is not necessary
     - If the item set is empty and no map is read, then the map name line can
       be ommited
    
    diff -r 33e45a9b868c -r 9159de5e9657 lemon/lgf_reader.h
    a b  
    881881      std::vector<int> map_index(_node_maps.size());
    882882      int map_num, label_index;
    883883
    884       if (!readLine())
    885         throw DataFormatError("Cannot find map captions");
    886      
     884      char c;
     885      if (!readLine() || !(line >> c) || c == '@') {
     886        if (readSuccess() && line) line.putback(c);
     887        if (!_node_maps.empty())
     888          throw DataFormatError("Cannot find map names");
     889        return;
     890      }
     891      line.putback(c);
     892
    887893      {
    888894        std::map<std::string, int> maps;
    889895       
     
    912918
    913919        {
    914920          std::map<std::string, int>::iterator jt = maps.find("label");
    915           if (jt == maps.end())
    916             throw DataFormatError("Label map not found in file");
    917           label_index = jt->second;
     921          if (jt != maps.end()) {
     922            label_index = jt->second;
     923          } else {
     924            label_index = -1;
     925          }
    918926        }
    919927        map_num = maps.size();
    920928      }
    921929
    922       char c;
    923930      while (readLine() && line >> c && c != '@') {
    924931        line.putback(c);
    925932
     
    937944        Node n;
    938945        if (!_use_nodes) {
    939946          n = _digraph.addNode();
    940           _node_index.insert(std::make_pair(tokens[label_index], n));
     947          if (label_index != -1)
     948            _node_index.insert(std::make_pair(tokens[label_index], n));
    941949        } else {
     950          if (label_index == -1)
     951            throw DataFormatError("Label map not found in file");
    942952          typename std::map<std::string, Node>::iterator it =
    943953            _node_index.find(tokens[label_index]);
    944954          if (it == _node_index.end()) {
     
    964974      std::vector<int> map_index(_arc_maps.size());
    965975      int map_num, label_index;
    966976
    967       if (!readLine())
    968         throw DataFormatError("Cannot find map captions");
     977      char c;
     978      if (!readLine() || !(line >> c) || c == '@') {
     979        if (readSuccess() && line) line.putback(c);
     980        if (!_arc_maps.empty())
     981          throw DataFormatError("Cannot find map names");
     982        return;
     983      }
     984      line.putback(c);
    969985     
    970986      {
    971987        std::map<std::string, int> maps;
     
    9951011
    9961012        {
    9971013          std::map<std::string, int>::iterator jt = maps.find("label");
    998           if (jt == maps.end())
    999             throw DataFormatError("Label map not found in file");
    1000           label_index = jt->second;
     1014          if (jt != maps.end()) {
     1015            label_index = jt->second;
     1016          } else {
     1017            label_index = -1;
     1018          }
    10011019        }
    10021020        map_num = maps.size();
    10031021      }
    10041022
    1005       char c;
    10061023      while (readLine() && line >> c && c != '@') {
    10071024        line.putback(c);
    10081025
     
    10131030          throw DataFormatError("Source not found");
    10141031
    10151032        if (!_reader_bits::readToken(line, target_token))
    1016           throw DataFormatError("Source not found");
     1033          throw DataFormatError("Target not found");
    10171034       
    10181035        std::vector<std::string> tokens(map_num);
    10191036        for (int i = 0; i < map_num; ++i) {
     
    10481065          Node target = it->second;                           
    10491066
    10501067          a = _digraph.addArc(source, target);
    1051           _arc_index.insert(std::make_pair(tokens[label_index], a));
     1068          if (label_index != -1)
     1069            _arc_index.insert(std::make_pair(tokens[label_index], a));
    10521070        } else {
     1071          if (label_index == -1)
     1072            throw DataFormatError("Label map not found in file");
    10531073          typename std::map<std::string, Arc>::iterator it =
    10541074            _arc_index.find(tokens[label_index]);
    10551075          if (it == _arc_index.end()) {
     
    17231743      std::vector<int> map_index(_node_maps.size());
    17241744      int map_num, label_index;
    17251745
    1726       if (!readLine())
    1727         throw DataFormatError("Cannot find map captions");
     1746      char c;
     1747      if (!readLine() || !(line >> c) || c == '@') {
     1748        if (readSuccess() && line) line.putback(c);
     1749        if (!_node_maps.empty())
     1750          throw DataFormatError("Cannot find map names");
     1751        return;
     1752      }
     1753      line.putback(c);
    17281754     
    17291755      {
    17301756        std::map<std::string, int> maps;
     
    17541780
    17551781        {
    17561782          std::map<std::string, int>::iterator jt = maps.find("label");
    1757           if (jt == maps.end())
    1758             throw DataFormatError("Label map not found in file");
    1759           label_index = jt->second;
     1783          if (jt != maps.end()) {
     1784            label_index = jt->second;
     1785          } else {
     1786            label_index = -1;
     1787          }
    17601788        }
    17611789        map_num = maps.size();
    17621790      }
    17631791
    1764       char c;
    17651792      while (readLine() && line >> c && c != '@') {
    17661793        line.putback(c);
    17671794
     
    17791806        Node n;
    17801807        if (!_use_nodes) {
    17811808          n = _graph.addNode();
    1782           _node_index.insert(std::make_pair(tokens[label_index], n));
     1809          if (label_index != -1)
     1810            _node_index.insert(std::make_pair(tokens[label_index], n));
    17831811        } else {
     1812          if (label_index == -1)
     1813            throw DataFormatError("Label map not found in file");
    17841814          typename std::map<std::string, Node>::iterator it =
    17851815            _node_index.find(tokens[label_index]);
    17861816          if (it == _node_index.end()) {
     
    18061836      std::vector<int> map_index(_edge_maps.size());
    18071837      int map_num, label_index;
    18081838
    1809       if (!readLine())
    1810         throw DataFormatError("Cannot find map captions");
     1839      char c;
     1840      if (!readLine() || !(line >> c) || c == '@') {
     1841        if (readSuccess() && line) line.putback(c);
     1842        if (!_edge_maps.empty())
     1843          throw DataFormatError("Cannot find map names");
     1844        return;
     1845      }
     1846      line.putback(c);
    18111847     
    18121848      {
    18131849        std::map<std::string, int> maps;
     
    18371873
    18381874        {
    18391875          std::map<std::string, int>::iterator jt = maps.find("label");
    1840           if (jt == maps.end())
    1841             throw DataFormatError("Label map not found in file");
    1842           label_index = jt->second;
     1876          if (jt != maps.end()) {
     1877            label_index = jt->second;
     1878          } else {
     1879            label_index = -1;
     1880          }
    18431881        }
    18441882        map_num = maps.size();
    18451883      }
    18461884
    1847       char c;
    18481885      while (readLine() && line >> c && c != '@') {
    18491886        line.putback(c);
    18501887
     
    18521889        std::string target_token;
    18531890
    18541891        if (!_reader_bits::readToken(line, source_token))
    1855           throw DataFormatError("Source not found");
     1892          throw DataFormatError("Node u not found");
    18561893
    18571894        if (!_reader_bits::readToken(line, target_token))
    1858           throw DataFormatError("Source not found");
     1895          throw DataFormatError("Node v not found");
    18591896       
    18601897        std::vector<std::string> tokens(map_num);
    18611898        for (int i = 0; i < map_num; ++i) {
     
    18901927          Node target = it->second;                           
    18911928
    18921929          e = _graph.addEdge(source, target);
    1893           _edge_index.insert(std::make_pair(tokens[label_index], e));
     1930          if (label_index != -1)
     1931            _edge_index.insert(std::make_pair(tokens[label_index], e));
    18941932        } else {
     1933          if (label_index == -1)
     1934            throw DataFormatError("Label map not found in file");
    18951935          typename std::map<std::string, Edge>::iterator it =
    18961936            _edge_index.find(tokens[label_index]);
    18971937          if (it == _edge_index.end()) {
     
    23252365    }
    23262366
    23272367    void readMaps(std::vector<std::string>& maps) {
    2328       if (!readLine())
    2329         throw DataFormatError("Cannot find map captions");
     2368      char c;
     2369      if (!readLine() || !(line >> c) || c == '@') {
     2370        if (readSuccess() && line) line.putback(c);
     2371        return;
     2372      }
     2373      line.putback(c);
    23302374      std::string map;
    23312375      while (_reader_bits::readToken(line, map)) {
    23322376        maps.push_back(map);