Following code save a graph into a graphml file. It works!. But when I replace typedef adjacency_list< vecS, vecS, directedS,
with typedef adjacency_list< setS, setS, directedS,
so that no duplicate vertex or edge is inserted into the graph, it complains.
#include <boost/graph/graphml.hpp>
using namespace std;
typedef struct {
string name;
string label;
} vertex_type_t;
int main(int,char*[])
{
using namespace boost;
typedef adjacency_list< vecS, vecS, directedS,
vertex_type_t > graph_t;
graph_t g;
graph_t::vertex_descriptor v1 = add_vertex(g);
graph_t::vertex_descriptor v2 = add_vertex(g);
dynamic_properties dp;
dp.property("name", get(&vertex_type_t::name, g));
write_graphml(std::cout, g, dp, true);
return 0;
}
I can not make much out of the error. I believe following is the main error.
/usr/include/boost/graph/graphml.hpp: In function ‘void boost::write_graphml(std::ostream&, const Graph&, VertexIndexMap, const boost::dynamic_properties&, bool) [with Graph = boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, VertexIndexMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, std::ostream = std::basic_ostream<char>]’:
/usr/include/boost/graph/graphml.hpp:345:5: instantiated from ‘void boost::write_graphml(std::ostream&, const Graph&, const boost::dynamic_properties&, bool) [with Graph = boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, std::ostream = std::basic_ostream<char>]’
write_graphviz.cpp:24:39: instantiated from here
/usr/include/boost/graph/graphml.hpp:301:9: error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char>]((* & out), ((const char*)" <node id=\"n")) << boost::get [with PropertyMap = boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t>, Reference = const boost::detail::error_property_not_found&, K = void*]((*(const boost::put_get_helper<const boost::detail::error_property_not_found&, boost::adj_list_vertex_property_map<boost::adjacency_list<boost::setS, boost::setS, boost::directedS, vertex_type_t>, boost::detail::error_property_not_found, const boost::detail::error_property_not_found&, boost::vertex_index_t> >*)(& vertex_index)), (* & v.std::_Rb_tree_const_iterator<_Tp>::operator* [with _Tp = void*, std::_Rb_tree_const_iterator<_Tp>::reference = void* const&]()))’
/usr/include/boost/graph/graphml.hpp:301:9: note: candidates are:
/usr/include/c++/4.6/ostream:110:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>]
/usr/include/c++/4.6/ostream:110:7: note: no known conversion for argument 1 from ‘const boost::detail::error_property_not_found’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’
/usr/include/c++/4.6/ostream:119:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>, std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>]
I really want to use setS as edge containers. I am not sure how to modify this program such that it starts working since error message is not making much sense to me.
My first thought is this that the new graphtype (with setS) does not satisfy the requirements to the write_graphml(..) function: http://www.boost.org/doc/libs/1_51_0/libs/graph/doc/write_graphml.html
It states that "The graph's type must be a model of VertexListGraph." which it described here: http://www.boost.org/doc/libs/1_51_0/libs/graph/doc/VertexListGraph.html
The problem is that
write_graphml
requires a VertexIndexMap in your graph and onlyadjacency_list
s withVertexList=vecS
have one created by default. You have to create one yourself if you uselistS
orsetS
.If you only need to use
setS
in yourOutEdgeList
you can simply use:If you must use
setS
for both then your program should be (based on this answer):