Мое настоящее намерение - использовать 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);