COIN-OR::LEMON - Graph Library

Changeset 1421:7a21e1414c38 in lemon-0.x for src/lemon/graph_reader.h


Ignore:
Timestamp:
05/14/05 19:39:37 (19 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1891
Message:

IO with undirected edgesets and undirected graphs.
Missing features:

InfoReader?,
aliased edges in undir edgesets

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/lemon/graph_reader.h

    r1408 r1421  
    5757  ///
    5858  /// \code
    59   /// reader.readNodeMap("x-coord", xCoordMap);
    60   /// reader.readNodeMap("y-coord", yCoordMap);
     59  /// reader.readNodeMap("coords", coords);
    6160  ///
    6261  /// reader.readNodeMap<QuotedStringReader>("label", labelMap);
     
    115114    /// Construct a new GraphReader. It reads into the given graph
    116115    /// and it use the given reader as the default skipper.
    117     GraphReader(std::istream& _is, Graph& _graph,
     116    GraphReader(std::istream& _is,
     117                typename SmartParameter<Graph>::Type _graph,
    118118                const DefaultSkipper& _skipper = DefaultSkipper())
    119       : reader(new LemonReader(_is)), own_reader(true),
    120         graph(_graph), skipper(_skipper),
    121         nodeset_reader(*reader, graph, std::string(), skipper),
    122         edgeset_reader(*reader, graph, nodeset_reader, std::string(), skipper),
     119      : reader(new LemonReader(_is)), own_reader(true), skipper(_skipper),
     120        nodeset_reader(*reader, _graph, std::string(), skipper),
     121        edgeset_reader(*reader, _graph, nodeset_reader,
     122                      std::string(), skipper),
    123123        node_reader(*reader, nodeset_reader, std::string()),
    124124        edge_reader(*reader, edgeset_reader, std::string()),
     
    129129    /// Construct a new GraphReader. It reads into the given graph
    130130    /// and it use the given reader as the default skipper.
    131     GraphReader(const std::string& _filename, Graph& _graph,
     131    GraphReader(const std::string& _filename,
     132                typename SmartParameter<Graph>::Type _graph,
    132133                const DefaultSkipper& _skipper = DefaultSkipper())
    133134      : reader(new LemonReader(_filename)), own_reader(true),
    134         graph(_graph), skipper(_skipper),
    135         nodeset_reader(*reader, graph, std::string(), skipper),
    136         edgeset_reader(*reader, graph, nodeset_reader, std::string(), skipper),
     135        skipper(_skipper),
     136        nodeset_reader(*reader, _graph, std::string(), skipper),
     137        edgeset_reader(*reader, _graph, nodeset_reader,
     138                       std::string(), skipper),
    137139        node_reader(*reader, nodeset_reader, std::string()),
    138140        edge_reader(*reader, edgeset_reader, std::string()),
     
    143145    /// Construct a new GraphReader. It reads into the given graph
    144146    /// and it use the given reader as the default skipper.
    145     GraphReader(LemonReader& _reader, Graph& _graph,
     147    GraphReader(LemonReader& _reader,
     148                typename SmartParameter<Graph>::Type _graph,
    146149                const DefaultSkipper& _skipper = DefaultSkipper())
    147       : reader(_reader), own_reader(false),
    148         graph(_graph), skipper(_skipper),
    149         nodeset_reader(*reader, graph, std::string(), skipper),
    150         edgeset_reader(*reader, graph, nodeset_reader, std::string(), skipper),
     150      : reader(_reader), own_reader(false), skipper(_skipper),
     151        nodeset_reader(*reader, _graph, std::string(), skipper),
     152        edgeset_reader(*reader, _graph, nodeset_reader,
     153                      std::string(), skipper),
    151154        node_reader(*reader, nodeset_reader, std::string()),
    152155        edge_reader(*reader, edgeset_reader, std::string()),
     
    166169    template <typename Map>
    167170    GraphReader& readNodeMap(std::string name, Map& map) {
    168       nodeset_reader.readMap(name, map);
     171      nodeset_reader.readNodeMap(name, map);
     172      return *this;
     173    }
     174
     175    template <typename Map>
     176    GraphReader& readNodeMap(std::string name, const Map& map) {
     177      nodeset_reader.readNodeMap(name, map);
    169178      return *this;
    170179    }
     
    176185    GraphReader& readNodeMap(std::string name, Map& map,
    177186                             const Reader& reader = Reader()) {
    178       nodeset_reader.readMap(name, map, reader);
     187      nodeset_reader.readNodeMap(name, map, reader);
     188      return *this;
     189    }
     190
     191    template <typename Reader, typename Map>
     192    GraphReader& readNodeMap(std::string name, const Map& map,
     193                             const Reader& reader = Reader()) {
     194      nodeset_reader.readNodeMap(name, map, reader);
    179195      return *this;
    180196    }
     
    186202    GraphReader& skipNodeMap(std::string name,
    187203                             const Reader& reader = Reader()) {
    188       nodeset_reader.skipMap(name, reader);
     204      nodeset_reader.skipNodeMap(name, reader);
    189205      return *this;
    190206    }
     
    195211    template <typename Map>
    196212    GraphReader& readEdgeMap(std::string name, Map& map) {
    197       edgeset_reader.readMap(name, map);
     213      edgeset_reader.readEdgeMap(name, map);
     214      return *this;
     215    }
     216
     217    template <typename Map>
     218    GraphReader& readEdgeMap(std::string name, const Map& map) {
     219      edgeset_reader.readEdgeMap(name, map);
    198220      return *this;
    199221    }
     
    206228    GraphReader& readEdgeMap(std::string name, Map& map,
    207229                             const Reader& reader = Reader()) {
    208       edgeset_reader.readMap(name, map, reader);
     230      edgeset_reader.readEdgeMap(name, map, reader);
     231      return *this;
     232    }
     233
     234    template <typename Reader, typename Map>
     235    GraphReader& readEdgeMap(std::string name, const Map& map,
     236                             const Reader& reader = Reader()) {
     237      edgeset_reader.readEdgeMap(name, map, reader);
    209238      return *this;
    210239    }
     
    214243    /// Add a new edge map skipper command for the reader.
    215244    template <typename Reader>
    216     GraphReader& skipEdgeMap(std::string name,
     245    GraphReader& skipEdgeMap(std::string name, 
    217246                             const Reader& reader = Reader()) {
    218 
    219       edgeset_reader.skipMap(name, reader);
     247      edgeset_reader.skipEdgeMap(name, reader);
    220248      return *this;
    221249    }
     
    276304    LemonReader* reader;
    277305    bool own_reader;
    278 
    279     Graph& graph;
    280306
    281307    DefaultSkipper skipper;
     
    369395  }
    370396
     397  /// \brief The undir graph reader class.
     398  ///
     399  /// The given file format may contain several maps and labeled nodes or
     400  /// edges.
     401  ///
     402  /// If you read a graph you need not read all the maps and items just those
     403  /// that you need. The interface of the \c GraphReader is very similar to
     404  /// the GraphWriter but the reading method does not depend on the order the
     405  /// given commands.
     406  ///
     407  /// The reader object suppose that each not readed value does not contain
     408  /// whitespaces, therefore it has some extra possibilities to control how
     409  /// it should skip the values when the string representation contains spaces.
     410  ///
     411  /// \code
     412  /// UndirGraphReader<UndirListGraph> reader(std::cin, graph);
     413  /// \endcode
     414  ///
     415  /// The \c readNodeMap() function reads a map from the \c \@nodeset section.
     416  /// If there is a map that you do not want to read from the file and there is
     417  /// whitespace in the string represenation of the values then you should
     418  /// call the \c skipNodeMap() template member function with proper
     419  /// parameters.
     420  ///
     421  /// \code
     422  /// reader.readNodeMap("coords", coords);
     423  ///
     424  /// reader.readNodeMap<QuotedStringReader>("label", labelMap);
     425  /// reader.skipNodeMap<QuotedStringReader>("description");
     426  ///
     427  /// reader.readNodeMap("color", colorMap);
     428  /// \endcode
     429  ///
     430  /// With the \c readUndirEdgeMap() member function you can give an
     431  /// undir edge map reading command similar to the NodeMaps.
     432  ///
     433  /// \code
     434  /// reader.readUndirEdgeMap("capacity", capacityMap);
     435  /// \endcode
     436  ///
     437  /// The reading of the directed edge maps is just a syntactical sugar.
     438  /// It reads two undirected edgemaps into a directed edge map. The
     439  /// undirected edge maps' name should be start with the \c '+' and the
     440  /// \c '-' character and the same.
     441  ///
     442  /// \code
     443  /// reader.readEdgeMap("flow", flowMap);
     444  /// \endcode
     445  ///
     446  /// With \c readNode() and \c readUndirEdge() functions you can read
     447  /// labeled Nodes and UndirEdges.
     448  ///
     449  /// \code
     450  /// reader.readNode("source", sourceNode);
     451  /// reader.readNode("target", targetNode);
     452  ///
     453  /// reader.readUndirEdge("observed", undirEdge);
     454  /// \endcode
     455  ///
     456  /// With the \c readAttribute() functions you can read an attribute
     457  /// in a variable. You can specify the reader for the attribute as
     458  /// the nodemaps.
     459  ///
     460  /// After you give all read commands you must call the \c run() member
     461  /// function, which execute all the commands.
     462  ///
     463  /// \code
     464  /// reader.run();
     465  /// \endcode
     466  ///
     467  /// \see GraphReader
     468  /// \see DefaultReaderTraits
     469  /// \see \ref UndirGraphWriter
     470  /// \see \ref graph-io-page
     471  ///
     472  /// \author Balazs Dezso
     473  template <typename _Graph, typename _ReaderTraits = DefaultReaderTraits>
     474  class UndirGraphReader {
     475  public:
     476   
     477    typedef _Graph Graph;
     478    typedef typename Graph::Node Node;
     479    typedef typename Graph::Edge Edge;
     480    typedef typename Graph::UndirEdge UndirEdge;
     481
     482    typedef _ReaderTraits ReaderTraits;
     483    typedef typename ReaderTraits::Skipper DefaultSkipper;
     484
     485    /// \brief Construct a new UndirGraphReader.
     486    ///
     487    /// Construct a new UndirGraphReader. It reads into the given graph
     488    /// and it use the given reader as the default skipper.
     489    UndirGraphReader(std::istream& _is, Graph& _graph,
     490                     const DefaultSkipper& _skipper = DefaultSkipper())
     491      : reader(new LemonReader(_is)), own_reader(true), skipper(_skipper),
     492        nodeset_reader(*reader, _graph, std::string(), skipper),
     493        undir_edgeset_reader(*reader, _graph, nodeset_reader,
     494                             std::string(), skipper),
     495        node_reader(*reader, nodeset_reader, std::string()),
     496        undir_edge_reader(*reader, undir_edgeset_reader, std::string()),
     497        attribute_reader(*reader, std::string()) {}
     498
     499    /// \brief Construct a new UndirGraphReader.
     500    ///
     501    /// Construct a new UndirGraphReader. It reads into the given graph
     502    /// and it use the given reader as the default skipper.
     503    UndirGraphReader(const std::string& _filename, Graph& _graph,
     504                     const DefaultSkipper& _skipper = DefaultSkipper())
     505      : reader(new LemonReader(_filename)), own_reader(true),
     506        skipper(_skipper),
     507        nodeset_reader(*reader, _graph, std::string(), skipper),
     508        undir_edgeset_reader(*reader, _graph, nodeset_reader,
     509                             std::string(), skipper),
     510        node_reader(*reader, nodeset_reader, std::string()),
     511        undir_edge_reader(*reader, undir_edgeset_reader, std::string()),
     512        attribute_reader(*reader, std::string()) {}
     513
     514    /// \brief Construct a new UndirGraphReader.
     515    ///
     516    /// Construct a new UndirGraphReader. It reads into the given graph
     517    /// and it use the given reader as the default skipper.
     518    UndirGraphReader(LemonReader& _reader, Graph& _graph,
     519                     const DefaultSkipper& _skipper = DefaultSkipper())
     520      : reader(_reader), own_reader(false), skipper(_skipper),
     521        nodeset_reader(*reader, _graph, std::string(), skipper),
     522        undir_edgeset_reader(*reader, _graph, nodeset_reader,
     523                             std::string(), skipper),
     524        node_reader(*reader, nodeset_reader, std::string()),
     525        undir_edge_reader(*reader, undir_edgeset_reader, std::string()),
     526        attribute_reader(*reader, std::string()) {}
     527
     528    /// \brief Destruct the graph reader.
     529    ///
     530    /// Destruct the graph reader.
     531    ~UndirGraphReader() {
     532      if (own_reader)
     533        delete reader;
     534    }
     535
     536    /// \brief Add a new node map reader command for the reader.
     537    ///
     538    /// Add a new node map reader command for the reader.
     539    template <typename Map>
     540    UndirGraphReader& readNodeMap(std::string name, Map& map) {
     541      nodeset_reader.readNodeMap(name, map);
     542      return *this;
     543    }
     544
     545    template <typename Map>
     546    UndirGraphReader& readNodeMap(std::string name, const Map& map) {
     547      nodeset_reader.readNodeMap(name, map);
     548      return *this;
     549    }
     550
     551    /// \brief Add a new node map reader command for the reader.
     552    ///
     553    /// Add a new node map reader command for the reader.
     554    template <typename Reader, typename Map>
     555    UndirGraphReader& readNodeMap(std::string name, Map& map,
     556                                  const Reader& reader = Reader()) {
     557      nodeset_reader.readNodeMap(name, map, reader);
     558      return *this;
     559    }
     560
     561    template <typename Reader, typename Map>
     562    UndirGraphReader& readNodeMap(std::string name, const Map& map,
     563                                  const Reader& reader = Reader()) {
     564      nodeset_reader.readNodeMap(name, map, reader);
     565      return *this;
     566    }
     567
     568    /// \brief Add a new node map skipper command for the reader.
     569    ///
     570    /// Add a new node map skipper command for the reader.
     571    template <typename Reader>
     572    UndirGraphReader& skipNodeMap(std::string name,
     573                             const Reader& reader = Reader()) {
     574      nodeset_reader.skipNodeMap(name, reader);
     575      return *this;
     576    }
     577
     578    /// \brief Add a new undirected edge map reader command for the reader.
     579    ///
     580    /// Add a new undirected edge map reader command for the reader.
     581    template <typename Map>
     582    UndirGraphReader& readUndirEdgeMap(std::string name, Map& map) {
     583      undir_edgeset_reader.readUndirEdgeMap(name, map);
     584      return *this;
     585    }
     586
     587    template <typename Map>
     588    UndirGraphReader& readUndirEdgeMap(std::string name, const Map& map) {
     589      undir_edgeset_reader.readUndirEdgeMap(name, map);
     590      return *this;
     591    }
     592
     593
     594    /// \brief Add a new undirected edge map reader command for the reader.
     595    ///
     596    /// Add a new undirected edge map reader command for the reader.
     597    template <typename Reader, typename Map>
     598    UndirGraphReader& readUndirEdgeMap(std::string name, Map& map,
     599                                       const Reader& reader = Reader()) {
     600      undir_edgeset_reader.readUndirEdgeMap(name, map, reader);
     601      return *this;
     602    }
     603
     604    template <typename Reader, typename Map>
     605    UndirGraphReader& readUndirEdgeMap(std::string name, const Map& map,
     606                                       const Reader& reader = Reader()) {
     607      undir_edgeset_reader.readUndirEdgeMap(name, map, reader);
     608      return *this;
     609    }
     610
     611    /// \brief Add a new undirected edge map skipper command for the reader.
     612    ///
     613    /// Add a new undirected edge map skipper command for the reader.
     614    template <typename Reader>
     615    UndirGraphReader& skipUndirEdgeMap(std::string name,
     616                                       const Reader& reader = Reader()) {
     617      undir_edgeset_reader.skipUndirMap(name, reader);
     618      return *this;
     619    }
     620
     621
     622    /// \brief Add a new edge map reader command for the reader.
     623    ///
     624    /// Add a new edge map reader command for the reader.
     625    template <typename Map>
     626    UndirGraphReader& readEdgeMap(std::string name, Map& map) {
     627      undir_edgeset_reader.readEdgeMap(name, map);
     628      return *this;
     629    }
     630
     631    template <typename Map>
     632    UndirGraphReader& readEdgeMap(std::string name, const Map& map) {
     633      undir_edgeset_reader.readEdgeMap(name, map);
     634      return *this;
     635    }
     636
     637
     638    /// \brief Add a new edge map reader command for the reader.
     639    ///
     640    /// Add a new edge map reader command for the reader.
     641    template <typename Reader, typename Map>
     642    UndirGraphReader& readEdgeMap(std::string name, Map& map,
     643                                       const Reader& reader = Reader()) {
     644      undir_edgeset_reader.readEdgeMap(name, map, reader);
     645      return *this;
     646    }
     647
     648    template <typename Reader, typename Map>
     649    UndirGraphReader& readEdgeMap(std::string name, const Map& map,
     650                                       const Reader& reader = Reader()) {
     651      undir_edgeset_reader.readEdgeMap(name, map, reader);
     652      return *this;
     653    }
     654
     655    /// \brief Add a new edge map skipper command for the reader.
     656    ///
     657    /// Add a new edge map skipper command for the reader.
     658    template <typename Reader>
     659    UndirGraphReader& skipEdgeMap(std::string name,
     660                                       const Reader& reader = Reader()) {
     661      undir_edgeset_reader.skipEdgeMap(name, reader);
     662      return *this;
     663    }
     664
     665    /// \brief Add a new labeled node reader for the reader.
     666    ///
     667    /// Add a new labeled node reader for the reader.
     668    UndirGraphReader& readNode(std::string name, Node& node) {
     669      node_reader.readNode(name, node);
     670      return *this;
     671    }
     672
     673    /// \brief Add a new labeled edge reader for the reader.
     674    ///
     675    /// Add a new labeled edge reader for the reader.
     676    UndirGraphReader& readUndirEdge(std::string name, UndirEdge& edge) {
     677      undir_edge_reader.readUndirEdge(name, edge);
     678    }
     679
     680    /// \brief Add a new attribute reader command.
     681    ///
     682    ///  Add a new attribute reader command.
     683    template <typename Value>
     684    UndirGraphReader& readAttribute(std::string name, Value& value) {
     685      attribute_reader.readAttribute(name, value);
     686      return *this;
     687    }
     688   
     689    /// \brief Add a new attribute reader command.
     690    ///
     691    ///  Add a new attribute reader command.
     692    template <typename Reader, typename Value>
     693    UndirGraphReader& readAttribute(std::string name, Value& value,
     694                               const Reader& reader) {
     695      attribute_reader.readAttribute<Reader>(name, value, reader);
     696      return *this;
     697    }
     698
     699    /// \brief Conversion operator to LemonReader.
     700    ///
     701    /// Conversion operator to LemonReader. It make possible
     702    /// to access the encapsulated \e LemonReader, this way
     703    /// you can attach to this reader new instances of
     704    /// \e LemonReader::SectionReader.
     705    operator LemonReader&() {
     706      return *reader;
     707    }
     708
     709    /// \brief Executes the reader commands.
     710    ///
     711    /// Executes the reader commands.
     712    void run() {
     713      reader->run();
     714    }
     715
     716  private:
     717
     718    LemonReader* reader;
     719    bool own_reader;
     720
     721    DefaultSkipper skipper;
     722
     723    NodeSetReader<Graph, ReaderTraits> nodeset_reader;
     724    UndirEdgeSetReader<Graph, ReaderTraits> undir_edgeset_reader;
     725
     726    NodeReader<Graph> node_reader;
     727    UndirEdgeReader<Graph> undir_edge_reader;
     728   
     729    AttributeReader<ReaderTraits> attribute_reader;
     730  };
     731
     732  /// \brief Read an undir graph from the input.
     733  ///
     734  /// Read an undir graph from the input.
     735  /// \param is The input stream.
     736  /// \param g The graph.
     737  /// \param capacity The capacity map.
     738  template<typename Graph, typename CapacityMap>
     739  void readUndirGraph(std::istream& is, Graph &g, CapacityMap& capacity) {
     740    UndirGraphReader<Graph> reader(is, g);
     741    reader.readUndirEdgeMap("capacity", capacity);
     742    reader.run();
     743  }
     744
     745  /// \brief Read an undir graph from the input.
     746  ///
     747  /// Read an undir graph from the input.
     748  /// \param is The input stream.
     749  /// \param g The graph.
     750  template<typename Graph>
     751  void readUndirGraph(std::istream& is, Graph &g) {
     752    UndirGraphReader<Graph> reader(is, g);
     753    reader.run();
     754  }
     755
    371756  /// @}
    372757}
Note: See TracChangeset for help on using the changeset viewer.