Question

with continuation to my previous question HERE, is it possible to define/initialize a filtered_graph over existing filtered graph. for example,

  class A{
  FilteredGraphType_t fg // it is a typedef

  // constructor
  template < typename ... , typename fil_graph >
  A ( ..init parameters.. , fil_graph& FG)    // note this. 
   {

      predicate  filter3 ( ... );   // defined predicate 

      // define new filtered_graph here in constructor
      FilteredGraphType_t  newFG ( boost::make_filtered_graph( FG, filter3)  .. // error

       write_graphviz(std::cout, newFG ); /// error 

   }
   };

Can i do something like this?

 FilteredGraphType fg3( fg3, filter3) ;  // call filter and predicate on itself
  OR 
  FilteredGraphType fg4( fg3, filter3) ;  ( new filtered graph fg4 filtering over fg3 

I get compiler errors when I try to create a new filter3 over existing filtered graph....However, I can define a new filter over original graph..

Also how do I call a predicate --> filter3 on FG obtained as a constructor parameter (by reference)

Was it helpful?

Solution

  1. Yes, it is completely possible to use a filtered graph on top of filtered graph. It should probably have the same efficiency as combining the filters on top of the original graph.

  2. Remember, filtered_graph<G,EFG> is a different type than the type of filtered_graph<F,EFF>. Your compiler errors likely happen because you use the same FilteredGraphType_t in both locations of your code.

The correct code could look like:

Graph g;

typedef filtered_graph<G,EPred> FilteredGraphType_t;    
FilteredGraphType_t fg(g, pred);

typedef filtered_graph<FilteredGraphType,SomePred> DeepFilteredGraphType_t;   
DeepFilteredGraphType_t dfg(fg, somePred);
  1. AFAIK, there is no documented way to access the "original" predicates used to form a filtered graph. Undocumented way is to use the internals of the Boost code as follows:

    FilteredGraphType_t fg = ...

    EPred edgeFilter = fg.m_edge_pred;

    FilteredGraphType_t::edge_descriptor ed = ... bool edge_ok = edgeFilter(ed); //same as edgeFilter.operator()(ed);

It seems the recommended way would be to have your filter3 predicate as a member of your class A.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top