Пример форсирования read_graphml

Я пытаюсь создать простой загрузчик GraphML, используя библиотеки BOOST. У меня есть файл GraphML, и я хочу загрузить его в структуру списка повышенной смежности. Граф является направленным, и единственная информация, которую он хранит, — это имена узлов (0,1,2,...) и ребра от одного узла к другому. Что я сделал:

void loadHierarchy(){
    // ...
    std::ifstream inFile;
    inFile.open("ext.gml", std::ifstream::in);

    typedef boost::adjacency_list<> Graph;
    Graph g;

    boost::read_graphml(inFile, g);
    // ...
}

Мне не нужно использовать какие-либо свойства, просто чтобы сохранить всю информацию о графе в списке смежности.

Ошибки, которые я получаю, следующие:

ошибка: неверная инициализация ссылки типа ‘boost::mutate_graph&’ из выражения типа ‘loadHierarchy()::Graph’

/usr/include/boost/graph/graphml.hpp:194: ошибка: при передаче аргумента 2 из ‘void boost::read_graphml(std::istream&, boost::mutate_graph&)’

Это должно быть так просто, но, видимо, это не так.


person John Smith    schedule 29.07.2011    source источник


Ответы (2)


Я думаю, вам следует использовать версию read_graphml() с тремя параметрами, даже если вам не нужно устанавливать какие-либо свойства. Версия с двумя параметрами, которую вы хотите использовать, является (к сожалению, раскрытой) внутренней деталью библиотеки.

Итак, я предлагаю вам попробовать что-то вроде этого:

boost::dynamic_properties dp;
boost::read_graphml(inFile, g, dp);

Я надеюсь, что это помогло.

person kispaljr    schedule 12.12.2011

после более тщательного исследования я пришел к выводу, что на самом деле повезло, что раскрыта версия boost::read_graphml с двумя параметрами. 3 параметра выглядят следующим образом:

template<typename MutableGraph>
void
read_graphml(std::istream& in, MutableGraph& g, dynamic_properties& dp)
{
    mutate_graph_impl<MutableGraph> mg(g,dp);
    read_graphml(in, mg);
}

Существует особенно хороший редактор GraphML, а именно yEd, который выводит искаженный файл GraphML, например, он имеет такие теги, как

<key for="node" id="d6" yfiles.type="nodegraphics"/>

в этом. Вышеприведенный ключ должен содержать attr.type="string", но его нет. Вместо этого у него есть yfiles.type, который, похоже, является расширением, которое использует yEd (к сожалению). mutate_graph_impl по умолчанию не может справиться с этим. mutate_graph_impl должен быть унаследован вами, и вам нужно будет напрямую вызвать 2-ю версию read_graphml с вашей собственной реализацией mutate_graph_impl, переданной ей. В вашей собственной реализации вам нужно будет переопределить mutate_graph_impl

virtual void
    set_vertex_property(const std::string& name, any vertex, const std::string& value, const std::string& value_type)

для обработки ключа с неопределенным attr.type.

person EddieBytes    schedule 15.06.2012