637 UEdgeWriter<Graph> uedge_writer; |
637 UEdgeWriter<Graph> uedge_writer; |
638 |
638 |
639 AttributeWriter<WriterTraits> attribute_writer; |
639 AttributeWriter<WriterTraits> attribute_writer; |
640 }; |
640 }; |
641 |
641 |
|
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 |
642 /// @} |
1012 /// @} |
643 |
1013 |
644 } |
1014 } |
645 |
1015 |
646 #endif |
1016 #endif |