10#ifndef MCRL2_PBES_PBESREACH_PARTIAL_H
11#define MCRL2_PBES_PBESREACH_PARTIAL_H
13#ifdef MCRL2_ENABLE_SYLVAN
15#include <sylvan_ldd.hpp>
17#include "mcrl2/pbes/pbesreach.h"
18#include "mcrl2/pbes/symbolic_pbessolve.h"
20namespace mcrl2::pbes_system {
24class pbesreach_algorithm_partial :
public pbesreach_algorithm
28 pbesreach_algorithm_partial(
const srf_pbes& pbesspec,
const symbolic_reachability_options& options_)
29 : pbesreach_algorithm(pbesspec, options_),
30 m_partial_solution(symbolic_solution_t(options_.compute_strategy))
33 void on_end_while_loop() override
35 time_exploring += explore_timer.seconds();
38 if (time_solving * 10 < (time_solving + time_exploring) || m_options.aggressive)
40 mCRL2log(log::verbose) <<
"start partial solving\n";
43 ldd V = union_(m_visited, m_todo);
44 symbolic_parity_game G(pbes(),
50 m_options.compute_strategy);
51 G.print_information();
52 symbolic_pbessolve_algorithm solver(G,
false, m_options.compute_strategy);
54 if (m_options.solve_strategy == 1)
56 m_partial_solution = solver.detect_solitair_cycles(m_initial_vertex,
63 else if (m_options.solve_strategy == 2)
65 m_partial_solution = solver.detect_solitair_cycles(m_initial_vertex,
72 else if (m_options.solve_strategy == 3)
74 m_partial_solution = solver.detect_forced_cycles(m_initial_vertex,
81 else if (m_options.solve_strategy == 4)
83 m_partial_solution = solver.detect_forced_cycles(m_initial_vertex,
90 else if (m_options.solve_strategy == 5)
92 std::tie(m_partial_solution.winning[0], m_partial_solution.winning[1])
93 = solver.detect_fatal_attractors(m_initial_vertex,
98 m_partial_solution.winning[0],
99 m_partial_solution.winning[1]);
101 else if (m_options.solve_strategy == 6)
103 std::tie(m_partial_solution.winning[0], m_partial_solution.winning[1])
104 = solver.detect_fatal_attractors(m_initial_vertex,
109 m_partial_solution.winning[0],
110 m_partial_solution.winning[1]);
112 else if (m_options.solve_strategy == 7)
115 = solver.partial_solve(m_initial_vertex, V, m_todo, m_deadlocks, m_partial_solution);
118 mCRL2log(log::verbose) <<
"found solution for" << std::setw(12) << satcount(m_partial_solution.winning[0]) + satcount(m_partial_solution.winning[1])
119 <<
" BES equations" << std::endl;
120 mCRL2log(log::verbose) <<
"finished partial solving (time = " << std::setprecision(2) << std::fixed
121 << timer.seconds() <<
"s)\n";
123 time_solving += timer.seconds();
126 explore_timer.reset();
129 bool solution_found()
const override
131 return m_partial_solution.solution_found(m_initial_vertex);
134 symbolic_solution_t partial_solution()
const override {
135 return m_partial_solution;
140 symbolic_solution_t m_partial_solution;
141 std::size_t iteration_count = 0;
143 double time_solving = 0.0;
144 double time_exploring = 0.0;
145 stopwatch explore_timer;