COIN-OR::LEMON - Graph Library

Changeset 2502:9c23c3762bc5 in lemon-0.x for lemon/graph_writer.h


Ignore:
Timestamp:
10/24/07 18:31:49 (16 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3342
Message:

BpUGraphReader and Writer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/graph_writer.h

    r2467 r2502  
    157157    /// \brief Issue a new node map writing command for the writer.
    158158    ///
    159    /// This function issues a new <i> node map writing command</i> to the writer.
     159    /// This function issues a new <i> node map writing command</i> to the writer.
    160160    template <typename Map>
    161161    GraphWriter& writeNodeMap(std::string label, const Map& map) {
     
    167167    /// \brief Issue a new node map writing command for the writer.
    168168    ///
    169    /// This function issues a new <i> node map writing command</i> to the writer.
     169    /// This function issues a new <i> node map writing command</i> to the writer.
    170170    template <typename ItemWriter, typename Map>
    171171    GraphWriter& writeNodeMap(std::string label, const Map& map,
     
    640640  };
    641641
     642  /// \brief The bipartite graph writer class.
     643  ///
     644  /// The \c BpUGraphWriter class provides the ugraph output. To write
     645  /// a graph you should first give writing commands to the writer. You can
     646  /// declare write command as \c NodeMap, \c EdgeMap or \c UEdgeMap
     647  /// writing and labeled Node, Edge or UEdge writing.
     648  ///
     649  ///\code
     650  /// BpUGraphWriter<ListUGraph> writer(std::cout, graph);
     651  ///\endcode
     652  ///
     653  /// The \c writeNodeMap() function declares a \c NodeMap writing
     654  /// command in the \c BpUGraphWriter. You should give as parameter
     655  /// the name of the map and the map object. The NodeMap writing
     656  /// command with name "label" should write a unique map because it
     657  /// is regarded as label map.
     658  ///
     659  ///\code
     660  /// IdMap<ListUGraph, Node> nodeLabelMap;
     661  /// writer.writeNodeMap("label", nodeLabelMap);
     662  ///
     663  /// writer.writeNodeMap("coords", coords);
     664  /// writer.writeNodeMap("color", colorMap);
     665  ///\endcode
     666  ///
     667  /// With the \c writeUEdgeMap() member function you can give an
     668  /// undirected edge map writing command similar to the NodeMaps.
     669  ///
     670  ///\code
     671  /// DescriptorMap<ListGraph, Edge, ListGraph::EdgeMap<int> >
     672  ///   edgeDescMap(graph);
     673  /// writer.writeUEdgeMap("descriptor", edgeDescMap);
     674  ///
     675  /// writer.writeUEdgeMap("weight", weightMap);
     676  /// writer.writeUEdgeMap("label", labelMap);
     677  ///\endcode
     678  ///
     679  /// The EdgeMap handling is just a syntactical sugar. It writes
     680  /// two undirected edge map with '+' and '-' prefix in the name.
     681  ///
     682  ///\code
     683  /// writer.writeEdgeMap("capacity", capacityMap);
     684  ///\endcode
     685  ///
     686  ///
     687  /// With \c writeNode() and \c writeUEdge() functions you can
     688  /// designate nodes and undirected edges in the graph. For example, you can
     689  /// write out the source and target of the graph.
     690  ///
     691  ///\code
     692  /// writer.writeNode("source", sourceNode);
     693  /// writer.writeNode("target", targetNode);
     694  ///
     695  /// writer.writeUEdge("observed", uEdge);
     696  ///\endcode
     697  ///
     698  /// After you give all write commands you must call the \c run() member
     699  /// function, which executes all the writing commands.
     700  ///
     701  ///\code
     702  /// writer.run();
     703  ///\endcode
     704  ///
     705  /// \see DefaultWriterTraits
     706  /// \see QuotedStringWriter
     707  /// \see IdMap
     708  /// \see DescriptorMap
     709  /// \see \ref GraphWriter
     710  /// \see \ref graph-io-page
     711  /// \author Balazs Dezso
     712  template <typename _Graph, typename _WriterTraits = DefaultWriterTraits>
     713  class BpUGraphWriter {
     714  public:
     715   
     716    typedef _Graph Graph;
     717    typedef typename Graph::Node Node;
     718    typedef typename Graph::Edge Edge;
     719    typedef typename Graph::UEdge UEdge;
     720
     721    typedef _WriterTraits WriterTraits;
     722
     723    /// \brief Construct a new BpUGraphWriter.
     724    ///
     725    /// Construct a new BpUGraphWriter. It writes the given graph
     726    /// to the given stream.
     727    BpUGraphWriter(std::ostream& _os, const Graph& _graph)
     728      : writer(new LemonWriter(_os)), own_writer(true),
     729        nodeset_writer(*writer, _graph, std::string()),
     730        uedgeset_writer(*writer, _graph, nodeset_writer, std::string()),
     731        node_writer(*writer, nodeset_writer, std::string()),
     732        uedge_writer(*writer, uedgeset_writer, std::string()),
     733        attribute_writer(*writer, std::string()) {}
     734
     735    /// \brief Construct a new BpUGraphWriter.
     736    ///
     737    /// Construct a new BpUGraphWriter. It writes the given graph
     738    /// to the given file.
     739    BpUGraphWriter(const std::string& _filename, const Graph& _graph)
     740      : writer(new LemonWriter(_filename)), own_writer(true),
     741        nodeset_writer(*writer, _graph, std::string()),
     742        uedgeset_writer(*writer, _graph, nodeset_writer, std::string()),
     743        node_writer(*writer, nodeset_writer, std::string()),
     744        uedge_writer(*writer, uedgeset_writer, std::string()),
     745        attribute_writer(*writer, std::string()) {}
     746
     747    /// \brief Construct a new BpUGraphWriter.
     748    ///
     749    /// Construct a new BpUGraphWriter. It writes the given graph
     750    /// to given LemonWriter.
     751    BpUGraphWriter(LemonWriter& _writer, const Graph& _graph)
     752      : writer(_writer), own_writer(false),
     753        nodeset_writer(*writer, _graph, std::string()),
     754        uedgeset_writer(*writer, _graph, nodeset_writer, std::string()),
     755        node_writer(*writer, nodeset_writer, std::string()),
     756        uedge_writer(*writer, uedgeset_writer, std::string()),
     757        attribute_writer(*writer, std::string()) {}
     758
     759    /// \brief Destruct the graph writer.
     760    ///
     761    /// Destruct the graph writer.
     762    ~BpUGraphWriter() {
     763      if (own_writer)
     764        delete writer;
     765    }
     766
     767    /// \brief Issue a new node map writing command to the writer.
     768    ///
     769    /// This function issues a new <i> node map writing command</i> to
     770    /// the writer.
     771    template <typename Map>
     772    BpUGraphWriter& writeNodeMap(std::string label, const Map& map) {
     773      nodeset_writer.writeNodeMap(label, map);
     774      return *this;
     775    }
     776
     777    /// \brief Issue a new node map writing command to the writer.
     778    ///
     779    /// This function issues a new <i> node map writing command</i> to
     780    /// the writer.
     781    template <typename ItemWriter, typename Map>
     782    BpUGraphWriter& writeNodeMap(std::string label, const Map& map,
     783                              const ItemWriter& iw = ItemWriter()) {
     784      nodeset_writer.writeNodeMap(label, map, iw);
     785      return *this;
     786    }
     787
     788    /// \brief Issue a new A-node map writing command to the writer.
     789    ///
     790    /// This function issues a new <i> A-node map writing command</i> to
     791    /// the writer.
     792    template <typename Map>
     793    BpUGraphWriter& writeANodeMap(std::string label, const Map& map) {
     794      nodeset_writer.writeANodeMap(label, map);
     795      return *this;
     796    }
     797
     798    /// \brief Issue a new A-node map writing command to the writer.
     799    ///
     800    /// This function issues a new <i> A-node map writing command</i> to
     801    /// the writer.
     802    template <typename ItemWriter, typename Map>
     803    BpUGraphWriter& writeANodeMap(std::string label, const Map& map,
     804                              const ItemWriter& iw = ItemWriter()) {
     805      nodeset_writer.writeANodeMap(label, map, iw);
     806      return *this;
     807    }
     808    /// \brief Issue a new B-node map writing command to the writer.
     809    ///
     810    /// This function issues a new <i> B-node map writing command</i> to
     811    /// the writer.
     812    template <typename Map>
     813    BpUGraphWriter& writeBNodeMap(std::string label, const Map& map) {
     814      nodeset_writer.writeBNodeMap(label, map);
     815      return *this;
     816    }
     817
     818    /// \brief Issue a new B-node map writing command to the writer.
     819    ///
     820    /// This function issues a new <i> B-node map writing command</i> to
     821    /// the writer.
     822    template <typename ItemWriter, typename Map>
     823    BpUGraphWriter& writeBNodeMap(std::string label, const Map& map,
     824                              const ItemWriter& iw = ItemWriter()) {
     825      nodeset_writer.writeBNodeMap(label, map, iw);
     826      return *this;
     827    }
     828
     829    /// \brief Issue a new edge map writing command to the writer.
     830    ///
     831    /// This function issues a new <i> edge map writing command</i> to
     832    /// the writer.
     833    template <typename Map>
     834    BpUGraphWriter& writeEdgeMap(std::string label, const Map& map) {
     835      uedgeset_writer.writeEdgeMap(label, map);
     836      return *this;
     837    }
     838
     839    /// \brief Issue a new edge map writing command to the writer.
     840    ///
     841    /// This function issues a new <i> edge map writing command</i> to
     842    /// the writer.
     843    template <typename ItemWriter, typename Map>
     844    BpUGraphWriter& writeEdgeMap(std::string label, const Map& map,
     845                                   const ItemWriter& iw = ItemWriter()) {
     846      uedgeset_writer.writeEdgeMap(label, map, iw);
     847      return *this;
     848    }
     849
     850    /// \brief Issue a new undirected edge map writing command to the writer.
     851    ///
     852    /// This function issues a new <i> undirected edge map writing
     853    /// command</i> to the writer.
     854    template <typename Map>
     855    BpUGraphWriter& writeUEdgeMap(std::string label, const Map& map) {
     856      uedgeset_writer.writeUEdgeMap(label, map);
     857      return *this;
     858    }
     859
     860    /// \brief Issue a new undirected edge map writing command to the writer.
     861    ///
     862    /// This function issues a new <i> undirected edge map writing
     863    /// command</i> to the writer.
     864   template <typename ItemWriter, typename Map>
     865    BpUGraphWriter& writeUEdgeMap(std::string label, const Map& map,
     866                                        const ItemWriter& iw = ItemWriter()) {
     867      uedgeset_writer.writeUEdgeMap(label, map, iw);
     868      return *this;
     869    }
     870
     871    /// \brief Issue a new labeled node writer to the writer.
     872    ///
     873    /// This function issues a new <i> labeled node writing
     874    /// command</i> to the writer.
     875    BpUGraphWriter& writeNode(std::string label, const Node& node) {
     876      node_writer.writeNode(label, node);
     877      return *this;
     878    }
     879
     880    /// \brief Issue a new labeled edge writer to the writer.
     881    ///
     882    /// This function issues a new <i> labeled edge writing
     883    /// command</i> to the writer.
     884    BpUGraphWriter& writeEdge(std::string label, const Edge& edge) {
     885      uedge_writer.writeEdge(label, edge);
     886    }
     887
     888    /// \brief Issue a new labeled undirected edge writing command to
     889    /// the writer.
     890    ///
     891    /// Issue a new <i>labeled undirected edge writing command</i> to
     892    /// the writer.
     893    BpUGraphWriter& writeUEdge(std::string label, const UEdge& edge) {
     894      uedge_writer.writeUEdge(label, edge);
     895    }
     896
     897    /// \brief Issue a new attribute writing command.
     898    ///
     899    /// This function issues a new <i> attribute writing
     900    /// command</i> to the writer.
     901    template <typename Value>
     902    BpUGraphWriter& writeAttribute(std::string label, const Value& value) {
     903      attribute_writer.writeAttribute(label, value);
     904      return *this;
     905    }
     906   
     907    /// \brief Issue a new attribute writing command.
     908    ///
     909    /// This function issues a new <i> attribute writing
     910    /// command</i> to the writer.
     911    template <typename ItemWriter, typename Value>
     912    BpUGraphWriter& writeAttribute(std::string label, const Value& value,
     913                               const ItemWriter& iw = ItemWriter()) {
     914      attribute_writer.writeAttribute(label, value, iw);
     915      return *this;
     916    }
     917
     918    /// \brief Conversion operator to LemonWriter.
     919    ///
     920    /// Conversion operator to LemonWriter. It makes possible
     921    /// to access the encapsulated \e LemonWriter, this way
     922    /// you can attach to this writer new instances of
     923    /// \e LemonWriter::SectionWriter.
     924    operator LemonWriter&() {
     925      return *writer;
     926    }
     927
     928    /// \brief Executes the writing commands.
     929    ///
     930    /// Executes the writing commands.
     931    void run() {
     932      writer->run();
     933    }
     934
     935    /// \brief Returns true if the writer can give back the labels by the items.
     936    ///
     937    /// Returns true if the writer can give back the the labels by the items.
     938    bool isLabelWriter() const {
     939      return nodeset_writer.isLabelWriter() &&
     940        uedgeset_writer.isLabelWriter();
     941    }
     942
     943    /// \brief Write the label of the given node.
     944    ///
     945    /// It writes the label of the given node. If there was written a "label"
     946    /// named node map then it will write the map value belonging to the node.
     947    void writeLabel(std::ostream& os, const Node& item) const {
     948      nodeset_writer.writeLabel(os, item);
     949    }
     950
     951    /// \brief Write the label of the given edge.
     952    ///
     953    /// It writes the label of the given edge. If there was written a "label"
     954    /// named edge map then it will write the map value belonging to the edge.
     955    void writeLabel(std::ostream& os, const Edge& item) const {
     956      uedgeset_writer.writeLabel(os, item);
     957    }
     958
     959    /// \brief Write the label of the given undirected edge.
     960    ///
     961    /// It writes the label of the given undirected edge. If there was
     962    /// written a "label" named edge map then it will write the map
     963    /// value belonging to the edge.
     964    void writeLabel(std::ostream& os, const UEdge& item) const {
     965      uedgeset_writer.writeLabel(os, item);
     966    }
     967
     968    /// \brief Sorts the given node vector by label.
     969    ///
     970    /// Sorts the given node vector by label. If there was written an
     971    /// "label" named map then the vector will be sorted by the values
     972    /// of this map. Otherwise if the \c forceLabel parameter was true
     973    /// it will be sorted by its id in the graph.
     974    void sortByLabel(std::vector<Node>& nodes) const {
     975      nodeset_writer.sortByLabel(nodes);
     976    }
     977
     978    /// \brief Sorts the given edge vector by label.
     979    ///
     980    /// Sorts the given edge vector by label. If there was written an
     981    /// "label" named map then the vector will be sorted by the values
     982    /// of this map. Otherwise if the \c forceLabel parameter was true
     983    /// it will be sorted by its id in the graph.
     984    void sortByLabel(std::vector<Edge>& edges) const {
     985      uedgeset_writer.sortByLabel(edges);
     986    }
     987
     988    /// \brief Sorts the given undirected edge vector by label.
     989    ///
     990    /// Sorts the given undirected edge vector by label. If there was
     991    /// written an "label" named map then the vector will be sorted by
     992    /// the values of this map. Otherwise if the \c forceLabel
     993    /// parameter was true it will be sorted by its id in the graph.
     994    void sortByLabel(std::vector<UEdge>& uedges) const {
     995      uedgeset_writer.sortByLabel(uedges);
     996    }
     997
     998  private:
     999
     1000    LemonWriter* writer;
     1001    bool own_writer;
     1002
     1003    BpNodeSetWriter<Graph, WriterTraits> nodeset_writer;
     1004    UEdgeSetWriter<Graph, WriterTraits> uedgeset_writer;
     1005
     1006    NodeWriter<Graph> node_writer;
     1007    UEdgeWriter<Graph> uedge_writer;
     1008   
     1009    AttributeWriter<WriterTraits> attribute_writer;
     1010  };
     1011
    6421012  /// @}
    6431013
Note: See TracChangeset for help on using the changeset viewer.