1 |
|
/****************************************************************************** |
2 |
|
* Top contributors (to current version): |
3 |
|
* Andrew Reynolds, Aina Niemetz |
4 |
|
* |
5 |
|
* This file is part of the cvc5 project. |
6 |
|
* |
7 |
|
* Copyright (c) 2009-2021 by the authors listed in the file AUTHORS |
8 |
|
* in the top-level source directory and their institutional affiliations. |
9 |
|
* All rights reserved. See the file COPYING in the top-level source |
10 |
|
* directory for licensing information. |
11 |
|
* **************************************************************************** |
12 |
|
* |
13 |
|
* Implementation of Decision manager, which manages all decision |
14 |
|
* strategies owned by theory solvers within TheoryEngine. |
15 |
|
*/ |
16 |
|
|
17 |
|
#include "theory/decision_manager.h" |
18 |
|
|
19 |
|
#include "theory/rewriter.h" |
20 |
|
|
21 |
|
using namespace cvc5::kind; |
22 |
|
|
23 |
|
namespace cvc5 { |
24 |
|
namespace theory { |
25 |
|
|
26 |
9917 |
DecisionManager::DecisionManager(context::Context* userContext) |
27 |
9917 |
: d_strategyCacheC(userContext) |
28 |
|
{ |
29 |
9917 |
} |
30 |
|
|
31 |
15241 |
void DecisionManager::presolve() |
32 |
|
{ |
33 |
15241 |
Trace("dec-manager") << "DecisionManager: presolve." << std::endl; |
34 |
|
// remove the strategies that are not in this user context |
35 |
30482 |
std::unordered_set<DecisionStrategy*> active; |
36 |
17589 |
for (DecisionStrategyList::const_iterator i = d_strategyCacheC.begin(); |
37 |
17589 |
i != d_strategyCacheC.end(); |
38 |
|
++i) |
39 |
|
{ |
40 |
2348 |
active.insert(*i); |
41 |
|
} |
42 |
15241 |
active.insert(d_strategyCache.begin(), d_strategyCache.end()); |
43 |
30482 |
std::map<StrategyId, std::vector<DecisionStrategy*> > tmp = d_reg_strategy; |
44 |
15241 |
d_reg_strategy.clear(); |
45 |
23102 |
for (std::pair<const StrategyId, std::vector<DecisionStrategy*> >& rs : tmp) |
46 |
|
{ |
47 |
16234 |
for (DecisionStrategy* ds : rs.second) |
48 |
|
{ |
49 |
8373 |
if (active.find(ds) != active.end()) |
50 |
|
{ |
51 |
|
// if its active, we keep it |
52 |
8184 |
d_reg_strategy[rs.first].push_back(ds); |
53 |
|
} |
54 |
|
} |
55 |
|
} |
56 |
15241 |
} |
57 |
|
|
58 |
13936 |
void DecisionManager::registerStrategy(StrategyId id, |
59 |
|
DecisionStrategy* ds, |
60 |
|
StrategyScope sscope) |
61 |
|
{ |
62 |
27872 |
Trace("dec-manager") << "DecisionManager: Register strategy : " |
63 |
13936 |
<< ds->identify() << ", id = " << id << std::endl; |
64 |
13936 |
ds->initialize(); |
65 |
13936 |
d_reg_strategy[id].push_back(ds); |
66 |
13936 |
if (sscope == STRAT_SCOPE_USER_CTX_DEPENDENT) |
67 |
|
{ |
68 |
|
// store it in the user-context-dependent list |
69 |
4417 |
d_strategyCacheC.push_back(ds); |
70 |
|
} |
71 |
9519 |
else if (sscope == STRAT_SCOPE_CTX_INDEPENDENT) |
72 |
|
{ |
73 |
|
// it is context independent |
74 |
9441 |
d_strategyCache.insert(ds); |
75 |
|
} |
76 |
|
else |
77 |
|
{ |
78 |
|
// it is local to this call, we don't cache it |
79 |
78 |
Assert(sscope == STRAT_SCOPE_LOCAL_SOLVE); |
80 |
|
} |
81 |
13936 |
} |
82 |
|
|
83 |
2937328 |
Node DecisionManager::getNextDecisionRequest() |
84 |
|
{ |
85 |
5874656 |
Trace("dec-manager-debug") |
86 |
2937328 |
<< "DecisionManager: Get next decision..." << std::endl; |
87 |
4367818 |
for (const std::pair<const StrategyId, std::vector<DecisionStrategy*> >& rs : |
88 |
2937328 |
d_reg_strategy) |
89 |
|
{ |
90 |
9519346 |
for (unsigned i = 0, size = rs.second.size(); i < size; i++) |
91 |
|
{ |
92 |
5151528 |
DecisionStrategy* ds = rs.second[i]; |
93 |
10240728 |
Node lit = ds->getNextDecisionRequest(); |
94 |
5151526 |
if (!lit.isNull()) |
95 |
|
{ |
96 |
124652 |
Trace("dec-manager") |
97 |
62326 |
<< "DecisionManager: -> literal " << lit << " decided by strategy " |
98 |
62326 |
<< ds->identify() << std::endl; |
99 |
62326 |
return lit; |
100 |
|
} |
101 |
10178400 |
Trace("dec-manager-debug") << "DecisionManager: " << ds->identify() |
102 |
5089200 |
<< " has no decisions." << std::endl; |
103 |
|
} |
104 |
|
} |
105 |
5750000 |
Trace("dec-manager-debug") |
106 |
2875000 |
<< "DecisionManager: -> no decisions." << std::endl; |
107 |
2875000 |
return Node::null(); |
108 |
|
} |
109 |
|
|
110 |
|
} // namespace theory |
111 |
29517 |
} // namespace cvc5 |