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 |
15271 |
DecisionManager::DecisionManager(context::Context* userContext) |
27 |
15271 |
: d_strategyCacheC(userContext) |
28 |
|
{ |
29 |
15271 |
} |
30 |
|
|
31 |
20558 |
void DecisionManager::presolve() |
32 |
|
{ |
33 |
20558 |
Trace("dec-manager") << "DecisionManager: presolve." << std::endl; |
34 |
|
// remove the strategies that are not in this user context |
35 |
41116 |
std::unordered_set<DecisionStrategy*> active; |
36 |
23406 |
for (DecisionStrategyList::const_iterator i = d_strategyCacheC.begin(); |
37 |
23406 |
i != d_strategyCacheC.end(); |
38 |
|
++i) |
39 |
|
{ |
40 |
2848 |
active.insert(*i); |
41 |
|
} |
42 |
20558 |
active.insert(d_strategyCache.begin(), d_strategyCache.end()); |
43 |
41116 |
std::map<StrategyId, std::vector<DecisionStrategy*> > tmp = d_reg_strategy; |
44 |
20558 |
d_reg_strategy.clear(); |
45 |
28894 |
for (std::pair<const StrategyId, std::vector<DecisionStrategy*> >& rs : tmp) |
46 |
|
{ |
47 |
17214 |
for (DecisionStrategy* ds : rs.second) |
48 |
|
{ |
49 |
8878 |
if (active.find(ds) != active.end()) |
50 |
|
{ |
51 |
|
// if its active, we keep it |
52 |
8687 |
d_reg_strategy[rs.first].push_back(ds); |
53 |
|
} |
54 |
|
} |
55 |
|
} |
56 |
20558 |
} |
57 |
|
|
58 |
20074 |
void DecisionManager::registerStrategy(StrategyId id, |
59 |
|
DecisionStrategy* ds, |
60 |
|
StrategyScope sscope) |
61 |
|
{ |
62 |
40148 |
Trace("dec-manager") << "DecisionManager: Register strategy : " |
63 |
20074 |
<< ds->identify() << ", id = " << id << std::endl; |
64 |
20074 |
ds->initialize(); |
65 |
20074 |
d_reg_strategy[id].push_back(ds); |
66 |
20074 |
if (sscope == STRAT_SCOPE_USER_CTX_DEPENDENT) |
67 |
|
{ |
68 |
|
// store it in the user-context-dependent list |
69 |
5241 |
d_strategyCacheC.push_back(ds); |
70 |
|
} |
71 |
14833 |
else if (sscope == STRAT_SCOPE_CTX_INDEPENDENT) |
72 |
|
{ |
73 |
|
// it is context independent |
74 |
14755 |
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 |
20074 |
} |
82 |
|
|
83 |
3476398 |
Node DecisionManager::getNextDecisionRequest() |
84 |
|
{ |
85 |
6952796 |
Trace("dec-manager-debug") |
86 |
3476398 |
<< "DecisionManager: Get next decision..." << std::endl; |
87 |
6299037 |
for (const std::pair<const StrategyId, std::vector<DecisionStrategy*> >& rs : |
88 |
3476398 |
d_reg_strategy) |
89 |
|
{ |
90 |
13384313 |
for (unsigned i = 0, size = rs.second.size(); i < size; i++) |
91 |
|
{ |
92 |
7085276 |
DecisionStrategy* ds = rs.second[i]; |
93 |
14094412 |
Node lit = ds->getNextDecisionRequest(); |
94 |
7085272 |
if (!lit.isNull()) |
95 |
|
{ |
96 |
152272 |
Trace("dec-manager") |
97 |
76136 |
<< "DecisionManager: -> literal " << lit << " decided by strategy " |
98 |
76136 |
<< ds->identify() << std::endl; |
99 |
76136 |
return lit; |
100 |
|
} |
101 |
14018272 |
Trace("dec-manager-debug") << "DecisionManager: " << ds->identify() |
102 |
7009136 |
<< " has no decisions." << std::endl; |
103 |
|
} |
104 |
|
} |
105 |
6800516 |
Trace("dec-manager-debug") |
106 |
3400258 |
<< "DecisionManager: -> no decisions." << std::endl; |
107 |
3400258 |
return Node::null(); |
108 |
|
} |
109 |
|
|
110 |
|
} // namespace theory |
111 |
31125 |
} // namespace cvc5 |