Повысьте пример read_graphml - PullRequest
2 голосов
/ 29 июля 2011

Я пытаюсь создать простой загрузчик 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&)’

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

Ответы [ 2 ]

1 голос
/ 15 июня 2012

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

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.

1 голос
/ 12 декабря 2011

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

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

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

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

...