15 int max_depth,
const verti *vmap,
verti vmap_size )
17 vmap_(vmap), vmap_size_(vmap_size)
46 assert(num_vertices > 0);
49 std::vector<verti> unsolved;
50 unsolved.reserve(num_vertices);
51 for (std::size_t n = 0; n < num_vertices; ++n)
53 verti v = vertices[n];
56 unsolved.push_back(vertices[n]);
60 << unsolved.size() <<
" unsolved vertices..." << std::endl;
62 if (unsolved.empty())
return 0;
69 if (
max_depth_ > 0 && unsolved.size() < num_vertices)
72 << unsolved.size() <<
"..." << std::endl;
79 std::size_t old_d = subgame.
d();
81 std::size_t new_d = subgame.
d();
85 << old_d - new_d <<
" of "
86 << old_d <<
" priorities" << std::endl;
92 << unsolved.size() <<
"..." << std::endl;
93 std::vector<verti> submap;
94 std::unique_ptr<ParityGameSolver> subsolver;
100 pgsf_.
create(subgame, &submap[0], submap.size()) );
105 pgsf_.
create(subgame, &unsolved[0], unsolved.size()) );
107 subsolver->solve().swap(substrat);
109 if (substrat.empty())
return -1;
117 std::deque<verti> todo[2];
118 for (std::size_t n = 0; n < unsolved.size(); ++n)
121 verti v = unsolved[n];
123 todo[pl].push_back(v);
127 for (
int player = 0; player < 2; ++player)
138 const verti *vertex_map,
verti vertex_map_size )
141 vertex_map, vertex_map_size );
std::size_t verti
type used to number vertices
void merge_vertex_maps(ForwardIterator begin, ForwardIterator end, const verti *old_map, verti old_map_size)
void merge_strategies(std::vector< verti > &strategy, const std::vector< verti > &substrat, const std::vector< verti > &vertex_map)
void make_attractor_set(const ParityGame &game, ParityGame::Player player, SetT &vertices, StrategyT &strategy)
bool aborted()
Returns whether this instance has been aborted.
const int max_depth_
Maximum recursion depth.
ParityGameSolver * create(const ParityGame &game, const verti *vertex_map, verti vertex_map_size)
Return a new ComponentSolver instance.
ParityGameSolverFactory & pgsf_
Factory used to create subsolvers.
ComponentSolver(const ParityGame &game, ParityGameSolverFactory &pgsf, int max_depth, const verti *vmap=0, verti vmap_size=0)
const verti vmap_size_
Size of vertex map.
const int max_depth_
Max. recusion depth.
ParityGame::Strategy solve()
ParityGameSolverFactory & pgsf_
Solver factory to use.
DenseSet< verti > * winning_[2]
Resulting winning sets.
const verti * vmap_
Current vertex map.
int operator()(const verti *vertices, std::size_t num_vertices)
ParityGame::Strategy strategy_
Resulting strategy.
std::pair< iterator, bool > insert(const Key &k)
virtual ParityGameSolver * create(const ParityGame &game, const verti *vertex_map=NULL, verti vertex_map_size=0)=0
const ParityGame & game_
Game being solved.
void make_subgame(const ParityGame &game, ForwardIterator vertices_begin, ForwardIterator vertices_end, bool proper, StaticGraph::EdgeDirection edge_dir=StaticGraph::EDGE_NONE)
Player winner(const StrategyT &s, verti v) const
void compress_priorities(const verti cardinality[]=0, bool preserve_parity=true)
const StaticGraph & graph() const
std::vector< verti > Strategy
void deref() const
Decrement reference count and delete the object if it becomes zero.
void ref() const
Increment reference count.
int decompose_graph(const StaticGraph &graph, Callback &callback)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.