повысить график скопировать отфильтрованный_граф - PullRequest
1 голос
/ 22 апреля 2019

Мое настоящее намерение - использовать mcgregor_common_subgraphs, чтобы найти некоторые порожденные частичные подграфы.Но это занимает слишком много времени, чтобы сравнить маленькие графики.Поэтому вместо сравнения целых графов я хочу отфильтровать подмножество сопоставимых вершин и ребер.Затем найдите подграфы между ними.

Поэтому я использую filtered_graph с предикатами вершин и ребер для обоих этих графиков.И передайте отфильтрованный график на mcgregor_common_subgraphs.Но он жалуется

error: use of deleted function ‘boost::iterators::filter_iterator<bya::util::isomorphism::directed_graph::vertex_filter_predicate, boost::range_detail::integer_iterator<long unsigned int> >& boost::iterators::filter_iterator<bya::util::isomorphism::directed_graph::vertex_filter_predicate, boost::range_detail::integer_iterator<long unsigned int> >::operator=(const boost::iterators::filter_iterator<bya::util::isomorphism::directed_graph::vertex_filter_predicate, boost::range_detail::integer_iterator<long unsigned int> >&)’

Поэтому я планировал скопировать отфильтрованный график в новый график с copy_graph.Но он жалуется на то, что по умолчанию для предиката вершины vertex_filter_predicate.

error: no matching function for call to ‘bya::util::isomorphism::directed_graph::vertex_filter_predicate::vertex_filter_predicate()’

нет конструктора по умолчанию. Однако мой предикат вершины и ребра переводит const reference в исходный граф.Поэтому я не могу добавить пустой конструктор по умолчанию.Я искал в форсированной документации, но не нашел ни одного примера копирования filtered_graph.Каково решение ?Кроме того, зачем copy_graph требуется копировать предикаты?

struct directed_graph{
    typedef boost::adjacency_list<boost::setS, boost::vecS, boost::bidirectionalS, vertex_data, edge_data> graph_type;
    graph_type _graph;
    // ...
};

У меня есть структура ориентированного графа, внутри которой есть предикаты и компараторы эквивалентности.И маленькие, и большие являются экземплярами directed_graph.

directed_graph::edge_filter_predicate   edge_filter_small  (small._graph, allowed_vertex_ids), edge_filter_large  (large._graph, allowed_vertex_ids);
directed_graph::vertex_filter_predicate vertex_filter_small(small._graph, allowed_vertex_ids), vertex_filter_large(large._graph, allowed_vertex_ids);

boost::filtered_graph<directed_graph::graph_type, directed_graph::edge_filter_predicate, directed_graph::vertex_filter_predicate> filtered_small_view(small._graph, edge_filter_small, vertex_filter_small);
boost::filtered_graph<directed_graph::graph_type, directed_graph::edge_filter_predicate, directed_graph::vertex_filter_predicate> filtered_large_view(large._graph, edge_filter_large, vertex_filter_large);

directed_graph::graph_type filtered_small;
boost::copy_graph(filtered_small_view, filtered_small);
...