mCRL2
Loading...
Searching...
No Matches
pbesreach_partial.h
Go to the documentation of this file.
1// Author(s): Wieger Wesselink, Jeroen Keiren
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9
10#ifndef MCRL2_PBES_PBESREACH_PARTIAL_H
11#define MCRL2_PBES_PBESREACH_PARTIAL_H
12
13#ifdef MCRL2_ENABLE_SYLVAN
14
15#include <sylvan_ldd.hpp>
16
17#include "mcrl2/pbes/pbesreach.h"
18#include "mcrl2/pbes/symbolic_pbessolve.h"
19
20namespace mcrl2::pbes_system {
21
22/// Variant of pbesreach_algorithm that performs partial solving during
23/// the computation of the symbolic parity game
24class pbesreach_algorithm_partial : public pbesreach_algorithm
25{
26public:
27
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))
31 {}
32
33 void on_end_while_loop() override
34 {
35 time_exploring += explore_timer.seconds();
36 ++iteration_count;
37
38 if (time_solving * 10 < (time_solving + time_exploring) || m_options.aggressive)
39 {
40 mCRL2log(log::verbose) << "start partial solving\n";
41 stopwatch timer;
42
43 ldd V = union_(m_visited, m_todo);
44 symbolic_parity_game G(pbes(),
45 summand_groups(),
46 data_index(),
47 V,
48 m_options.no_relprod,
49 m_options.chaining,
50 m_options.compute_strategy);
51 G.print_information();
52 symbolic_pbessolve_algorithm solver(G, false, m_options.compute_strategy);
53
54 if (m_options.solve_strategy == 1)
55 {
56 m_partial_solution = solver.detect_solitair_cycles(m_initial_vertex,
57 V,
58 m_todo,
59 false,
60 m_deadlocks,
61 m_partial_solution);
62 }
63 else if (m_options.solve_strategy == 2)
64 {
65 m_partial_solution = solver.detect_solitair_cycles(m_initial_vertex,
66 V,
67 m_todo,
68 true,
69 m_deadlocks,
70 m_partial_solution);
71 }
72 else if (m_options.solve_strategy == 3)
73 {
74 m_partial_solution = solver.detect_forced_cycles(m_initial_vertex,
75 V,
76 m_todo,
77 false,
78 m_deadlocks,
79 m_partial_solution);
80 }
81 else if (m_options.solve_strategy == 4)
82 {
83 m_partial_solution = solver.detect_forced_cycles(m_initial_vertex,
84 V,
85 m_todo,
86 true,
87 m_deadlocks,
88 m_partial_solution);
89 }
90 else if (m_options.solve_strategy == 5)
91 {
92 std::tie(m_partial_solution.winning[0], m_partial_solution.winning[1])
93 = solver.detect_fatal_attractors(m_initial_vertex,
94 V,
95 m_todo,
96 false,
97 m_deadlocks,
98 m_partial_solution.winning[0],
99 m_partial_solution.winning[1]);
100 }
101 else if (m_options.solve_strategy == 6)
102 {
103 std::tie(m_partial_solution.winning[0], m_partial_solution.winning[1])
104 = solver.detect_fatal_attractors(m_initial_vertex,
105 V,
106 m_todo,
107 true,
108 m_deadlocks,
109 m_partial_solution.winning[0],
110 m_partial_solution.winning[1]);
111 }
112 else if (m_options.solve_strategy == 7)
113 {
114 m_partial_solution
115 = solver.partial_solve(m_initial_vertex, V, m_todo, m_deadlocks, m_partial_solution);
116 }
117
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";
122
123 time_solving += timer.seconds();
124 }
125
126 explore_timer.reset();
127 }
128
129 bool solution_found() const override
130 {
131 return m_partial_solution.solution_found(m_initial_vertex);
132 }
133
134 symbolic_solution_t partial_solution() const override {
135 return m_partial_solution;
136 }
137
138private:
139 /// Partial solution that has already been computed.
140 symbolic_solution_t m_partial_solution;
141 std::size_t iteration_count = 0;
142
143 double time_solving = 0.0;
144 double time_exploring = 0.0;
145 stopwatch explore_timer;
146};
147
148} // namespace mcrl2::pbes_system
149
150#endif // MCRL2_ENABLE_SYLVAN
151
152#endif // MCRL2_PBES_PBESREACH_PARTIAL_H